プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2022/04/26

[Docker] Image, Container, Node, Service, Stack などの概念

update2023/11/14 event_note2022/04/26 1:13

Docker について、特に Swarm モードを使い始めるとここらへんの概念がややこしくなってきたので、整理してみました。

ただ当ブログ全般に言えますが、私自身が正しく理解できているかどうかは自信がないので、あくまで参考ということで、内容の保証はいたしかねます。

概念図

以下のページの図がわかりやすかったです。

これを踏まえつつ、とりあえず簡単に理解するためには以下のような感じでよいのかなと思います。

Docker イメージ

イメージは、アプリケーションのコード、ランタイム、ライブラリ、環境変数、構成ファイルなど、アプリケーションの実行に必要なすべてのものを含んだ、実行可能パッケージです。
このイメージを動作させるためにインスタンス化したものがコンテナと言えます。

Docker コンテナ

コンテナは Docker における最小の動作単位です。
コンテナはイメージから作成されます。
上述のページでは、コンテナはイメージのランタイムインスタンスである、という言い方をしていますが、イメージを実際に動作可能にしたものがコンテナである、と言ってもいいかもしれません。

コンテナを動作させると、ホストからは一つのプロセスとして認識されます。
カーネルはホストと共有しています。

尚、イメージおよびコンテナはレイヤー構造となっており、各レイヤーはベースレイヤーとの差分情報を持っています。
ここらへん、以下のページがわかりやすかったです。

また、コンテナ内で動かすアプリケーションは1つにするのが基本だそうです。
理由などは以下を見ていただくのが早いです。

データボリューム

コンテナ内にデータを保存した場合、コンテナの破棄とともにそのデータも消えてしまいます。
そのため、データが消えてしまわないように永続化する際に使うのがデータボリュームです。

データボリュームはコンテナ内の指定したパスにマウントして使います。

docker-compose

前述したとおり、Docker では1つのコンテナで1つのアプリケーションを動かすのが基本です。
しかし、実際のシステムでは複数のアプリケーションが連携して動作するものが多いと思います。
そういった複数のコンテナ(アプリケーション)が連携して動作するシステムについて、イメージのビルドや依存関係を考慮して各コンテナの起動・停止などを簡単に行えるようにできるツールが docker-compose です。

Swarm モード

Swarm モードは Docker 自体に含まれるオーケストレーション機能です。
複数の Docker ホストをまとめて、クラスタを構成することができます。

ノード

ノードは Swarm モードによるクラスタを構成する単位で、Docker ホスト1つにつきノードを1つ作成することになります。

例えば、2つの物理マシン上でそれぞれ Docker を使っている場合は、各マシンにノードを作成してクラスタを構成します。
ただし、VirtualBox や WSL などの仮想環境を使うと一つの物理マシン上で複数の Docker ホストが存在することもあるので、必ずしも「ノードの数=マシンの数」となるわけではありません。

尚、ノードにはクラスタ全体を管理する manager ノードと、コンテナを実行する worker ノードがあります。

サービスとタスク

Swarm モードにおいて、ノードの作成の次はサービスの作成を行います。 サービスを作成すると、タスク(コンテナ)が作成されて、各ノードに配置されます。 タスクというのはコンテナを起動したりするやつで、よくわからなければ基本的にタスク≒コンテナと考えてよさそうです。

つまり、サービスを作成するとは、同じ機能を持ったタスク(コンテナ)を複数作成して(レプリカセット)、各ノードに配置するということになります。 この各ノードに配置されたタスク(コンテナ)のレプリカセットがサービスです。

非 Swarm モードにおけるコンテナ作成(つまり普通にコンテナを作成する場合)が、Swarm モード有効時ではサービスを作成することに相当する、と考えればわかりやすいかもしれません。

従って、1つのコンテナでは基本的に1つのアプリケーションしか動いていないのと同様に、1つサービスでは基本的に1つの機能しか持っていません。
レプリカがあるためタスク(コンテナ)自体は複数ありますがが(冗長化)、機能としてはタスク(コンテナ)1つ分しかありません。
そのため、複数のサービスが連携して動作するシステムの場合、次のスタックを使うことになります。

スタック

サービスの集合体がスタックです。
非 Swarm モードで依存関係のあるコンテナを一度に起動・終了したりする場合、前述したように docker-compose を使ったりしますが、これが Swarm モードではスタックに相当します。 非 Swarm モードにおける コンテナと docker-compose の関係が、Swarm モードではサービスとスタックの関係になる、といえばわかりやすいかもしれません。

スタックでは基本的に docker-compose.yml がそのまま使えますが、一部使えない項目や、逆に必要となる項目などもあるので、こちらはまた別途記事を作成したいと思います。

オーバーレイネットワーク

Swarm モードでは、Docker ホスト間を相互接続するために、オーバーレイネットワークが作成されます。
デフォルトで Ingress という名前のオーバーレイネットワークが作成されます。