Dockerfile を使用したカスタムイメージの構築の実装

Dockerfile を使用したカスタムイメージの構築の実装

序文

前回の記事では、docker でコンテナを実行するために使用するイメージを dockerhub からリモートで取得しましたが、独自のイメージを構築することはできるでしょうか?答えはイエスです。Dockerfile を通じて独自のイメージを構築できます。Dockerfile 自体は難しくなく、単なるコマンドの集まりです。難しいと感じるのは、Dockerfile のこれらのコマンドを使用して、より高いレベルの観点から独自のイメージをより適切に構築する方法です。見てみましょう。

Dockerfile の紹介

Dockerfile は実際にはファイルです。ファイルの名前は Dockerfile です。もちろん、この名前を使用して、イメージをビルドするときに名前を指定することもできます。ただし、一般的には Dockerfile を使用すると言われています。Dockerfile の主な機能は、カスタム イメージのビルドを支援することであるため、Dockerfile はイメージ ビルド ファイルまたはイメージ記述ファイルとも呼ばれます。

Dockerhub には基本的にすべてのサービスを満たした公式イメージが多数提供されているのに、なぜイメージをカスタマイズする必要があるのか​​と疑問に思う友人もいるかもしれません。 Dockerfile を使用して独自のイメージを構築することで、独自のアプリケーションをイメージにパッケージ化でき、そのイメージを実行すると、カスタマイズされた機能の一部を使用してサービスを直接実行できます。

例えば、dockerhubからcentos7イメージをダウンロードする場合、公式イメージにはvim機能がありません。そのため、公式centosイメージをベースに独自のイメージをビルドして、centosコンテナの実行時にvimを自動的にインストールすることができます。

Dockerfileはイメージプロセスを構築する

Dockerfile イメージ構築プロセスを紹介する前に、重要な概念であるコンテキスト ディレクトリについて知っておく必要があります。Dockerfile が配置されているディレクトリはコンテキスト ディレクトリと呼ばれます。

Docker は CS アーキテクチャです。Dockerfile を使用してイメージをビルドするために使用されるコマンドは docker build です。コマンドがクライアントのオペレーティング システムで実行されると、docker エンジンは Dockerfile が配置されているディレクトリ内のすべてのデータをパッケージ化し、docker サーバーに送信します。したがって、Dockerfile が配置されているディレクトリには、現在のイメージをビルドするために必要なファイルのみが含まれている必要があります。サーバーが Dockerfile 内のコマンド行を実行すると、docker キャッシュに一時イメージが生成されます (一時イメージを生成しない場合は、docker build の後に --no_cache パラメータを追加します)。最後の行まで実行すると、最終イメージが取得されます。次の図に示すように:

Dockerfile の使用

まず、イメージをビルドするための Dockerfile のコマンドについて説明します。

# コマンド形式: docker build -t イメージ名: タグ Dockerfile が配置されているパス docker build -t mycentos:01 .

以下は Dockerfile でよく使用されるコマンドの一部です。Dockerfile 内のすべてのコマンドは大文字で始まることに注意してください。

FROM イメージ名: タグ: Dockerfile の最初のコマンド。どのイメージに基づいてイメージを構築するかを示します。カスタム イメージがビルドされますが、このカスタム イメージも公式のベース イメージ上にビルドされます。

# Dockerファイル
FROM centos:7 # は、イメージが centos7 に基づいて構築されていることを示します。

RUN: イメージをビルドするときに実行する必要があるコマンド。その後にシェル コマンドを続けることができます。

# 最初の構文形式 RUN yum install -y vim

# 2番目の構文形式 RUN ["yum", "install", "-y", "vim"]

EXPOSE: 外部に公開されるポート。イメージ内でポートが公開されている場合にのみ、docker run コマンドを実行するときに -p パラメータを指定できます。

EXPOSE 9000 # はポート9000を公開することを示します

WORKDIR: コンテナに入るときのパスを指定します。パスは複数記述できます。コンテナ内に指定パスがない場合はパスが作成されます。パスは複数記述できます。次のパスは前のパスを基準とした相対パスです。

ワークディレクトリ /データ
ワークディレクトリ /a

COPY: コンテキスト ディレクトリ内の指定されたファイルをイメージ内の指定されたディレクトリにコピーします。

# コマンド形式: COPY 元のパス (絶対パスまたは相対パス) コンテナ内のターゲットパス# 構文形式 1 COPY /root/app/aa.txt /data 

# 構文形式 2 COPY ["<src>", ..., "<dest>"] --- 構文形式 2

ADD: コンテキスト ディレクトリ内の指定されたファイルをミラーの指定されたディレクトリにコピーします。URL を識別し、URL に対応する圧縮パッケージを自動的にダウンロードできます。また、ローカルの圧縮パッケージをミラーの指定されたディレクトリにコピーし、自動的に解凍することもできます。

#コンテキストディレクトリ内の指定されたファイルをミラーの指定されたディレクトリにコピーします ADD bb.txt /data

# URL を自動的に識別し、コンテナ内の指定されたディレクトリにダウンロードします ADD https://www.python.org/ftp/python/3.9.1/Python-3.9.1.tgz /data

# 圧縮されたパッケージは指定されたディレクトリに自動的に解凍されます ADD xxx.tar /data

ENTRYPOINT: コンテナの起動時に実行するコマンドを指定するために使用されます。CMD と同様に、コンテナの起動後の最初のコマンドを設定するためによく使用されます。複数のコマンドを記述でき、上書きすることもできます。

# ENTRYPOINT シェル スクリプトまたは ENTRYPOINT ["tail", "-f"...]
エントリポイント tail -f bb.txt
# 上書き docker run --entrypoint=cat mycentos:08 /data/bb.txt

CMD: 最後の CMD が標準として使用されます。上書き可能で、ENTRYPOINT にパラメータを渡すことができ、ENTRYPOINT と組み合わせて使用​​できます (json 配列の形式でのみ使用できます)

# 最後のCMDのみ実行
コマンド ls $BASEDIR
CMD 猫 bb.txt

# 上書き可能。docker run の後のコマンドは、Dockerfile の CMD の後のコマンドを直接上書きします。docker run mycentos:09 ls /data

# ENTRYPOINT と組み合わせて使用​​して、ENTRYPOINT にパラメータを渡します。パラメータは動的に渡すことができます。たとえば、プロジェクト パスは変更されませんが、プロジェクト名は変更されます。この 2 つを組み合わせて使用​​する場合は、json 配列形式を使用する必要があることに注意してください。
エントリポイント ["ls", "/data"]
コマンド [/data/bb"]

または

docker 実行 mycentos:10 /data/bb/aa

Dockerfile でカスタムイメージを構築する実装についてはこれで終了です。Dockerfile でイメージを構築する方法については、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Dockerfile ファイルの書き込みとイメージ構築コマンドの分析
  • Dockerfileを使用してDockerイメージを構築する
  • Dockerfileを使用してDockerイメージを構築する手順
  • Dockerfile に基づいて Tomcat イメージを構築する方法
  • Dockerfile を使用して Docker でイメージを構築する方法
  • Dockerfile を使用して nginx イメージを構築する例
  • Dockerfileを使用してイメージを構築する方法
  • dockerfile命令を使用してdockerイメージを構築するためのサンプルコード

<<:  IE8互換表示(IE7モード)とスタンドアロンIE7の違いの詳細な説明

>>:  CSS は Alibaba ベクター ライブラリを使用して、対応する位置に見栄えの良いアイコン効果をすばやく追加します (サンプル コード)

推薦する

MySQLでデータベースデータ保存ディレクトリを変更する方法

序文MySQL データベースのデフォルトのデータベース ファイルは /var/lib/mysql に...

Linux でシェル スクリプトを使用して jar パッケージ プロジェクトを展開するための完全な手順

1. JDKをインストールする コンピュータの動作桁を確認します。 uname -ar 2017 x...

MySQL 5.7.18 無料インストールバージョンの設定チュートリアル

MySQL 5.7.18 無料インストール版のインストールチュートリアルMySQL は現在、世界で最...

Dockerを使用してphabricatorをインストールする方法

ここでは Ubuntu 16.04 システムを使用しています。 dockerを使用したインストールh...

Vue で Axios カプセル化を使用するための完全なチュートリアル

序文現在、プロジェクトでは、Axios ライブラリが HTTP インターフェース リクエストによく使...

HTML、CSS、JSコメントの標準的な使用法の概要

必要なコメントを追加することは、責任感と道徳心のあるフロントエンド開発者が持つべき良い習慣であり、コ...

JavaScript はフロントエンド Web ページでカウントダウンを実装します

ネイティブJavaScriptを使用してカウントダウンを簡単に実装します。参考までに、具体的な内容は...

MySQL 8で追加された3つの新しいインデックスは、非表示、降順、関数です。

目次MySQL 8 の隠しインデックス、降順インデックス、関数インデックス1. 隠しインデックス1....

MySQL テーブル名の大文字と小文字の選択

目次1. 大文字と小文字の区別を決定するパラメータ2. パラメータ変更に関する注意事項要約: 1. ...

Linux での vi (vim) の新しい使い方のまとめ

私は数年間 vi エディタを使ってきましたが、実用的な用途で使ったことはありませんでした。今日 Py...

Docker で Maven プロジェクトをより速くビルドする

目次I. 概要2. 従来の多段階イメージ構築3. Buildkitを使用してイメージをビルドする4....

VMware vSphere6.0 サーバー仮想化の展開とインストールの図 (詳細な手順)

1. VMware vSphere 導入の早期計画のポイント1. vSphereの利点(わずかに)...

Reactの親コンポーネントと子コンポーネント間のデータ転送の詳細な説明

目次1. 親コンポーネントが子コンポーネントにデータを渡す1.1. 親コンポーネントコード1.2. ...

Win10環境にMysql5.7.23をインストールする際の問題点と落とし穴

たくさんのチュートリアルを読みましたが、うまくインストールできませんでした。しばらく試行錯誤した後、...

JS の querySelector メソッドと getElementById メソッドの違い

目次1. 概要1.1 querySelector() と querySelectorAll() の使...