Docker の使い方(その5:ネットワーク)
前回、「Docker の使い方(その4:ボリューム)」の続きです。今回はネットワークについてです。
複数のコンテナを連携させる
これまでは1つのコンテナについて説明してきましたが、 複数のコンテナを連携させたい場合はどうすればよいでしょうか。 例えば、Webサーバーコンテナと、DBサーバーコンテナを通信させたいような場合です。 Docker にはコンテナ同士で通信するためのネットワークという機能があります。
ネットワーク
Docker におけるコンテナ同士の通信の考え方はかなりシンプルです。 ネットワークエンジニアのような専門的な知識は不要なので安心してください。 覚えておかなければならないルールは1つだけです。
2つのコンテナが同じネットワーク上にある場合、それらは互いに通信できます(そうでなければ、できません)。
これだけです。
コンテナはそれぞれが独立しているため、基本的に他のコンテナのことは知りません。 しかし、同じネットワークに所属していれば、コンテナ同士で通信することができます。
1つのコンテナは複数のネットワークに所属することができます。 そのため、ネットワークの作り方によってはかなり複雑なことも可能です。
ネットワークエイリアス
では、実際に同じネットワーク上にある別のコンテナに接続するにはどうすればよいでしょうか? もちろんIPアドレスが必要です。 各コンテナには独自のIPアドレスが割り振られます。 しかし、そのIPアドレスを直接指定するよりは、名前で指定できた方が便利です。 名前を使用して接続することで、接続先のコンテナのIPアドレスを知らなくても、 IPアドレスが変わってしまったとしても、ちゃんと接続することができます。
この名前がネットワークエイリアスです。 ネットワークの中のコンテナには、そのネットワークの中だけで使用できるエイリアス(つまり別名)を付けることができ、 それをIPアドレスの代わりとして使用することができます。
ネットワークの中だけで使用できるホスト名やドメイン名のようなものです。
ネットワークの一覧を表示する
ネットワークの一覧を表示するには、docker network ls
コマンドを使用します。
docker network ls
NETWORK ID NAME DRIVER SCOPE d4010e0176e1 bridge bridge local 3ded7e976080 host host local 82bf65a60087 none null local
ちなみに上記の3つのネットワークは、Docker のインストール時に自動で生成されたネットワークで、削除することはできません。 この3つのネットワークの詳しい説明は割愛します。詳しく知りたい場合は Docker のドキュメントを参照してください。
ネットワークを作成する
ネットワークを作成するには、docker network create
コマンドを使用します。
ネットワークには名前が付けられますので、わかりやすい名前を付けましょう。
docker network create <ネットワークの名前>
docker network create test-net
ネットワークにコンテナを追加する
ネットワークにコンテナを追加するには、コンテナ作成時に行うか、コンテナ作成後に行うかの2通りがあります。
コンテナ作成時に追加する
コンテナ作成時にネットワークに追加するには、
docker container create
/ docker container run
コマンドに、--network
オプションを使用します。
--network <ネットワークのIDもしくは名前>
docker container run -d --network test-net docker/getting-started
ネットワークエイリアスを使用する
ネットワークエイリアスを使用するには、さらに --network-alias
オプションを使用します。
--network-alias <ネットワークエイリアス>
ネットワーク名「test-net」に追加し、ネットワークエイリアスを「test-host」とする
docker container run -d --network test-net --network-alias test-host docker/getting-started
コンテナ作成後に追加する
コンテナ作成後にネットワークに追加するには、
docker network connect
コマンドを使用します。
docker network connect <ネットワークのIDもしくは名前> <コンテナのIDもしくは名前>
docker network connect test-net test-app
ネットワークエイリアスを使用する
ネットワークエイリアスを使用するには、--alias
オプションを使用します。
docker network connect --alias <ネットワークエイリアス> <ネットワークのIDもしくは名前> <コンテナのIDもしくは名前>
docker network connect --alias test-host test-net test-app
ネットワークの詳しい情報を表示する
ネットワークの詳しい情報を表示するには、docker network inspect
コマンドを使用します。
出力内容の Containers
欄にネットワークに追加しているコンテナの一覧が表示されます。
docker network inspect <ネットワークのIDもしくは名前>
docker network inspect test-net
[ { "Name": "test-net", "Id": "c0765a52acc0b6a9cb09af19e9fffe3a2bdca2eb7ff6b94aa598044a87de84c5", "Created": "2022-02-05T07:59:30.198087Z", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "172.22.0.0/16", "Gateway": "172.22.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "a9fa436fe3bca9a6796723be117cfd54ec988d0a4cbba6090c70f27ab32b2c73": { "Name": "relaxed_hertz", "EndpointID": "654c21ce2a617c62f0247c3bea1c8cee1560568618d7c05bea1ff07afc33316e", "MacAddress": "02:42:ac:16:00:03", "IPv4Address": "172.22.0.3/16", "IPv6Address": "" }, "c2bb8e8a397feae8c826bb0f7218a89380683ee6eae12efc1d1c6dfc56c18dd5": { "Name": "silly_swartz", "EndpointID": "2166538f84be99ebe3baa1558d9889597398193b58eda1a664ab2e62b72b36c5", "MacAddress": "02:42:ac:16:00:02", "IPv4Address": "172.22.0.2/16", "IPv6Address": "" } }, "Options": {}, "Labels": {} } ]
ネットワークからコンテナを外す
ネットワークからコンテナを外すには、docker network disconnect
コマンドを使用します。
docker network disconnect <ネットワークのIDもしくは名前> <コンテナのIDもしくは名前>
docker network disconnect test-net test-app
ネットワークを削除する
ネットワークを削除するには、docker network rm
コマンドを使用します。
docker network rm <ネットワークのIDもしくは名前>
docker network rm test-net
未使用のネットワークを全て削除する
未使用のネットワークがたくさんあって、1つ1つ削除するのがメンドウな場合には、 docker network prune
コマンドが便利です。
このコマンドを使用すると、未使用のネットワークが全て削除されます。
docker network prune
参考サイト
- Multi container apps | Docker Documentation
- Docker コンテナ・ネットワークの理解 — Docker-docs-ja 19.03 ドキュメント
- docker network ls | Docker Documentation
- docker network create | Docker Documentation
- docker network connect | Docker Documentation
- docker network inspect | Docker Documentation
- docker network disconnect | Docker Documentation
- docker network rm | Docker Documentation
- docker network prune | Docker Documentation