Dockerチュートリアル(2):Dockerfile

Dockerチュートリアル(2):Dockerfile

こんにちは、私は山を見ています。

この記事は、並行プログラミングネットワークの翻訳招待からのものであり、翻訳は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

RUNDockerイメージでコマンドライン命令を実行できます。実行時間は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=8080tcpPortパラメータの値を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

場合tcpPortuseTlsドッカーを生成する画像は、パラメータが設定されていない場合は、デフォルト値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を閉じることを除いてENTRYPOINTCMD同様に機能します。したがって、Dockerイメージ自体が実行可能コマンドになり、完了後に開始および終了できます。次に例を示します。ENTRYPOINTENTRYPOINTENTRYPOINTENTRYPOINT

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

公開番号:山小屋を見る

おすすめ

転載: blog.csdn.net/conansix/article/details/114808891