docker container diff コマンドでコンテナのファイルシステム変更を検査する方法

DockerDockerBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Docker コンテナ内のファイルシステム変更を検査するためにdocker container diffコマンドを使用する方法を学びます。まずシンプルな Nginx コンテナを実行し、コンテナ作成時に加えられた初期ファイルシステム変更をdocker container diffで確認します。

初期検査の後、実行中のコンテナ内で変更を加えます。最後に再度docker container diffを使用し、これらの変更によって生じたファイルシステムの差異を観察・理解します。この実践的な演習を通じて、コンテナの動作を理解しデバッグするための有用な Docker コマンドの実用的な経験を得られます。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/exec("Execute Command in Container") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/images("List Images") subgraph Lab Skills docker/run -.-> lab-555107{{"docker container diff コマンドでコンテナのファイルシステム変更を検査する方法"}} docker/ps -.-> lab-555107{{"docker container diff コマンドでコンテナのファイルシステム変更を検査する方法"}} docker/rm -.-> lab-555107{{"docker container diff コマンドでコンテナのファイルシステム変更を検査する方法"}} docker/exec -.-> lab-555107{{"docker container diff コマンドでコンテナのファイルシステム変更を検査する方法"}} docker/inspect -.-> lab-555107{{"docker container diff コマンドでコンテナのファイルシステム変更を検査する方法"}} docker/pull -.-> lab-555107{{"docker container diff コマンドでコンテナのファイルシステム変更を検査する方法"}} docker/images -.-> lab-555107{{"docker container diff コマンドでコンテナのファイルシステム変更を検査する方法"}} end

Nginx コンテナの実行

このステップでは、Docker コンテナ内でシンプルな Nginx ウェブサーバーを実行する方法を学びます。Docker を使用すると、アプリケーションとその依存関係をコンテナにパッケージ化でき、異なる環境間で一貫して動作させることができます。

まず、システム上に Nginx イメージが利用可能か確認する必要があります。Docker Hub から公式の Nginx イメージをdocker pullコマンドで取得できます。このコマンドはイメージをローカルマシンにダウンロードします。

docker pull nginx:latest

イメージがダウンロードされていることを示す出力が表示されます。ダウンロードが完了したら、システム上のイメージをリスト表示して確認できます:

docker images

出力にnginxが表示されるはずです。

では、Nginx コンテナを実行しましょう。docker runコマンドを使用します。-dフラグはコンテナをデタッチドモード(バックグラウンド)で実行し、-p 80:80フラグはホストマシンのポート 80 をコンテナ内のポート 80 にマッピングします。これにより、ホストのブラウザから Nginx ウェブサーバーにアクセスできます。また、--name my-nginx-containerでコンテナに名前を付け、識別しやすくします。

docker run -d -p 80:80 --name my-nginx-container nginx

コマンド実行後、Docker は長い文字列(コンテナ ID)を出力します。これはコンテナがバックグラウンドで正常に起動したことを示します。

コンテナが実行中か確認するには、docker psコマンドを使用します。このコマンドは実行中のコンテナをすべてリスト表示します:

docker ps

my-nginx-containerUpステータスで表示されるはずです。

最後に、ホストマシンから Nginx ウェブサーバーにアクセスしてみましょう。ポート 80 をマッピングしたので、curlを使用してlocalhostのポート 80 に HTTP リクエストを送信できます。

curl localhost

出力に Nginx のデフォルトウェルカムページの HTML が表示されます。これで Nginx コンテナが実行中でアクセス可能なことが確認できました。

docker container diff を使用した初期ファイルシステム変更の検査

このステップでは、Docker コンテナ起動時に発生するファイルシステム変更を検査する方法を探ります。Docker はレイヤードファイルシステムを使用しており、コンテナが実行されると、イメージレイヤーの上に新しい書き込み可能レイヤーが追加されます。docker container diffコマンドを使用すると、コンテナ作成以降にこの書き込み可能レイヤーで発生した差分を確認できます。

docker container diffコマンドはコンテナ名または ID を引数として受け取ります。前のステップで起動した Nginx コンテナの名前my-nginx-containerを使用します。

docker container diff my-nginx-container

コンテナ起動直後にこのコマンドを実行すると、ファイルとディレクトリのリストが表示されます。この出力は、ベースイメージに対するコンテナのファイルシステムの変更を示しています。出力フォーマットは通常以下の通りです:

  • A - ファイルまたはディレクトリが追加されたことを示す
  • C - ファイルまたはディレクトリが変更されたことを示す
  • D - ファイルまたはディレクトリが削除されたことを示す

最初に表示される変更は、多くの場合コンテナの起動プロセスに関連するもので、一時ファイルやログファイルの作成、システムディレクトリの変更などが含まれます。これらはコンテナ起動時に書き込み可能レイヤーで作成または変更されたファイルやディレクトリです。

これらの初期変更を理解することで、コンテナ起動時の内部動作や書き込み可能レイヤーがどのように構築されるかを把握できます。

コンテナ内での変更の実施

このステップでは、実行中の Nginx コンテナ内でファイルシステムに変更を加えます。これにより、コンテナ内での変更が書き込み可能レイヤーにどのように記録されるかを示します。

docker execコマンドを使用して、コンテナ内でコマンドを実行します。docker execコマンドは実行中のコンテナ内でコマンドを実行することを可能にします。コンテナ名 (my-nginx-container) と実行したいコマンドを指定する必要があります。

まず、コンテナの/tmpディレクトリ内に新しいファイルを作成します。touchコマンドを使用します。

docker exec my-nginx-container touch /tmp/my_new_file.txt

このコマンドはmy-nginx-container内でtouch /tmp/my_new_file.txtを実行します。コマンドが成功した場合、出力は表示されません。

次に、デフォルトの Nginx インデックスファイルを変更します。デフォルトの Nginx ウェルカムページは通常、コンテナ内の/usr/share/nginx/html/index.htmlにあります。echoコマンドを使用して、このファイルにテキストを追加します。

docker exec my-nginx-container echo "<h1>Hello from LabEx!</h1>" >> /usr/share/nginx/html/index.html

このコマンドは HTML 文字列"

Hello from LabEx!

"をコンテナ内のindex.htmlファイルに追加します。

変更が行われたことを確認するために、ホストマシンから再度curlを使用して Nginx サーバーにアクセスできます。

curl localhost

元の Nginx ウェルカムページの内容に続いて"

Hello from LabEx!

"が表示されるはずです。これにより、コンテナ内のindex.htmlファイルが変更されたことが確認できます。

私たちが行ったこれらの変更(新しいファイルの作成と既存ファイルの変更)は、my-nginx-containerの書き込み可能レイヤーに記録されています。次のステップでは、再度docker container diffを使用してこれらの具体的な変更を確認します。

docker container diff を使用した更新後のファイルシステム変更の検査

この最終ステップでは、docker container diff コマンドを再度使用して、前のステップで行ったファイルシステムの変更を観察します。これにより、コンテナ内での操作がどのように書き込み可能レイヤーに反映されるかが明確に示されます。

前のステップでは、my-nginx-container 内で新しいファイル /tmp/my_new_file.txt を作成し、/usr/share/nginx/html/index.html ファイルを変更しました。ここで、再度 docker container diff を実行してみましょう。

docker container diff my-nginx-container

今回の出力には、私たちが行った変更が含まれているはずです。以下のような行が表示されます:

A /tmp/my_new_file.txt
C /usr/share/nginx/html/index.html

A /tmp/my_new_file.txt の行は、/tmp ディレクトリに my_new_file.txt という新しいファイルが追加されたことを示しています。
C /usr/share/nginx/html/index.html の行は、/usr/share/nginx/html/ ディレクトリ内の index.html ファイルが変更されたことを示しています。

この出力は、docker container diff がコンテナ起動以降のファイルシステムへの変更を効果的に表示することを確認しています。これらの変更はコンテナの書き込み可能レイヤーに保存されており、ベースイメージレイヤーとは分離されています。これは Docker のレイヤードファイルシステムと、コンテナが状態を維持する方法の基本的な概念です。

コンテナを削除すると、この書き込み可能レイヤーも削除され、ボリュームやバインドマウント(別の実験で扱うトピック)を使用して永続化しない限り、コンテナ内で行ったすべての変更が失われます。

後片付けとして、コンテナを停止して削除できます:

docker stop my-nginx-container
docker rm my-nginx-container

これで docker container diff の探求は完了です。コンテナ起動時の初期ファイルシステム変更を検査する方法と、実行中のコンテナ内で行った変更を確認する方法を学びました。

まとめ

この実験では、docker runを使用して簡単な Nginx コンテナを実行する方法を学びました。ポートマッピングによるアクセスを確保し、docker psでステータスを確認しました。その後、docker container diffコマンドを使用して、コンテナ作成時にイメージレイヤーによって導入された初期ファイルシステムの変更を検査する方法を探求しました。

続いて、実行中のコンテナのファイルシステム内で変更を加える実践を行い、再度docker container diffを使用してこれらの変更が Docker によってどのように追跡・反映されるかを観察し、理解しました。これにより、コンテナの現在の状態とベースイメージとの差異を特定するこのコマンドの有用性が明らかになりました。