転載元を示してください: http://blog.csdn.net/zhaoyanjun6/article/details/130338433この記事は[Zhao Yanjun のブログ]
からのものです。
記事ディレクトリ
注:docker commit
コマンドの学習に加えて、侵略された後にシーンを保存するなど、いくつかの特別なアプリケーションもあります。ただし、docker commit
カスタム。カスタム イメージはDockerfile
を使用して実行する必要があります。イメージをカスタマイズする場合は、次のセクションを参照してください。
イメージはコンテナーの基礎であり、このイメージはコンテナーが実行されるたびdocker run
に。前の例では、Docker Hub のイメージを使用しました。これらのイメージを直接使用すると、特定の要件を満たすことができます。これらのイメージが要件を直接満たせない場合は、これらのイメージをカスタマイズする必要があります。次のいくつかのセクションでは、画像をカスタマイズする方法について説明します。
これまでに学んだ知識を振り返ると、ミラーリングは多層ストレージであり、各レイヤーは前のレイヤーに基づいて変更されます; コンテナーも多層ストレージであり、ミラーリングに基づいています.コンテナー ランタイムのストレージ レイヤー。
次に、Web サーバーのカスタマイズを例として、イメージがどのように構築されるかを説明しましょう。
$ docker run --name webserver -d -p 80:80 nginx
このコマンドは、nginx
イメージてコンテナーを開始し、 it という名前webserver
を付け、ポート 80 をマップして、ブラウザーを使用して nginx サーバーにアクセスできるようにします。
ローカル マシン上で実行されている場合はDocker
、直接アクセスできます。Dockerhttp://localhost
を仮想マシンまたはクラウド サーバーにインストールした場合は、localhost を仮想マシンまたは実際のクラウド サーバーのアドレスに置き換える必要があります。
ブラウザで直接アクセスすると、デフォルトの Nginx ウェルカム ページが表示されます。
ここで、このウェルカム ページがあまり気に入らず、Docker テキストを歓迎するように変更したいとします。docker exec
コマンドコンテナーに入り、そのコンテンツを変更できます。
$ docker exec -it webserver bash
root@3729b97e8226:/# echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
root@3729b97e8226:/# exit
exit
対話型ターミナル モードで Web サーバー コンテナーに入り、bash コマンドを実行します。つまり、操作可能なシェルを取得します。
次に<h1>Hello, Docker!</h1>
、/usr/share/nginx/html/index.html
with の内容を上書きします。
ブラウザを再度更新すると、コンテンツが変更されていることがわかります。
コンテナーのファイルを変更しました。つまり、コンテナーのストレージ レイヤーを変更しました。docker diff
コマンドを通じて特定の変更を確認できます。
$ docker diff webserver
C /root
A /root/.bash_history
C /run
C /usr
C /usr/share
C /usr/share/nginx
C /usr/share/nginx/html
C /usr/share/nginx/html/index.html
C /var
C /var/cache
C /var/cache/nginx
A /var/cache/nginx/client_temp
A /var/cache/nginx/fastcgi_temp
A /var/cache/nginx/proxy_temp
A /var/cache/nginx/scgi_temp
A /var/cache/nginx/uwsgi_temp
変更をカスタマイズしたので、ミラー イメージとして保存します。
コンテナーを実行する場合 (ボリュームを使用しない場合)、行ったファイルの変更はコンテナー ストレージ レイヤーに記録されることに注意してください。また、Docker はコンテナーのストレージ層をミラー イメージとして保存するdocker commit
コマンド。換言すれば、元の画像に基づいて、コンテナの記憶層が追加されて新しい画像を形成する。今後この新しいイメージを実行すると、元のコンテナーの最後のファイル変更が行われます。
docker commit の構文形式は次のとおりです。
docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]]
次のコマンドを使用して、コンテナーをイメージとして保存できます。
$ docker commit \
--author "Tao Wang <[email protected]>" \
--message "修改了默认网页" \
webserver \
nginx:v2
sha256:07e33465974800ce65751acc279adc6ed2dc5ed4e0838f8b86f0c87aa1795214
その中には、指定された変更の作成者--author
であり、 --message
この変更の内容を記録することです。これはgit
バージョンが、ここではこれらの情報を省略して空白のままにすることができます。
この新しくカスタマイズされた画像は、docker image ls
次の場所で。
$ docker image ls nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v2 07e334659748 9 seconds ago 181.5 MB
nginx 1.11 05a60462f8ba 12 days ago 181.5 MB
nginx latest e43d811ce2f4 4 weeks ago 181.5 MB
docker history
特定ののミラーで履歴を表示することもできます。nginx:latest
の履歴を比較すると、送信したばかりのレイヤーが追加されていることがわかります。
$ docker history nginx:v2
IMAGE CREATED CREATED BY SIZE COMMENT
07e334659748 54 seconds ago nginx -g daemon off; 95 B 修改了默认网页
e43d811ce2f4 4 weeks ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon 0 B
<missing> 4 weeks ago /bin/sh -c #(nop) EXPOSE 443/tcp 80/tcp 0 B
<missing> 4 weeks ago /bin/sh -c ln -sf /dev/stdout /var/log/nginx/ 22 B
<missing> 4 weeks ago /bin/sh -c apt-key adv --keyserver hkp://pgp. 58.46 MB
<missing> 4 weeks ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.11.5-1 0 B
<missing> 4 weeks ago /bin/sh -c #(nop) MAINTAINER NGINX Docker Ma 0 B
<missing> 4 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B
<missing> 4 weeks ago /bin/sh -c #(nop) ADD file:23aa4f893e3288698c 123 MB
新しいイメージをカスタマイズしたら、イメージを実行できます。
docker run --name web2 -d -p 81:80 nginx:v2
ここでは、新しいサービスに as という名前を付けweb2
、 81
port。にアクセスして結果をhttp://localhost:81
確認して。その内容は、webserver
以前に変更したものと同じである必要があります。
ここまでで、docker commit
コマンドを。イメージの多層ストレージについてより直感的に感じられるはずです。 .
docker commit は慎重に使用してください
docker commit
このコマンドを使用すると、ミラーリングされた階層ストレージの概念をより直感的に理解できますが、実際の環境では使用されません。
まず、docker diff webserver
これまでの、/usr/share/nginx/html/index.html
本当に変更したいファイル以外にも、コマンドの実行によって変更または追加されたファイルが多数あることがわかります。これは単純な操作ですが、ソフトウェア パッケージをインストールしてコンパイルおよびビルドすると、無関係なコンテンツが大量に追加され、イメージが非常に肥大化します。
また、使用とは、画像に対するすべての操作がブラックボックス操作であるdocker commit
ことを意味し、生成された画像はブラックボックス画像とも呼ばれます。画像を生成する方法、他の誰もそれを取得することはできません。また、鏡像を作った人でも、しばらくすると特定の操作を思い出すことができません。このブラック ボックス イメージのメンテナンスは非常に苦痛です。
さらに、前述のミラーリングで使用されている階層ストレージの概念を振り返ると、現在のレイヤーを除いて、前の各レイヤーは変更されません. つまり、変更の結果は現在のレイヤーにのみマークされ、追加、変更されます.前のレイヤーを変更せずに。を使用してミラー イメージdocker commit
を作成し、後で変更すると、変更のたびにミラー イメージが肥大化し、削除された上位レイヤーが失われることはなく、まったくアクセスできなくても常にミラー イメージをたどります。これにより、画像がさらに肥大化します。