Docker の使い方(その5:ネットワーク)

この記事は最終更新日から 2年以上 が経過しています。

前回、「Docker の使い方(その4:ボリューム)」の続きです。今回はネットワークについてです。

複数のコンテナを連携させる

これまでは1つのコンテナについて説明してきましたが、 複数のコンテナを連携させたい場合はどうすればよいでしょうか。 例えば、Webサーバーコンテナと、DBサーバーコンテナを通信させたいような場合です。 Docker にはコンテナ同士で通信するためのネットワークという機能があります。

ネットワーク

Docker におけるコンテナ同士の通信の考え方はかなりシンプルです。 ネットワークエンジニアのような専門的な知識は不要なので安心してください。 覚えておかなければならないルールは1つだけです。

2つのコンテナが同じネットワーク上にある場合、それらは互いに通信できます(そうでなければ、できません)。

これだけです。

コンテナはそれぞれが独立しているため、基本的に他のコンテナのことは知りません。 しかし、同じネットワークに所属していれば、コンテナ同士で通信することができます。

network.png

1つのコンテナは複数のネットワークに所属することができます。 そのため、ネットワークの作り方によってはかなり複雑なことも可能です。

network2.png

ネットワークエイリアス

では、実際に同じネットワーク上にある別のコンテナに接続するにはどうすればよいでしょうか? もちろんIPアドレスが必要です。 各コンテナには独自のIPアドレスが割り振られます。 しかし、そのIPアドレスを直接指定するよりは、名前で指定できた方が便利です。 名前を使用して接続することで、接続先のコンテナのIPアドレスを知らなくても、 IPアドレスが変わってしまったとしても、ちゃんと接続することができます。

この名前がネットワークエイリアスです。 ネットワークの中のコンテナには、そのネットワークの中だけで使用できるエイリアス(つまり別名)を付けることができ、 それをIPアドレスの代わりとして使用することができます。

ネットワークの中だけで使用できるホスト名やドメイン名のようなものです。

network_alias.png

ネットワークの一覧を表示する

ネットワークの一覧を表示するには、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 <ネットワークの名前>
例:ネットワーク名が「test-net」のネットワークを作成する
docker network create test-net

ネットワークにコンテナを追加する

ネットワークにコンテナを追加するには、コンテナ作成時に行うか、コンテナ作成後に行うかの2通りがあります。

コンテナ作成時に追加する

コンテナ作成時にネットワークに追加するには、 docker container create / docker container run コマンドに、--network オプションを使用します。

書式
--network <ネットワークのIDもしくは名前>
例:コンテナイメージ「docker/getting-started」を起動時に、ネットワーク名「test-net」に追加する
docker container run -d --network test-net docker/getting-started

ネットワークエイリアスを使用する

ネットワークエイリアスを使用するには、さらに --network-alias オプションを使用します。

書式
--network-alias <ネットワークエイリアス>
例:コンテナイメージ「docker/getting-started」を起動時に、
ネットワーク名「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もしくは名前>
例:ネットワーク名「test-net」に、コンテナ名「test-app」を追加する
docker network connect test-net test-app

ネットワークエイリアスを使用する

ネットワークエイリアスを使用するには、--alias オプションを使用します。

書式
docker network connect --alias <ネットワークエイリアス> <ネットワークのIDもしくは名前> <コンテナのIDもしくは名前>
例:ネットワーク名「test-net」に、コンテナ名「test-app」を追加し、ネットワークエイリアスを「test-host」とする
docker network connect --alias test-host test-net test-app

ネットワークの詳しい情報を表示する

ネットワークの詳しい情報を表示するには、docker network inspect コマンドを使用します。 出力内容の Containers 欄にネットワークに追加しているコンテナの一覧が表示されます。

書式
docker network inspect <ネットワークのIDもしくは名前>
例:ネットワーク名「test-net」の詳しい情報を表示する
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もしくは名前>
例:ネットワーク名「test-net」から、コンテナ名「test-app」を外す
docker network disconnect test-net test-app

ネットワークを削除する

ネットワークを削除するには、docker network rm コマンドを使用します。

書式
docker network rm <ネットワークのIDもしくは名前>
例:ネットワーク名「test-net」を削除する
docker network rm test-net

未使用のネットワークを全て削除する

未使用のネットワークがたくさんあって、1つ1つ削除するのがメンドウな場合には、 docker network prune コマンドが便利です。 このコマンドを使用すると、未使用のネットワークが全て削除されます。

書式
docker network prune

参考サイト

関連記事

最近では、アプリケーションの実行環境の構築に Docker を使うことも珍しくなくなりました。Docker は便利ではあるのかもしれませんが、難しく感じて敬遠されている人もいるのではないでしょうか。その感覚はおそらく間違っていません。実際、知れば知るほど奥が深い技術だと感じてしまいます。もはや沼というか深淵を覗いている ...
前回、「Docker の使い方(その1:概要)」の続きです。今回はコンテナについてです。コンテナの一覧を表示するコンテナの一覧を表示するには、Docker Desktop から行う方法と、コマンドで行う方法の2種類があります。Docker Desktop でコンテナの一覧を表示するDocker Desktop でコンテ ...
前回、「Docker の使い方(その2:コンテナ)」の続きです。今回はコンテナイメージについてです。コンテナイメージの一覧コンテナイメージの一覧を表示するには、Docker Desktop から行う方法と、コマンドで行う方法の2種類があります。Docker Desktop でコンテナイメージの一覧を表示するDocker ...
前回、「Docker の使い方(その3:コンテナイメージ)」の続きです。今回はボリュームについてです。ボリュームコンテナは作り直すと中身が初期状態に戻ってしまいます。ですが、コンテナの中のアプリケーションが作成したファイルなど、残しておいてほしいファイルもあると思います。例えばデータベースに保存されているデータなどです ...
前回、「Docker の使い方(その5:ネットワーク)」の続きです。今回は Docker Compose についてです。Docker Compose とは?ここまで Docker の基本的な操作について説明してきました。コンテナを使ってアプリケーションを起動するためには、コンテナイメージからコンテナを起動し、そのコンテ ...

記事検索

最新記事

人気記事

RSSフィード

フィードバック

要望などあれば、お気軽にどーぞ。 不具合やバグを発見した場合も、連絡をいただけると助かります。

匿名でフィードバックする
匿名でフィードバックする

要望などあれば、お気軽にどーぞ。 不具合やバグを発見した場合も、連絡をいただけると助かります。

なお、このフォームから入力された内容について、管理者から返信はできませんので注意してください。 もし、管理者からの返信が必要であれば、X(旧 Twitter) もしくは、お問い合わせより、お願いします。

  • フィードバックの送信が完了しました。