こんにちは、私は山を見ています。
この記事は、並行プログラミングネットワークの翻訳招待からのものであり、翻訳はJakobJenkovによる「Dockerチュートリアル」の2番目の記事です。
Dockerfileには、Dockerイメージをビルドする方法に関する一連の手順が含まれていdocker build
ます。コマンドを使用してDockerfileファイルを実行することでDockerイメージをビルドできます。この記事では、Dockerfileを作成してDockerイメージをビルドする方法について説明します。
Dockerfileの利点
Dockerfileファイルは、Dockerイメージを構築する方法を書面で説明しています。Dockerイメージには通常、次のコンテンツが含まれています。
- まず、基本的なDockerイメージが必要であり、この基本的なDockerイメージ上に独自のDockerイメージを構築します。
- Dockerイメージにインストールする必要のあるツールとアプリケーションのセット。
- Dockerイメージにコピーする必要のあるファイルのセット(構成ファイルなど)。
- ファイアウォールなどでネットワーク(TPC / UDP)ポートを開く必要がある場合があります。
- 等々。。。
まず、これらを書面で説明するDockerfileファイルでは、オペレーティングシステムの要件、インストールする必要のあるアプリケーション、インストールする必要のあるファイルなど、アプリケーションのインストール方法を具体的に覚えておく必要がないことを意味します。割り当て、開く必要のあるネットワークポートなど。これらの内容は、Dockerfileに記録されます。
さらに、Dockerfileファイルを使用してDockerイメージを構築することにより、これらの面倒でエラーが発生しやすいタスクを手動で実行する必要がありません。Dockerはこれらのことを自動的に、シンプルに、高速に、そして間違いを犯しにくいものにします。
第三に、Dockerfileを他の人と共有するのは簡単で、他の人が自分でDockerイメージを構築できます。
第4に、DockerfileはGitなどのバージョン管理者に簡単に保存できるため、Dockerfileの変更レコード(サーバー、アプリケーション構成)を追跡できます。バージョン管理者は、Dockerfileなどでの共同作業やDockerfileの共有を容易にすることもできます。
Dockerfile構造
Dockerfileには一連の命令が含まれており、各命令は、コマンドライン実行可能ファイルと同様に、コマンドとパラメーターで構成されています。Dockerfileの簡単な例を次に示します。
# 基础镜像
FROM ubuntu:latest
# 这里可以有更多安装软件和复制文件到镜像中的说明。
COPY /myapp/target/myapp.jar /myapp/myapp.jar
# 在Docker容器中执行的命令。
CMD echo Starting Docker Container
Dockerベースイメージ
Dockerイメージはレイヤーで構成され、各レイヤーは最終的なDockerイメージにコンテンツを追加します。各レイヤーは実際には個別のDockerイメージであるため、Dockerイメージは1つ以上のレイヤーイメージで構成され、その上に独自のレイヤーを追加できます。
Dockerfileを介して独自のDockerイメージを指定する場合、通常はDockerベースイメージから開始します。これは、独自のDockerイメージを構築できるもう1つのDockerイメージです。このDockerベースイメージ自体にも複数のレイヤーが含まれている場合があり、別のベースイメージの上に構築されます。
From
次のセクションで説明するように、コマンドを使用してDockerイメージをDockerfileのベースイメージとして指定できます。
メンテナー
MAINTAINER
このコマンドは、Dockerfileを誰が保守しているかを示すために使用されます。といった:
MAINTAINER Joe Blocks <[email protected]>
MAINTAINER
このタイプの情報はGitまたは他の場所に保存されるため、コマンドは一般的に使用されません。
から
FROM
このコマンドは、Dockerベースイメージを指定するために使用されます。元のLinuxイメージから開始する場合は、次のコマンドを使用できます。
# 基础镜像
FROM ubuntu:latest
CMD
CMD
このコマンドは、Dockerコンテナを起動するために実行する必要のあるコマンドを指定するために使用されます。コンテナは、このDockerfileに基づいて構築されたDockerイメージです。Dockerfileの例を次に示しCMD
ます。
CMD echo Docker container started.
この例では、「Dockerコンテナが開始されました」というテキスト行が出力されます。
次のCMD
例は、Javaアプリケーションを起動することです。
CMD java -cp /myapp/myapp.jar com.jenkov.myapp.MainClass arg1 arg2 arg3
コピー
COPY
このコマンドは、1つ以上のファイルをホスト(DockerfileファイルからDockerイメージを構築するマシン)からDockerイメージにコピーします。コピーできるコンテンツには、ファイルまたはディレクトリが含まれます。次に例を示します。
COPY /myapp/target/myapp.jar /myapp/myapp.jar
この例は、ホストの/myapp/target/myapp.jarファイルをDockerの進行中の/myapp/myapp.jarファイルにコピーすることです。最初のパラメーターはホストパス(ソースパス)であり、2番目のパラメーターはDockerイメージのパス(移動先)です。
次のように、ディレクトリをDockerイメージにコピーすることもできます。
COPY /myapp/config/prod /myapp/config
この例では、ホストの/ myapp / config / prodディレクトリをDockerイメージの/ myapp / configディレクトリにコピーします。
次のように、Dockerイメージ内のディレクトリに複数のファイルをコピーすることもできます。
COPY /myapp/config/prod/conf1.cfg /myapp/config/prod/conf2.cfg /myapp/config/
この例では、ホストの/myapp/config/prod/conf1.cfgファイルと/myapp/conig/prod/conf2.cfgファイルをDockerイメージの/ myapp / config /ディレクトリにコピーします。ターゲットディレクトリが機能するには、/(スラッシュ)で終わる必要があることに注意してください。
追加
ADD
コマンドはコマンドCOPY
と同じように機能しますが、いくつかの小さな違いがあります。
ADD
コマンドは、TARファイルをDockerイメージにコピーして抽出できます。ADD
コマンドはHTTP経由でファイルをダウンロードし、Dockerイメージにコピーできます。
ここではいくつかの例を示します。
ADD myapp.tar /myapp/
この例では、指定したTARファイルを解凍してDockerイメージの/ myapp /ディレクトリに抽出します。
別の例を次に示します。
ADD http://jenkov.com/myapp.jar /myapp/
ENV
ENV
このコマンドは、Dockerイメージに環境変数を設定するためのものです。この環境変数を使用しCMD
て、Dockerイメージ内でアプリケーションを起動するようにコマンドを実行できます。例えば:
ENV MY_VAR 123
この例では、環境変数MY_VAR
を値123に設定します。
RUN
RUN
Dockerイメージでコマンドライン命令を実行できます。実行時間はDockerイメージの構築プロセス中なので、RUN
コマンドは1回だけ実行されます。RUN
コマンドを使用して、Dockerイメージにアプリケーションをインストールしたり、ファイルを抽出したり、その他のコマンドライン関数を実行したりできます。これらの操作は、Dockerイメージを後で使用するために1回だけ実行する必要があります。
RUN apt-get install some-needed-app
ARG
ARG
このコマンドを使用すると、Dockerfileを介してDockerイメージを構築するときに、コマンドパラメーターを介してDockerに渡すことができるパラメーターを定義できます。といった:
ARG tcpPort
実行時にはdocker build
ドッカーイメージを構築するためにDockerfileを実行するコマンドを、次のように指定することができますtcpPort
次のようなパラメータを、
docker build --build-arg tcpPort=8080 .
--build-arg
後者tcpPort=8080
はtcpPort
パラメータの値を8080に設定することであることに注意してください。
ARG
たとえば、複数のコマンドを使用して複数のパラメータを定義できます。
ARG tcpPort
ARG useTls
Dockerイメージをビルドするときは、すべてのビルドパラメーターに値を指定する必要があります。[翻訳者注、バージョン1.13より前では、値が指定されていない場合はエラーが報告されます。バージョン1.13以降では、値が指定されていない場合はエラーは報告されませんが、警告がポップアップ表示されます]。例えば:
docker build --build-arg tcpPort=8080 --build-arg useTls=true .
ARG
デフォルト値を設定できます。Dockerイメージをビルドするときに、パラメーター値が指定されていない場合は、デフォルト値が使用されます。例えば:
ARG tcpPort=8080
ARG useTls=true
場合tcpPort
とuseTls
ドッカーを生成する画像は、パラメータが設定されていない場合は、デフォルト値8080、および真。
ARG
宣言されたパラメータは通常、Dockerfileの他の場所で引用されます。
ARG tcpPort=8080
ARG useTls=true
CMD start-my-server.sh -port ${tcpPort} -tls ${useTls}
注:2つの参照
${tcpPort}
と${useTls}
参照名tcpPort
、およびuseTls
両方ともARG
宣言されたパラメーター。
docker build --build-arg tcpPort=8080
WORKDIR
WORKDIR
このコマンドは、Dockerイメージ内の作業ディレクトリを指定します。作業ディレクトリは、WORKDIR
コマンドの後のすべてのコマンドに対して有効になります。次に例を示します。
WORKDIR /java/jdk/bin
EXPOSE
EXPOSE
このコマンドは、Dockerコンテナのネットワークポートを開きます。たとえば、DockerコンテナがWebサーバーを実行している場合、クライアントが接続できるように、Webサーバーはポート80を開く必要がある場合があります。例えば:
EXPOSE 8080
また、UDPやTCPなど、ポートを開くための通信プロトコルを指定することもできます。許可される通信プロトコルの設定例を次に示します。
EXPOSE 8080/tcp 9999/udp
プロトコルが指定されていない場合、デフォルトでTCPプロトコルが想定されます。
ボリューム
VOLUME
このコマンドは、Dockerイメージにディレクトリを作成します。このディレクトリはDockerホストにマウントできます。つまり、Dockerイメージにディレクトリを作成できます。たとえば/data
、このディレクトリは後でDockerホストの/container-data/container1
ディレクトリにマウントできます。マウントが成功すると、コンテナが起動します。以下は、VOLUME
コマンドを使用してDockerfileにマウントディレクトリを定義する例です。
VOLUME /data
エントリーポイント
ENTRYPOINT
このコマンドは、DockerイメージからDockerコンテナを起動するためのエントリポイントを提供します。エントリポイントは、Dockerコンテナの起動時に実行されるアプリケーションまたはコマンドです。したがって、アプリケーションの実行が完了する時間を使用して、コンテナがDockerを閉じることを除いて、ENTRYPOINT
とCMD
同様に機能します。したがって、Dockerイメージ自体が実行可能コマンドになり、完了後に開始および終了できます。次に例を示します。ENTRYPOINT
ENTRYPOINT
ENTRYPOINT
ENTRYPOINT
ENTRYPOINT java -cp /apps/myapp/myapp.jar com.jenkov.myapp.Main
この例では、コンテナの起動時にJavaアプリケーションのメインクラスを実行しcom.jenkov.myapp.Main
、アプリケーションを閉じると、Dockerコンテナも閉じます。
健康診断
HEALTHCHECK
コマンドは定期的にヘルスチェックを実行して、Dockerコンテナで実行されているアプリケーションのヘルスを監視できます。コマンドが0を返す場合、Dockerはアプリケーションとコンテナーを正常と見なします。コマンドが1を返す場合、Dockerはアプリケーションとコンテナーを異常と見なします。例は次のとおりです。
HEALTHCHECK java -cp /apps/myapp/healthcheck.jar com.jenkov.myapp.HealthCheck https://localhost/healthcheck
この例では、Javaアプリケーションのcom.jenkov.myapp.HealthCheck
ヘルスチェックコマンドが使用されています。意味のあるヘルスチェックコマンドを使用できます。
ヘルスチェック間隔
デフォルトでは、Dockerは30秒ごとにHEALTHCHECK
コマンドを実行します。時間間隔を変更したい場合は、時間をカスタマイズ--interval
できます。また、パラメーターを使用して、ヘルスチェックのチェック間隔を指定できます。HEALTHCHECK
間隔を60秒に設定する例を次に示します。
HEALTHCHECK --interval=60s java -cp /apps/myapp/healthcheck.jar com.jenkov.myapp.HealthCheck https://localhost/healthcheck
ヘルスチェック開始時間
デフォルトでは、DockerはDockerコンテナの監視ステータスをすぐにチェックします。ただし、アプリケーションによっては起動に時間がかかる場合があるため、一定期間後にのみヘルスチェックを実行することをお勧めします。--start-period
パラメータを使用して、ヘルスチェックの開始時間を設定できます。以下は、ヘルスチェックを5分に設定する例です。Dockerがヘルスチェックを開始する前に、コンテナーとアプリケーションに300秒(5分)の起動時間が提供されます。
HEALTHCHECK --start-period=300s java -cp /apps/myapp/healthcheck.jar com.jenkov.myapp.HealthCheck https://localhost/healthcheck
ヘルスチェックのタイムアウト
ヘルスチェックがタイムアウトする可能性があります。HEALTCHECK
コマンドが完了するために指定された制限時間を超える必要がある場合、Dockerはヘルスチェックがタイムアウトしたと見なします。--timeout
パラメータを使用してタイムアウト期間を設定できます。タイムアウト期間を5秒に設定する例を次に示します。
HEALTHCHECK --timeout=5s java -cp /apps/myapp/healthcheck.jar com.jenkov.myapp.HealthCheck https://localhost/healthcheck
ヘルスチェックがタイムアウトした場合、Dockerはコンテナも異常であると見なすことに注意してください。
ヘルスチェックの繰り返し回数
HEALTHCHECK
コマンドの実行が失敗した場合は、結果が1を返すか、実行がタイムアウトする可能性があります。Dockerは、コンテナーが異常であるHEALTHCHECK
と判断する前にコマンドを3回再試行して、Dockerコンテナーが正常な状態に戻るかどうかを確認します。--retries
再試行回数を設定できます。以下は、再試行回数を5に設定する例です。
HEALTHCHECK --retries=5 java -cp /apps/myapp/healthcheck.jar com.jenkov.myapp.HealthCheck https://localhost/healthcheck
推奨読書
こんにちは、私は山を見ています、パブリックアカウント:山小屋、10歳の類人猿、Apache Storm、WxJava、Cynomysオープンソース寄稿者を見ています。コードの世界で泳ぎ、ドラマでの生活を楽しんでください。
元のリンク:Docker Dockerfile
翻訳:https://www.howardliu.cn翻訳
リンク:Dockerチュートリアル(2):Dockerfile
CSDNホームページ:http:
//blog.csdn.net/liuxinghao CSDNブログ投稿:Dockerチュートリアル(2): Dockerfile