【Docker】任意のネットワークを作成してコンテナ間通信をする手順

Dockerコンテナを構築するにあたり、一定のコンテナのグループ間で通信ができるようにしたい場合、任意のネットワークを作成し、通信する方法があります。

今回は「Docker Network」を利用したコンテナ間通信ができる環境を構築する手順をまとめました。

Dockerコンテナ間で任意のネットワーク通信ができる環境構築

今回は、任意のネットワークセグメント「test-network」を作成して、以下のようなコンテナ間通信ができる環境を構築します。

上記構成では、事前にCentOS8のイメージを取得済みとします。
また、今回の構築環境はWindows10で実施しています。

Dockerネットワークを新規作成する

以下コマンドでDockerネットワークを新規で作成します。
新規ネットワークとして「test-network」を作成します。

C:>docker network create test-network
da2897f5839bb9285fa4b0712912da40e4694555f5dfcf0cf8d4dbeeb8861b5e

以下で「test-network」が作成されたことを確認できます。

C:>docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
89d31715b0d3        bridge              bridge              local
024c63bc653d        host                host                local
b43271f6d28a        none                null                local
da2897f5839b        test-network        bridge              local

C:>

Dockerインストール時にはデフォルトで「bridge」というネットワークが作成されますが、DNS設定がされていないため名前解決ができません。

なので、新規でDockerネットワークを作成することにより、DNS設定がされ、名前解決をすることができ、コンテナ名を使用してコンテナ間通信ができるようになります。

以下は新規で作成されて「test-network」の詳細となります。

C:>docker network inspect test-network
[
    {
        "Name": "test-network",
        "Id": "da2897f5839bb9285fa4b0712912da40e4694555f5dfcf0cf8d4dbeeb8861b5e",
        "Created": "2020-04-07T11:15:07.052528877Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

C:>

新規で作成したネットワークを指定しコンテナを構築・起動する

上記で作成したDockerネットワークを使用して、CentOS8のコンテナを起動します。
Dockerネットワークを使用して起動する場合はコマンドオプションで「–network (network-name)」を使用します。

「CentOS8」コンテナ起動

C:>docker run -itd --privileged -p 2222:22 --name centos8 --network test-network centos:latest /sbin/init
147df6e80cb5479c8e0aa247869af057cad3f9ec5b9d7569d3c59019759344d5

「CentOS8-2」コンテナ起動

C:>docker run -itd --privileged -p 2223:22 --name centos8-2 --network test-network centos:latest /sbin/init
13736c657e7fc0b01818b3cef8750132785ac7b9f28464cf178cc5ad4e47a7aa

また、上記はポートSSHアクセスができるようにポート指定なども含めています。
詳細は以下のページを参照してください。

起動したコンテナ間での通信確認

上記で起動したコンテナで実際に通信ができるか確認します。

「CentOS8」コンテナにアクセスし、通信確認実施します。

C:>docker exec -it centos8 /bin/bash
[root@147df6e80cb5 /]#

新規Dockerネットワークのセグメント「172.18.0.x」が割り当てられていることを確認

[root@147df6e80cb5 /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1000
    link/tunnel6 :: brd ::
22: eth0@if23: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
       valid_lft forever preferred_lft forever
[root@147df6e80cb5 /]#

「test-network」のデフォルトゲートウェイへの通信確認

[root@147df6e80cb5 /]# ping 172.18.0.1
PING 172.18.0.1 (172.18.0.1) 56(84) bytes of data.
64 bytes from 172.18.0.1: icmp_seq=1 ttl=64 time=0.079 ms
64 bytes from 172.18.0.1: icmp_seq=2 ttl=64 time=0.079 ms
64 bytes from 172.18.0.1: icmp_seq=3 ttl=64 time=0.079 ms
64 bytes from 172.18.0.1: icmp_seq=4 ttl=64 time=0.079 ms
64 bytes from 172.18.0.1: icmp_seq=5 ttl=64 time=0.079 ms
64 bytes from 172.18.0.1: icmp_seq=6 ttl=64 time=0.079 ms
--- 172.18.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.079/0.079/0.079/0.000 ms

「CentOS8-2」宛の通信確認

[root@147df6e80cb5 /]# ping 172.18.0.3
PING 172.18.0.3 (172.18.0.3) 56(84) bytes of data.
64 bytes from 172.18.0.3: icmp_seq=1 ttl=64 time=0.117 ms
64 bytes from 172.18.0.3: icmp_seq=2 ttl=64 time=0.117 ms
64 bytes from 172.18.0.3: icmp_seq=3 ttl=64 time=0.117 ms
64 bytes from 172.18.0.3: icmp_seq=4 ttl=64 time=0.117 ms
64 bytes from 172.18.0.3: icmp_seq=5 ttl=64 time=0.117 ms
64 bytes from 172.18.0.3: icmp_seq=6 ttl=64 time=0.117 ms
^C
--- 172.18.0.3 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.117/0.117/0.117/0.000 ms
[root@147df6e80cb5 /]#

「CentOS8-2」コンテナにアクセスし、通信確認実施します。

C:>docker exec -it centos8-2 /bin/bash
[root@13736c657e7f /]#

新規Dockerネットワークのセグメント「172.18.0.x」が割り当てられていることを確認

[root@13736c657e7f /]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
    link/ipip 0.0.0.0 brd 0.0.0.0
3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1000
    link/tunnel6 :: brd ::
24: eth0@if25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.18.0.3/16 brd 172.18.255.255 scope global eth0
       valid_lft forever preferred_lft forever
[root@13736c657e7f /]#

「test-network」のデフォルトゲートウェイへの通信確認

[root@13736c657e7f /]# ping 172.18.0.1
PING 172.18.0.1 (172.18.0.1) 56(84) bytes of data.
64 bytes from 172.18.0.1: icmp_seq=1 ttl=64 time=0.118 ms
64 bytes from 172.18.0.1: icmp_seq=2 ttl=64 time=0.185 ms
64 bytes from 172.18.0.1: icmp_seq=3 ttl=64 time=0.185 ms
64 bytes from 172.18.0.1: icmp_seq=4 ttl=64 time=0.185 ms
64 bytes from 172.18.0.1: icmp_seq=5 ttl=64 time=0.185 ms
64 bytes from 172.18.0.1: icmp_seq=6 ttl=64 time=0.185 ms
^C
--- 172.18.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 43ms
rtt min/avg/max/mdev = 0.118/0.151/0.185/0.035 ms

「CentOS8」宛の通信確認

[root@13736c657e7f /]# ping 172.18.0.2
PING 172.18.0.2 (172.18.0.2) 56(84) bytes of data.
64 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.118 ms
64 bytes from 172.18.0.2: icmp_seq=2 ttl=64 time=0.205 ms
64 bytes from 172.18.0.2: icmp_seq=3 ttl=64 time=0.208 ms
64 bytes from 172.18.0.2: icmp_seq=4 ttl=64 time=0.208 ms
64 bytes from 172.18.0.2: icmp_seq=5 ttl=64 time=0.208 ms
64 bytes from 172.18.0.2: icmp_seq=6 ttl=64 time=0.208 ms
^C
--- 172.18.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 76ms
rtt min/avg/max/mdev = 0.118/0.177/0.208/0.041 ms
[root@13736c657e7f /]#

作成したDockerネットワークにコンテナが追加されていることを確認

新規に作成した「test-network」に該当のコンテナが含まれていることを確認します。

C:>docker network inspect test-network
[
    {
        "Name": "test-network",
        "Id": "da2897f5839bb9285fa4b0712912da40e4694555f5dfcf0cf8d4dbeeb8861b5e",
        "Created": "2020-04-07T11:15:07.052528877Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "13736c657e7fc0b01818b3cef8750132785ac7b9f28464cf178cc5ad4e47a7aa": {
                "Name": "centos8-2",
                "EndpointID": "2e051d9613caebe29a1e71bb13ae9dc8ce474a22b9626a5fa99a0e6a14eb6471",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            },
            "147df6e80cb5479c8e0aa247869af057cad3f9ec5b9d7569d3c59019759344d5": {
                "Name": "centos8",
                "EndpointID": "54b392fd269a1f0187db96cff89c8dd57f411e132b4c4ba1aa3b60463397c2aa",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

C:>

Dockerネットワークを使用したコンテナ間通信は以上となります。




エンジニアのオンライン学習

ITエンジニアにおすすめの教材、オンラインスクールです。
無料からエンジニアの学習ができる教材などまとめているので参考にしてください。

おすすめオンライン教材
自宅で学習ができるオンラインスクール

ITエンジニアの開発・検証・学習としてインターネット上で専用のサーバ(VPS)を利用しましょう!
実務経験はVPSで学べます。



コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

ABOUT US
げんき☆ひろき
インターネット関連のSEをやっています。 ネットワーク、サーバー、ストレージ、仮想基盤まで幅広く手を出しており、MVNOの構築経験もあります。 現在は、Pythonを使ったプログラミングの開発をしネットワークの自動化ツールを作成しています! Pythonの入門書も作成しているので、ぜひ参考にしてください!