Docker 実践ノート 5 - commit を使用してミラー構成を理解する

転載元を示してください: 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.htmlwith の内容を上書きします。

ブラウザを再度更新すると、コンテンツが変更されていることがわかります。

ここに画像の説明を挿入

コンテナーのファイルを変更しました。つまり、コンテナーのストレージ レイヤーを変更しました。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 という名前を付けweb281port。にアクセスして結果をhttp://localhost:81確認して。その内容は、webserver 以前に変更したものと同じである必要があります。

ここまでで、docker commit コマンドを。イメージの多層ストレージについてより直感的に感じられるはずです。 .

docker commit は慎重に使用してください

docker commitこのコマンドを使用すると、ミラーリングされた階層ストレージの概念をより直感的に理解できますが、実際の環境では使用されません。

まず、docker diff webserverこれまでの、/usr/share/nginx/html/index.html 本当に変更したいファイル以外にも、コマンドの実行によって変更または追加されたファイルが多数あることがわかります。これは単純な操作ですが、ソフトウェア パッケージをインストールしてコンパイルおよびビルドすると、無関係なコンテンツが大量に追加され、イメージが非常に肥大化します。

また、使用とは、画像に対するすべての操作がブラックボックス操作であるdocker commit ことを意味し、生成された画像はブラックボックス画像とも呼ばれます。画像を生成する方法、他の誰もそれを取得することはできませんまた、鏡像を作った人でも、しばらくすると特定の操作を思い出すことができません。このブラック ボックス イメージのメンテナンスは非常に苦痛です。

さらに、前述のミラーリングで使用されている階層ストレージの概念を振り返ると、現在のレイヤーを除いて、前の各レイヤーは変更されません. つまり、変更の結果は現在のレイヤーにのみマークされ、追加、変更されます.前のレイヤーを変更せずに。を使用してミラー イメージdocker commit を作成し、後で変更すると、変更のたびにミラー イメージが肥大化し、削除された上位レイヤーが失われることはなく、まったくアクセスできなくても常にミラー イメージをたどります。これにより、画像がさらに肥大化します。

おすすめ

転載: blog.csdn.net/zhaoyanjun6/article/details/130338433