この記事では、docker におけるコンテナーとイメージの違いについて紹介します。
(推奨チュートリアル: docker チュートリアル)
Docker テクノロジについてまだ少し理解しているときに、次のことに気づきました。 Docker のコマンドは非常に難しいことがわかりました。そこで、私は数週間かけて Docker の仕組み、具体的にはユニオン ファイル システムの仕組みを学び、その後 Docker コマンドを振り返ってみると、すべてがうまくまとまっていて、非常にシンプルでした。
余談: 個人的には、テクノロジーを習得し、それを合理的に使用するための最良の方法は、テクノロジーの背後にある動作原理を深く理解することです。通常、新しいテクノロジーの誕生にはメディアの誇大宣伝が伴い、ユーザーはテクノロジーの本質を理解しにくくなります。むしろ、新しいテクノロジーは常に新しい用語や比喩を発明して、情報を提供するのに役立ちます。
これは初期段階では非常に役立ちますが、テクノロジーの原理にサンドペーパーの層を置くことになり、後の段階でユーザーがテクノロジーの本当の意味を習得するのには役立ちません。
Git が良い例です。以前は Git をあまり使いこなせなかったので、時間をかけて Git の原理を学び、そのとき初めて Git の使い方を本当に理解することができました。 Git の内部を真に理解している人だけがこのツールを使いこなすことができると私は強く信じています。
画像は、多数の読み取り専用レイヤーの統一された視点です。この定義を理解するのは少し難しいかもしれません。次の図は、読者の理解を助けることができます。ミラーの定義。
左から、重なっている複数の読み取り専用レイヤーが表示されます。一番下のレイヤーを除いて、他のすべてのレイヤーには次のレイヤーを指すポインターが表示されます。これらのレイヤーは Docker 内の実装の詳細であり、ホスト (翻訳者注: Docker を実行しているマシン) のファイル システム上でアクセスできます。ユニオン ファイル システム テクノロジは、さまざまなレイヤーを 1 つのファイル システムに統合し、これらのレイヤーに統一された視点を提供することで、複数のレイヤーの存在を隠します。ユーザーの観点からは、1 つのファイル システムのみが存在します。この視点がどのように見えるかを画像の右側で確認できます。
これらのレイヤーに関するファイルは、ホスト ファイル システム上にあります。これらのレイヤーは、実行中のコンテナー内では表示されないことに注意してください。私のホストでは、これらが /var/lib/docker/aufs ディレクトリに存在することがわかりました。
/var/lib/docker/ ├── aufs ├── containers ├── graph ├── init ├── linkgraph.db ├── repositories-aufs ├── tmp ├── trust └── volumes 7 directories, 2 files
コンテナ定義
コンテナ(container)の定義とほぼ同じです。画像 (イメージ) の統合されたパースペクティブでもありますが、唯一の違いは、コンテナーの最上位レイヤーが読み取りおよび書き込み可能であることです。
注意深い読者は、コンテナの定義でコンテナが実行されているかどうかについて言及していないことに気づくかもしれませんが、これは意図的なものです。この発見は、私が混乱していた多くのことを理解するのに役立ちました。
キーポイント: コンテナ = 画像読み取り可能なレイヤー。また、コンテナの定義には、コンテナを実行するかどうかについては言及されていません。
次に、コンテナの実行について説明します。
実行コンテナ (実行コンテナ) は、読み取りおよび書き込み可能な統合ファイル システムと、分離されたプロセス スペースおよびそこに含まれるプロセスとして定義されます。以下の画像は、実行中のコンテナーを示しています。
Docker を有望なテクノロジにしているのは、ファイル システム分離テクノロジです。コンテナ内のプロセスはファイルを変更、削除、または作成する可能性があり、これらの変更は読み取り/書き込みレイヤーに影響します。以下の図は、この動作を示しています。
我们可以通过运行以下命令来验证我们上面所说的:
docker run ubuntu touch happiness.txt
即便是这个ubuntu容器不再运行,我们依旧能够在主机的文件系统上找到这个新文件。
/var/lib/docker/aufs/diff/860a7b...889/happiness.txt
Image Layer Definition
为了将零星的数据整合起来,我们提出了镜像层(image layer)这个概念。下面的这张图描述了一个镜像层,通过图片我们能够发现一个层并不仅仅包含文件系统的改变,它还能包含了其他重要信息。
元数据(metadata)就是关于这个层的额外信息,它不仅能够让Docker获取运行和构建时的信息,还包括父层的层次信息。需要注意,只读层和读写层都包含元数据。
除此之外,每一层都包括了一个指向父层的指针。如果一个层没有这个指针,说明它处于最底层。
Metadata Location:
我发现在我自己的主机上,镜像层(image layer)的元数据被保存在名为”json”的文件中,比如说:
/var/lib/docker/graph/e809f156dc985.../json
e809f156dc985...就是这层的id
一个容器的元数据好像是被分成了很多文件,但或多或少能够在/var/lib/docker/containers/
现在,让我们结合上面提到的实现细节来理解Docker的命令。
docker create 命令为指定的镜像(image)添加了一个可读写层,构成了一个新的容器。注意,这个容器并没有运行。
Docker start命令为容器文件系统创建了一个进程隔离空间。注意,每一个容器只能够有一个进程隔离空间。
看到这个命令,读者通常会有一个疑问:docker start 和 docker run命令有什么区别。
図からわかるように、docker run コマンドは最初にイメージを使用してコンテナーを作成し、次にコンテナーを実行します。このコマンドは 2 つのコマンドの詳細を隠して非常に便利ですが、その一方でユーザーが誤解しやすい点もあります。
余談: Git に関する前のトピックの続きですが、docker run コマンドは git pull コマンドに似ていると思います。 git pull コマンドは git fetch と git merge を組み合わせたもので、同様に docker run は docker create と docker start を組み合わせたものです。
docker ps コマンドは、実行中のすべてのコンテナーを一覧表示します。これにより、実行されていないコンテナの存在が隠蔽されます。これらのコンテナを見つけたい場合は、次のコマンドを使用する必要があります。
docker ps –a コマンドは、実行中か停止中かにかかわらず、すべてのコンテナーを一覧表示します。
dockerimages コマンドは、すべてのトップレベル イメージを一覧表示します。実際、ここではミラーと読み取り専用レイヤーを区別する方法がないため、トップレベルのミラーリングを提案します。トップレベルイメージと呼べるのは、コンテナ作成時に使用したイメージ、または直接プルダウンしたイメージのみであり、各トップレベルイメージの下には複数のイメージレイヤーが隠されています。
dockerimages –a コマンドはすべてのイメージを一覧表示しますが、これは読み取り可能なすべてのイメージを一覧表示するとも言えます。特定のイメージ ID の下にあるすべてのレイヤーを表示したい場合は、Docker 履歴を使用して表示できます。
docker stop コマンドは、実行中のコンテナに SIGTERM シグナルを送信し、すべてのプロセスを停止します。 。
docker kill コマンドは、コンテナ Signal 内で実行されているすべてのプロセスに非フレンドリーな SIGKILL を送信します。
docker stop および docker kill コマンドは、実行中のプロセス docker に UNIX シグナルを送信します。一時停止コマンドは異なり、cgroup の特性を使用して、実行中のプロセス空間を一時停止します。具体的な内部原則は www.kernel.org/doc/Doc... で確認できますが、この方法の欠点は、SIGTSTP シグナルの送信がプロセスが理解できるほど単純ではないため、すべてを停止できないことです。プロセス。
docker rm コマンドは、コンテナを構成する読み取り/書き込み層を削除します。このコマンドは、実行されていないコンテナーでのみ実行できることに注意してください。
docker rmi コマンドは、イメージを構成する読み取り専用レイヤーを削除します。 docker rmi を使用して最上位層 (ミラーとも言えます) を削除することのみができますが、-f パラメーターを使用して中間の読み取り専用層を強制的に削除することもできます。
docker commit コマンドは、コンテナの読み取り/書き込みレイヤーを読み取り専用レイヤーに変換します。レイヤーなので、コンテナを不変のイメージに変換します。
docker build コマンドは非常に興味深いもので、複数のコマンドを繰り返し実行します。
上の図から、ビルド コマンドが Dockerfile ファイルの FROM 命令に従ってイメージを取得し、1) 実行 (作成) を繰り返していることがわかります。開始)、2) 変更、3) コミット。ループ内の各ステップで新しいレイヤーが生成されるため、多数の新しいレイヤーが作成されます。
docker exec コマンドは、実行中のコンテナで新しいプロセスを実行します。
docker Inspection コマンドは、コンテナまたはイメージのメタデータ。
docker save コマンドは、別のホストに保存できる圧縮イメージ ファイルを作成します。 Docker で使用されます。エクスポート コマンドとは異なり、このコマンドはレイヤーごとにメタデータを保存します。このコマンドはイメージに対してのみ有効です。
docker import コマンドは tar ファイルを作成し、メタデータと不要なレイヤーを削除し、複数のレイヤーを統合しますを 1 つのレイヤーにまとめ、現在の統合パースペクティブから見たコンテンツのみを保存します (翻訳者注: expoxt の後のコンテナは Docker にインポートされ、docker Images –tree コマンドを通じて表示できるイメージは 1 つだけです。保存後のイメージは異なります) 、この画像の歴史的な画像を見ることができます)。
dockerhistory コマンドは、指定されたイメージの履歴イメージを再帰的に出力します。
以上がDocker のコンテナとイメージの違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。