dockerfile の概要
Docker は、dockerfile の内容を読み取ることで、イメージを自動的に構築できます。dockerfile は、必要なすべてのコマンドを含むテキスト ファイルです。ビルドプロセス中に実行されます。また、dockfile は docker プログラムによって解釈されるスクリプトであることも理解できます。dockfile は 1 つずつの命令で構成されています。各命令は Linux システム上のコマンドに対応します。docker プログラムは、これらの dockerfile 命令を実際の Linux コマンドに変換します。 Dockerfile には独自の記述形式とサポートされるコマンドがあり、docker プログラムは makefile と同様にこれらのコマンド間の依存関係を解決します。
Docker プログラムは dockerfile を読み取り、指示に従ってカスタマイズされたイメージを生成します。ブラックボックスのようなイメージと比較して、dockerfile のような明白なスクリプトは、イメージがどのように生成されるかを明確に示すため、ユーザーに受け入れられやすいです。 dockerfile を使用すると、独自の追加要件をカスタマイズする必要がある場合、dockerfile 上の命令を追加または変更してイメージを再生成するだけでよく、コマンドを入力する手間が省けます。
Docker によるイメージのビルド方法: commit、dockerfile
1. commit を使用してイメージをビルドします:
Commit は元のイメージに基づいてビルドされます。 image このメソッドを使用してイメージを構築する目的は、一部の構成情報と変更された情報をイメージに保存することです。画像のスナップショットに相当します。
2. dockerfile を使用してイメージを構築します。
Dockerfile は、迅速に構築するために必要な (カスタム) イメージです。
Dockerfile 命令:
From: 基本イメージを指定します (from は必須の命令であり、最初の命令である必要があります)。
run: コマンドラインコマンドを実行するために使用されます。基本形式:
シェル形式: run
exec 形式: run , このメソッドは関数呼び出しの形式に似ています;
copy: ファイルをコピーします。基本的な形式:
形式 1: copy ...
形式 2: copy ["",. .. ..""]
add: より高度なコピーファイル。コピーに基づいていくつかの機能を追加します。圧縮パッケージがコピーされた場合は、直接解凍され、いいえ解凍するには run を使用する必要があります;
cmd: コンテナー起動コマンド。基本形式:
シェル形式: cmd
実行形式: cmd ["実行可能ファイル", "パラメータ 1", "パラメータ 2"...]
パラメータ リストの形式: cmd ["パラメータ 1", "パラメータ 2"...]、エントリポイント コマンドを指定した後、cmd を使用して特定のパラメータを指定します。
エントリポイント: エントリ ポイント。基本的な形式はexecとshellに分かれます
エントリポイントの目的はcmdと同じで、コンテナの起動プログラムとパラメータを指定することです。 Entrypoint は運用中に置き換えることができますが、cmd よりも面倒で、docker run のパラメーター --entrypoint で指定する必要があります。エントリポイントを指定すると、cmd の意味が変わり、コマンドを直接実行する代わりに、cmd の内容がパラメータとしてエントリポイント コマンドに渡されます。実行すると、
env: 環境変数を設定します。 (ここで使用した変数を使用できます) 基本形式:
形式 1: env
形式 2: env
arg: ビルドパラメータ。ビルド パラメーターの効果は、環境変数を設定するという env の効果と同じですが、arg によって構築された環境変数は、将来コンテナーが実行されるときには存在しないという点が異なります。基本形式:
形式 1: arg [=]
形式 2: このデフォルト値は、ビルド コマンド docker build で使用できます - - build-arg
volume: 匿名ボリュームを定義します。基本形式:
形式 1: ボリューム ["
形式 2: ボリューム
公開: ポートを公開します。 Expose ディレクティブは、ランタイム コンテナーによって提供されるポートを宣言します。コンテナーの起動時には、この宣言によりポートは開かれません。基本形式:
形式 1: を公開 [...]
Workdir: 作業ディレクトリを指定します。基本形式:
形式 1: workdir
ユーザー: 現在のユーザーを指定します。 user は、指定したユーザーに切り替えるのに役立ちます。基本的な形式:
形式 1: user
healthcheck: コンテナの状態が正常かどうかを判断するヘルスチェック。基本的な形式:
形式 1: healthcheck [オプション] cmd
形式 2: healthcheck none: 基本イメージにヘルス チェック コマンド。ヘルス チェックの指示をブロックするには、この形式を使用します。
Build nginx image:
ディレクトリを作成し、そのディレクトリに dockerfile を書き込みます:
[root@docker ~]# mkdir mynginx [root@docker ~]# cd mynginx/ [root@docker mynginx]# pwd /root/mynginx [root@docker mynginx]#
nginx ソース コード パッケージを作成したディレクトリ (mynginx ディレクトリ) にダウンロードします:
[root@docker ~]# wget -p /root/mynginx/ http://nginx.org/download/nginx-1.15.2.tar.gz
dockerfile を書き込みます:
[root@docker mynginx]# vi dockerfile
内容は次のとおりです:
from centos run ping -c 1 www.baidu.com run yum -y install gcc make pcre-devel zlib-devel tar zlib add nginx-1.15.2.tar.gz /usr/src/ run cd /usr/src/nginx-1.15.2 \ && mkdir /usr/local/nginx \ && ./configure --prefix=/usr/local/nginx && make && make install \ && ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ \ && nginx run rm -rf /usr/src/nginx-1.15.2 expose 80
実行イメージをビルドする docker コマンド:
[root@docker mynginx]# docker build -t nginx:v3 . sending build context to docker daemon 1.029mb step 1/7 : from centos ---> 5182e96772bf step 2/7 : run ping -c 1 www.baidu.com ---> using cache ---> 2f70f8abaf2a step 3/7 : run yum -y install gcc make pcre-devel zlib-devel tar zlib ---> using cache ---> dbdda4b7ae6f step 4/7 : add nginx-1.15.2.tar.gz /usr/src/ ---> using cache ---> 18ace6285668 step 5/7 : run cd /usr/src/nginx-1.15.2 && mkdir /usr/local/nginx && ./configure --prefix=/usr/local/nginx && make && make install && ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ && nginx ---> using cache ---> 99629488ede9 step 6/7 : run rm -rf /usr/src/nginx-1.15.2 ---> using cache ---> 869fbad71879 step 7/7 : expose 80 ---> using cache ---> 384bed72ea6f successfully built 384bed72ea6f successfully tagged nginx:v3
2 つが正常に出力された場合は、ビルドが成功したことを意味します。
カスタム イメージを開始します:
Docker イメージを使用してビルドされたイメージを表示します:
カスタム イメージを開始します:
[root@docker ~]# docker run -dit -p 80:80 --name nginx nginx:v3 ecaafe1190447878b98dfb0198e92439db60ff7dab57a1674e0e9e7282a9c858 [root@docker ~]# docker ps -a container id image command created status ports names ecaafe119044 nginx:v3 "/bin/bash" 3 seconds ago up 2 seconds 0.0.0.0:80->80/tcp nginx
注: 現時点では、コンテナをどのように起動しても、コンテナは終了した状態のままです。
さまざまな解決策を試した結果、問題がどこにあるのかがようやくわかりました。コンテナが起動すると、スレッドに対応するバックグラウンドで起動されることが分かりました。起動時にはすでに起動されていますが、コマンドを実行すると終了してバックグラウンドで実行されていないため、-dit パラメータを使用しますバックグラウンドで実行するだけです。
[root@docker ~]# docker run -dit -p 80:80 --name nginx nginx:v3 ecaafe1190447878b98dfb0198e92439db60ff7dab57a1674e0e9e7282a9c858 [root@docker ~]# docker ps -a container id image command created status ports names ecaafe119044 nginx:v3 "/bin/bash" 3 seconds ago up 2 seconds 0.0.0.0:80->80/tcp nginx
しかし...
このとき、別の問題が発生し、起動しているにもかかわらず、nginx Web ページのインターフェイスにアクセスできず、接続が拒否されました。 ! ! !
[root@docker ~]# curl 192.168.100.22 curl: (7) failed connect to 192.168.100.22:80; 拒绝连接 [root@docker ~]# elinks --dump 192.168.100.22 elinks: 拒绝连接
その後、Baidu、fq、Google に問い合わせた結果、ようやく問題が見つかりました。 exec を使用してコンテナに入り、nginx を起動するだけでよいことがわかりました。
ああああああ以上がdockerfileを使用してnginxイメージを構築する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。