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のエキサイティングな世界についてさらに学び、知識を増やし始めましょう。