Docker(パート3):Dockerfileコマンドの詳しい説明

Docker(パート3):Dockerfileコマンドの詳しい説明

前回の記事「Docker (II): Dockerfile の使い方入門」では、Dockerfile の使い方を紹介しました。この記事では、引き続き Dockerfile を理解し、さまざまな Dockerfile コマンドの使用方法を学習します。

Dockerfile の手順の説明

1 FROMはベースイメージを指定します

FROM 命令は、後で新しいイメージを構築するために使用されるベース イメージを指定するために使用されます。 FROM 命令は Dockerfile ファイルの最初のコマンドである必要があります。ビルド プロセスを開始すると、Docker はこのイメージに基づいて新しいイメージをビルドし、FROM 以降のコマンドもこのベース イメージに基づいて実行されます。

[[227061]]

FROM の構文形式は次のとおりです。

  1. <画像>より

または

  1. <画像>:<タグ>から

または

  1. <画像>:<ダイジェスト>より

FROM で指定するイメージは、任意の有効なベース イメージにすることができます。 FROM には次の制限があります。

  • FROMはDockerfileの最初の非コメントコマンドでなければなりません
  • Dockerfile で複数のイメージを作成する場合、FROM が複数回出現することがあります。各新しい FROM コマンドの前に送信された最後のミラー ID を記録するだけです。
  • タグまたはダイジェストはオプションです。これら 2 つの値を使用しない場合は、ベース イメージの最新バージョンが使用されます。

2 RUN コマンドを実行する

イメージ構築プロセス中に特定のコマンドを実行し、中間イメージを生成します。形式:

  1. #シェル形式
  2. RUN <コマンド>
  3. #実行形式
  4. RUN [ "実行可能ファイル" , "パラメータ1" , "パラメータ2" ]
  • RUN コマンドは、現在のイメージ内の有効なコマンドを実行し、実行結果を送信します。コマンドが実行されて送信されると、Dockerfile 内の次の命令が自動的に実行されます。
  • 階層的な RUN 命令と生成されたコミットは、Docker のコアコンセプトに沿っています。バージョン管理と同様に、いつでもイメージ イメージのカスタム ビルドが可能になります。
  • RUN 命令によって作成された中間イメージはキャッシュされ、次のビルドで使用されます。これらのキャッシュされたイメージを使用しない場合は、ビルド時に --no-cache パラメータを指定できます (例: docker build --no-cache)。

3 コピー ファイルをコピーする

形式:

  1. COPY <ソースパス>... <宛先パス>
  2. COPY [ "<ソースパス 1>" ,... "<宛先パス>" ]

RUN 命令と同様に、コマンド ラインに似た形式と関数呼び出しに似た形式の 2 つがあります。 COPY 命令は、ビルド コンテキスト ディレクトリの <ソース パス> にあるファイル/ディレクトリを、イメージの新しいレイヤーの <宛先パス> の場所にコピーします。例えば:

  1. package.json を /usr/src/app/ にコピーします。

<ソース パス> は複数指定することも、ワイルドカードを使用することもできます。ワイルドカード ルールは、次のような Go の filepath.Match ルールを満たす必要があります。

  1. コピー hom* /mydir/
  2. hom?.txt /mydir/ をコピー

<ターゲット パス> は、コンテナー内の絶対パスまたは作業ディレクトリへの相対パスにすることができます (作業ディレクトリは WORKDIR 命令を使用して指定できます)。ターゲットパスを事前に作成する必要はありません。ディレクトリが存在しない場合は、ファイルをコピーする前に作成されます。

また、COPY コマンドを使用する場合、ソース ファイルのさまざまなメタデータが保持されることにも注意が必要です。たとえば、読み取り、書き込み、実行権限、ファイルの変更時間などです。この機能は、イメージのカスタマイズに役立ちます。特にビルド関連のファイルが Git を使用して管理されている場合。

4 より高度なファイルコピーを追加

ADD 命令と COPY 命令の形式とプロパティは基本的に同じです。ただし、COPY に基づいていくつかの機能が追加されます。たとえば、<source path> は URL になります。この場合、Docker エンジンはこのリンクのファイルをダウンロードし、<destination path> に配置しようとします。

イメージをビルドするときは、コンテキスト内のファイルを次の形式でイメージにコピーします。

  1. ADD <ソースパス>... <宛先パス>  
  2. ADD [ "<ソースパス>" ,... "<宛先パス>" ]

知らせ

Docker はファイルの内容が変更されたことを検出すると、後続の命令ではキャッシュを使用しなくなります。ファイルをコピーする際に処理が必要な/については、基本的には通常のコピーと同じです。

5 ENVは環境変数を設定します

形式は 2 つあります。

  1. ENV <キー> < 値 >
  2. ENV <キー1>=<値1> <キー2>=<値2>...

この命令は非常に単純で、環境変数を設定するだけです。 RUN などの後続の命令でも、実行時のアプリケーションでも、ここで定義された環境変数を直接使用できます。

  1. ENV VERSION=1.0 DEBUG=オン\
  2. 名前= 「ハッピー フィート」  

この例では、行を折り返し、二重引用符を使用してスペースを含む値を囲む方法を示しています。これは、シェルでの動作と一致しています。

6 公開する

コンテナが実行時にリッスンできるように、ビルドされたイメージのリッスン ポートを設定します。形式:

  1. EXPOSE <ポート> [<ポート>...]

EXPOSE 命令は、コンテナにホストのポートをリッスンさせません。必要に応じて、docker を実行するときに -p または -P パラメータを使用して、コンテナ ポートをホストのポートに公開する必要があります。

7 VOLUMEは匿名ボリュームを定義する

VOLUME はマウント ポイントを作成するために使用されます。つまり、ビルドされたイメージに基づいて作成されたコンテナーにボリュームを追加します。

ボリューム ["/data"]

ボリュームは、ユニオン ファイル システムをバイパスして、1 つ以上のコンテナー内の指定されたディレクトリに存在でき、次の機能があります。

  • ボリュームはコンテナ間で共有および再利用できます
  • コンテナは必ずしも他のコンテナとボリュームを共有するわけではない
  • ボリュームの変更はすぐに有効になります
  • ボリュームの変更はミラーには影響しません
  • ボリュームは、コンテナーが使用しなくなるまで存続します。

VOLUME を使用すると、ソース コード、データ、またはその他のコンテンツをイメージにコミットせずにイメージに追加し、複数のコンテナー間でこのコンテンツを共有できるようになります。

8 WORKDIRは作業ディレクトリを指定する

WORKDIR はコンテナ内の作業ディレクトリを設定するために使用されます。

  1. WORKDIR /path/から/workdir

WORKDIR を通じて作業ディレクトリを設定すると、Dockerfile 内の後続のコマンド RUN、CMD、ENTRYPOINT、ADD、COPY およびその他のコマンドがこのディレクトリで実行されます。たとえば、WORKDIR を使用して作業ディレクトリを設定します。

  1. ワークディレクトリ /a
  2. ワークディレクトリb
  3. ワークディレクトリ c
  4. 実行パスワード

上記の例では、pwd は最終的に /a/b/c ディレクトリで実行されます。 docker run を使用してコンテナを実行する場合、-w パラメータを使用して、ビルド中に設定された作業ディレクトリを上書きできます。

9 USERは現在のユーザーを指定します

USER は、イメージを実行するために使用するユーザーを指定するために使用されます。

  1. USERデーモン

USER を使用してユーザーを指定する場合、ユーザー名、UID、GID、またはこれら 2 つの組み合わせを使用できます。以下はすべて法定指定テストです。

  1. ユーザー ユーザー 
  2. ユーザー ユーザー:グループ 
  3. ユーザーID
  4. ユーザーuid:gid
  5. ユーザー ユーザー:gid
  6. USER uid:グループ 

USER を使用してユーザーを指定した後、Dockerfile 内の後続のコマンド RUN、CMD、および ENTRYPOINT ではこのユーザーが使用されます。イメージがビルドされた後、docker run を介してコンテナを実行するときに、-u パラメータを使用して指定したユーザーを上書きできます。

10 CM

CMD は、コンテナの起動時に実行されるコマンドを指定するために使用されます。 CMD には次の 3 つの形式があります。

  1. CMD [ "実行可能ファイル" , "パラメータ1" , "パラメータ2" ]
  2. CMD [ "パラメータ1" , "パラメータ2" ]
  3. CMD コマンド パラメータ1 パラメータ2

実行可能ファイルの exec 形式を省略します。この書き方では、CMD 内のパラメータが ENTRYPOINT のデフォルト パラメータになります。この場合、ENTRYPOINT も exec 形式にする必要があります。 ENTRYPOINT との具体的な組み合わせについては、ENTRYPOINT を参照してください。

知らせ

RUN 命令との違い: RUN はビルド中に実行され、新しいイメージを生成しますが、CMD はコンテナの実行中に実行され、ビルド中に操作は実行されません。

11 エントリーポイント

ENTRYPOINT は、コンテナの実行可能プログラムを構成するために使用されます。つまり、イメージを使用してコンテナを作成するたびに、ENTRYPOINT で指定されたプログラムがデフォルトのプログラムとして設定されます。 ENTRYPOINT には次の 2 つの形式があります。

  1. ENTRYPOINT [ "実行可能ファイル" , "param1" , "param2" ]
  2. ENTRYPOINT コマンド パラメータ1 パラメータ2

ENTRYPOINT は CMD と非常によく似ていますが、docker run によって実行されるコマンドは ENTRYPOINT を上書きせず、docker run コマンドで指定されたパラメーターは ENTRYPOINT に再度パラメーターとして渡される点が異なります。 Dockerfile では ENTRYPOINT コマンドは 1 つだけ許可されます。複数の ENTRYPOINT コマンドが指定された場合、以前の設定は上書きされ、最後の ENTRYPOINT 命令のみが実行されます。

docker run がコンテナを実行するときに指定されたパラメータは ENTRYPOINT に渡され、CMD コマンドで指定されたパラメータを上書きします。たとえば、docker run <image> -d を実行すると、-d パラメータがエントリポイントに渡されます。

docker run --entrypoint を使用して、ENTRYPOINT エントリ ポイントをオーバーライドすることもできます。たとえば、コンテナ実行プログラムは次のように指定できます。

  1. エントリポイント [ "/usr/bin/nginx" ]

完全なビルドコード:

  1. # バージョン: 0.0.3
  2. ubuntu:16.04より
  3. 管理者ヘ・ミンサン「cn.liuht@gmail.com」  
  4. apt-get updateを実行する 
  5. apt-get install -y nginxを実行します
  6. RUN echo 'Hello World、私はコンテナです' \
  7. > /var/www/html/index.html
  8. エントリポイント [ "/usr/sbin/nginx" ]
  9. エクスポーズ80

docker build を使用してイメージをビルドし、イメージを itbilu/test として指定します。

  1. ビルドは -t で実行します

ビルドが完了したら、itbilu/test を使用してコンテナを起動します。

  1. docker run -i -t itbilu/test -g "デーモンをオフにします;"  

コンテナを実行するときに、-g "daemon off;" を使用しました。これは ENTRYPOINT に渡されます。コンテナ内で最終的に実行されるコマンドは、/usr/sbin/nginx -g "daemon off;" です。

12 ラベル

LABEL は画像にメタデータを追加するために使用されます。メタデータはキーと値のペアの形式で指定されます。

  1. LABEL <キー>=< 値 > <キー>=< 値 > <キー>=< 値 > ...

LABEL を使用してメタデータを指定する場合、1 つの LABEL 仕様で 1 つ以上のメタデータを指定できます。複数のメタデータを指定する場合、異なるメタデータはスペースで区切られます。中間画像が大量に生成されるのを避けるため、すべてのメタデータを LABEL 命令で指定することをお勧めします。たとえば、LABEL を通じてメタデータを指定します。

LABEL version="1.0" description="これは Web サーバーです" by="IT notes"

指定したら、docker inspect で確認できます。

  1. docker 検査 itbilu/テスト
  2. 「ラベル」 : {
  3. 「バージョン」 : 「1.0」
  4. 「説明」 : 「これはWebサーバーです」
  5. 「作成者」 : 「IT Records」  
  6. },

13 アルゼンチン

ARG は、ビルド ランタイムに渡される変数を指定するために使用されます。

  1. ARG <名前>[=<デフォルト値>]

たとえば、ARG を通じて 2 つの変数を指定します。

  1. ARGサイト 
  2. ARG build_user=IT トランスクリプト

上記では、site と builduser の 2 つの変数を指定しています。builduser はデフォルト値を指定します。 docker build を使用してイメージをビルドする場合、--build-arg <varname>=<value> パラメータを使用してこれらの変数の値を指定またはリセットできます。

  1. 次のコマンドを実行して、 docker buildを実行します。  

このようにして、サイトが itbilu.com に設定される itbilu/test イメージを構築します。 build_user が指定されていないため、その値はデフォルト値の IT Records になります。

14 オンビルド

ONBUILD はミラー トリガーを設定するために使用されます。

  1. ONBUILD [手順]

ビルドされたイメージが他のイメージのベースイメージとして使用される場合、イメージ内のトリガーはキーによってトリガーされます。たとえば、画像を使用する場合、何らかの処理が必要になることがあります。

  1. [...]
  2. ONBUILD ADD ./app/src
  3. ONBUILD RUN /usr/ local /bin/python-build --dir /app/src  
  4. [...]

15 停止信号

STOPSIGNAL は、コンテナを停止するために送信されるシステム コール シグナルを設定するために使用されます。

  1. STOPSIGNAL信号

使用されるシグナルは、SIGKILL など、カーネル システム コール テーブル内の有効な値である必要があります。

16 シェル

SHELL は、コマンドの実行に使用されるデフォルトのシェル タイプ (シェル スタイル) を設定するために使用されます。

  1. SHELL [ "実行可能ファイル" , "パラメータ" ]

SHELL は Windows 環境でより便利です。 Windows では通常、cmd と powershell の 2 つのシェルがあり、sh もある場合があります。このとき、SHELL を使用して、使用するシェルの種類を指定できます。

  1. microsoft/windowsservercoreから
  2. # cmd /S /C echo defaultとして実行 
  3. RUN エコーデフォルト 
  4. # cmd /S /C powershell -command Write-Host default として実行 
  5. 実行 powershell -command Write-Host default  
  6. # powershell -command Write-Host helloとして実行
  7. SHELL [ "powershell" , "-command" ]
  8. RUN 書き込みホストhello
  9. # cmd /S /C echo helloとして実行
  10. シェル [ "cmd" "/S" "、 " /C"]
  11. 実行エコーハロー

Dockerfileの経験

Dockerfileの例

Nginx 動作環境の構築

  1. # ベースイメージを指定する
  2. sameersbn/ubuntuより:14.04.20161014
  3. # メンテナー情報
  4. メンテナー sameer@damagehead.com
  5. # 環境の設定
  6. 環境変数 RTMP_VERSION=1.1.10 \
  7. NPS_VERSION=1.11.33.4 \
  8. LIBAV_VERSION=11.8 \
  9. NGINX_VERSION=1.10.1 \
  10. NGINX_USER=www-data \
  11. NGINX_SITECONF_DIR=/etc/nginx/sites-enabled \
  12. NGINX_LOG_DIR=/var/log/nginx \
  13. NGINX_TEMP_DIR=/var/lib/nginx \
  14. NGINX_SETUP_DIR=/var/cache/nginx
  15. # イメージのビルド後に無効になるビルド時の変数を設定する
  16. ARG BUILD_LIBAV = false  
  17. ARG WITH_DEBUG = false  
  18. ARG WITH_PAGESPEED = true  
  19. ARG WITH_RTMP = true  
  20. # ローカルファイルをコンテナディレクトリにコピーする
  21. コピー setup/ ${NGINX_SETUP_DIR}/
  22. bash ${NGINX_SETUP_DIR}/install.shを実行します。
  23. # ローカル設定ファイルをコンテナディレクトリにコピーする
  24. nginx.conf をコピー /etc/nginx/nginx.conf
  25. コピー entrypoint.sh /sbin/entrypoint.sh
  26. # コマンドを実行
  27. chmod 755 /sbin/entrypoint.sh を実行します。
  28. # 指定されたポートを許可する
  29. 公開 80/tcp 443/tcp 1935/tcp
  30. #ウェブサイトディレクトリのマウントポイントを指定する
  31. ボリューム [ "${NGINX_SITECONF_DIR}" ]
  32. エントリポイント [ "/sbin/entrypoint.sh" ]
  33. コマンド [ "/usr/sbin/nginx" ]

Tomcat環境の構築

Dockerファイル

  1. # ベースとなるイメージを指定します
  2. ubuntu:13.10から
  3. # メンテナー情報
  4. メンテナンス張家陽"zhangjiayang@sczq.com.cn"  
  5. # ミラーコマンド操作
  6. # APTによって更新されたリソースリストを取得する
  7. 実行 echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
  8. # ソフトウェアの更新
  9. apt-get updateを実行する 
  10. # curlをインストールする
  11. apt-get -y install curlを実行します。
  12. # JDK 7 をインストール
  13. 実行 cd /tmp && curl -L 'http://download.oracle.com/otn-pub/java/jdk/7u65-b17/jdk-7u65-linux-x64.tar.gz' -H 'Cookie: oraclelicense=accept-securebackup-cookie; gpw_e24=Dockerfile' | tar -xz
  14. mkdir -p /usr/lib/jvm を実行します。
  15. mv /tmp/jdk1.7.0_65/ /usr/lib/jvm/java-7-oracle/ を実行します。
  16. # Oracle JDK 7を次のように設定します デフォルトのJava
  17. 実行update -alternatives --install /usr/bin/java java /usr/lib/jvm/java-7-oracle/bin/java 300  
  18. 実行update -alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-7-oracle/bin/javac 300  
  19. # システム環境の設定
  20. 環境変数 JAVA_HOME /usr/lib/jvm/java-7-oracle/
  21. # tomcat7をインストール
  22. cd /tmp && curl -L 'http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.8/bin/apache-tomcat-7.0.8.tar.gz'を実行します| tar -xz
  23. 実行 mv /tmp/apache-tomcat-7.0.8/ /opt/tomcat7/
  24. 環境変数 CATALINA_HOME /opt/tomcat7
  25. 環境変数 PATH $PATH:$CATALINA_HOME/bin
  26. # tomcat7.shをコンテナ内のディレクトリにコピーします
  27. tomcat7.sh /etc/init.d/tomcat7を追加します
  28. chmod 755 /etc/init.d/tomcat7を実行します。
  29. # ポートを公開します。公開ポートを指定する
  30. エクスポーズ8080
  31. #デフォルトのコマンドを定義します。
  32. ENTRYPOINT サービス tomcat7 開始 && tail -f /opt/tomcat7/logs/catalina。 

tomcat7.sh コマンド ファイル

  1. JAVA_HOME=/usr/lib/jvm/java-7-oracle/ をエクスポートします。
  2. TOMCAT_HOME=/opt/tomcat7 をエクスポートします。
  3. ケース$ 1  
  4. 始める)
  5. $TOMCAT_HOME/bin/startup.sh を実行します。
  6. ;;
  7. 停止)
  8. sh $TOMCAT_HOME/bin/shutdown.sh
  9. ;;
  10. 再起動)
  11. sh $TOMCAT_HOME/bin/shutdown.sh
  12. $TOMCAT_HOME/bin/startup.sh を実行します。
  13. ;;
  14. エサック
  15. 終了 0

原則と推奨事項

容器は軽量です。イメージから生成されるコンテナは、可能な限り軽量で、短時間で停止、破棄、再生成、置換できる必要があります。

.gitignore を使用してください。ほとんどの場合、Dockerfile はビルドに必要なファイルと同じディレクトリに配置されます。ビルドのパフォーマンスを向上させるには、.gitignore を使用して不要なファイルとディレクトリを除外する必要があります。

イメージと依存関係のサイズを削減するには、必要なパッケージのみをインストールします。

コンテナは 1 つのことを行います。すべてを 1 つのコンテナーで実行するのではなく、複雑なアプリケーションを複数のコンテナーに分離します。たとえば、Python Web アプリケーションでは、サーバー、DB、キャッシュ、MQ、ログなどの複数のコンテナーが必要になる場合があります。より極端な言い方をすると、コンテナごとに 1 つのプロセスです。

ミラーリングされたレイヤーの数を減らします。複数のラベル、ENV、その他のタグを使用しないでください。

特に apt-get install -y を使用してパッケージをインストールする場合は、継続行のパラメータをアルファベット順に並べ替えます。

ビルド キャッシュを使用します。キャッシュを使用しない場合は、ビルド時に --no-cache=true パラメータを使用して、中間イメージの再生成を強制することができます。

【この記事は51CTOコラムニスト「ピュアスマイル」によるオリジナル記事です。転載の許可を得るには、WeChat公式アカウントを通じて著者に連絡してください]

この著者の他の記事を読むにはここをクリックしてください

<<:  マイクロソフトの Mixed Reality がハノーバーメッセでその実力を披露

>>:  Office365: パートナーがWin-Winの未来を実現できるよう支援

推薦する

非常に詳細なウェブサイト記事ページ最適化の知識

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますウェブサイ...

優秀な SEO 担当者にとって、平時においても危険に備えるという前向きな意識を持つことは非常に重要です。

周知のとおり、SEO はウェブサイトの運用と保守の手段であり、その費用対効果の高さから多くの運用と保...

おすすめ: vagex-VPS アイドルマネー稼ぎ オープン登録

Vagex の登録受付が開始されました。公式 Web サイト (http://vagex.com/)...

キーワードスタッキングアップデートに関する百度の推測

百度は6月22日と6月28日にウェブサイトランキングの大規模なアップデートを実施した。このアップデー...

クラウド vs. エッジ: どちらのコンピューティングが勝利するでしょうか?

今日の企業が直面している最も差し迫った課題の 1 つは、最先端のテクノロジーと目標達成に役立つ実用的...

オリジナルコンテンツ:大学におけるWeChatパブリックアカウントのチーム構築、運用、プロモーション

今日は、大学のパブリックアカウントのチーム構築、運用、プロモーション戦略を分析します。大学生起業家の...

クラウド ネイティブはマイクロサービスにどのように役立ちますか?

テクノロジーの発展に伴い、クラウド ホスティングの時代は徐々にクラウド ネイティブへと進化してきまし...

クラウドネイティブがエンタープライズセキュリティに革命を起こす3つの理由

概要:クラウド ネイティブ セキュリティは本当に違うのでしょうか?それは必須ですか?私の答えは「はい...

百度の7.18クリック事件を冷静に考えてみよう

最近では、さまざまなウェブマスターのウェブサイトやSEOグループなど、誰もが7月18日に始まったクリ...

オリジナルのインスピレーション: 注意は態度である

ウェブサイトの最適化は独創性と切り離せないことは多くの人が知っています。しかし、十分なオリジナリティ...

faconhost: 香港の高性能ダイレクトコネクト大帯域幅 VPS、年間 27.99 ポンド、512M メモリ/1 コア/10g NVMe/500g トラフィック

faconhostは香港VPSシリーズを新たに発売しました。デフォルトの帯域幅は100Mbpsです(...

中国スマート端末市場半期レポート

今年上半期のスマート端末市場の動向についてお話しします。 QuestMobileのデータによると、市...

物理サーバーのUSBインターフェースを仮想マシンにマッピングする方法

以前、クラスメートがH3CのCASクラウドプラットフォームを使用して仮想マシンを作成したとき、クラウ...

hostsolutions: 50 ユーロ/3 年、KVM/512M メモリ/1 コア/1T ハードディスク/5T トラフィック、ノルウェー、ルーマニア

Hostsolutions はノルウェーにデータセンターを新たに開設し、大容量ハードドライブ VPS...

moecloud: 市場限定 UK cn2 gia vps、20% 割引、42 元/512M メモリ/1 コア/10g SSD/450g トラフィック

moecloud は正式に UK cn2 gia vps の販売を開始しました。データセンターはロン...