Dockerイメージとコンテナーの違い
1. 概要
Dockerは、アプリケーションを簡単に作成、デプロイ、実行するためのツールです。 これにより、アプリケーションをすべての依存関係とともにパッケージ化し、それらを個別のバンドルとして配布できます。 Dockerは、アプリケーションがすべてのDockerインスタンスで同じように実行されることを保証します。
Dockerの使用を開始するとき、 2つの主要な概念を明確にする必要があります—イメージとコンテナー。
このチュートリアルでは、それらが何であるか、およびそれらがどのように異なるかを学習します。
2. Dockerイメージ
イメージは、正しく実行するために必要なすべての依存関係を持つパッケージ化されたアプリケーションを表すファイルです。 つまり、DockerイメージはJavaクラスのようなものだと言えます。
画像は一連のレイヤーとして構築されます。 レイヤーは互いに積み重ねられます。 では、レイヤーとは何ですか? 簡単に言えば、レイヤーは画像です。
HelloWorldJavaアプリケーションのDockerイメージを作成するとします。 最初に考える必要があるのは、アプリケーションに何が必要かということです。
まず、Javaアプリケーションであるため、JVMが必要になります。 OK、これは簡単に思えますが、JVMは何を実行する必要がありますか? オペレーティングシステムが必要です。 したがって、 Dockerイメージには、オペレーティングシステムレイヤー、JVM、およびHelloWorldアプリケーションが含まれます。
Dockerの主な利点は、その大きなコミュニティです。 イメージを構築する場合は、 Docker Hub に移動して、必要なイメージが利用可能かどうかを検索できます。
PostgreSQLデータベースを使用してデータベースを作成するとします。 新しいPostgreSQLイメージを最初から作成する必要はありません。 Docker Hubに移動し、PostgresSQLのDocker公式イメージ名である postgres を検索し、必要なバージョンを選択して実行します。
Docker Hubから作成またはプルするすべてのイメージは、ファイルシステムに保存され、名前とタグで識別されます。 また、画像IDで識別できます。
docker images コマンドを使用すると、ファイルシステムで使用可能なイメージのリストを表示できます。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
postgres 11.6 d3d96b1e5d48 4 weeks ago 332MB
mongo latest 9979235fc504 6 weeks ago 364MB
rabbitmq 3-management 44c4867e4a8b 8 weeks ago 180MB
mysql 8.0.18 d435eee2caa5 2 months ago 456MB
jboss/wildfly 18.0.1.Final bfc71fe5d7d1 2 months ago 757MB
flyway/flyway 6.0.8 0c11020ffd69 3 months ago 247MB
java 8-jre e44d62cf8862 3 years ago 311MB
3. Dockerイメージの実行
イメージは、イメージ名とタグを指定して dockerrunコマンドを使用して実行されます。 postgres11.6イメージを実行したいとします。
docker run -d postgres:11.6
-dオプションが提供されていることに注意してください。 これは、Dockerにイメージをバックグラウンドで実行するように指示します—デタッチモードとも呼ばれます。
docker ps コマンドを使用して、イメージが実行されているかどうかを確認できます。次のコマンドを使用する必要があります。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3376143f0991 postgres:11.6 "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 5432/tcp tender_heyrovsky
上記の出力のCONTAINERIDに注意してください。 コンテナとは何か、そしてそれが画像とどのように関連しているかを見てみましょう。
4. Dockerコンテナ
コンテナは画像のインスタンスです。 各コンテナは、そのIDで識別できます。 Java開発の例えに戻ると、コンテナはクラスのインスタンスのようなものであると言えます。
Dockerは、コンテナーに対して7つの状態を定義します。 ] exited 、およびdead。 これを知ることは重要です。 コンテナはイメージの単なるインスタンスであるため、実行する必要はありません。
ここで、上で見たrunコマンドについてもう一度考えてみましょう。 イメージを実行するために使用されると言いましたが、それは完全に正確ではありません。 真実は、 run コマンドを使用して、イメージの新しいコンテナーを作成および開始することです。
大きな利点の1つは、コンテナが軽量VMのようなものであるということです。 それらの動作は互いに完全に分離されています。 これは、同じイメージの複数のコンテナーを実行でき、それぞれが異なるデータと異なるIDを持つ異なる状態にあることを意味します。
同じイメージの複数のコンテナーを同時に実行できることは、アプリケーションを簡単にスケーリングできるため、大きな利点です。 たとえば、マイクロサービスについて考えてみましょう。 すべてのサービスがDockerイメージとしてパッケージ化されている場合、それは新しいサービスをオンデマンドでコンテナーとしてデプロイできることを意味します。
5. コンテナのライフサイクル
先ほど、コンテナーの7つの状態について説明しました。次に、dockerコマンドラインツールを使用してさまざまなライフサイクル状態を処理する方法を見てみましょう。
新しいコンテナを起動するには、作成してから、起動する必要があります。 これは、実行する前に作成状態を通過する必要があることを意味します。 これを行うには、コンテナを明示的に作成して開始します。
docker container create <image_name>:<tag>
docker container start <container_id>
または、runコマンドを使用してこれを簡単に行うことができます。
docker run <image_name>:<tag>
実行中のコンテナーを一時停止してから、再度実行状態にすることができます。
docker pause <container_id>
docker unpause <container_id>
プロセスを確認すると、一時停止したコンテナのステータスとして「一時停止」が表示されます。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9bef2edcad7b postgres:11.6 "docker-entrypoint.s…" 5 minutes ago Up 4 minutes (Paused) 5432/tcp tender_heyrovsky
実行中のコンテナを停止してから再実行することもできます。
docker stop <container_id>
docker start <container_id>
そして最後に、コンテナを削除できます。
docker container rm <container_id>
削除できるのは、停止状態または作成済みの状態のコンテナーのみです。
Dockerコマンドの詳細については、Dockerコマンドラインリファレンスを参照してください。
6. 結論
この記事では、Dockerイメージとコンテナー、およびそれらの違いについて説明しました。 画像は、アプリケーションとその実行方法を説明しています。 コンテナはイメージインスタンスであり、同じイメージの複数のコンテナをそれぞれ異なる状態で実行できます。
また、コンテナーのライフサイクルについても説明し、コンテナーを管理するための基本的なコマンドを学習しました。
基本を理解したので、Dockerのエキサイティングな世界についてさらに学び、知識を増やし始めましょう。