Dockerコンテナ間での通信を行えるようにする

前提。前回インストールした Kali LinuxとBadTodoのコンテナ間で通信できるようにします。

Dockerコンテナの確認

PS C:\> docker ps -a
(抜粋)
CONTAINER ID   IMAGE                    ~(中略)~  NAMES
11da21e5a036   kalilinux/kali-rolling   ~(中略)~  Kali-Linux
2cbf8393604d   badtodo-nginx            ~(中略)~  badtodo-nginx
29b72abfec32   badtodo-mail             ~(中略)~  badtodo-mail
f9d0ff6a67a1   badtodo-apache           ~(中略)~  badtodo-apache
b4dbf9e7515f   badtodo-db               ~(中略)~  badtodo-db

Dockerネットワークの確認

PS C:\> docker network ls
NETWORK ID     NAME               DRIVER    SCOPE
0285c3dece76   badtodo_internal   bridge    local
e7fcc0b85be5   bridge             bridge    local 
c52f2b6c7a83   host               host      local
06b4a538de42   none               null      local

bridge: コンテナ起動時にネットワークインターフェースを指定しなければ自動的にこれが割り当てられる。コンテナが属するネットワークとホスト側のネットワークを中継するもの。
host: ホストマシンと同一のネットワークインターフェースを使用する
none: ネットワークインターフェースを使用しない

Kali Linuxの起動後。ネットワークを指定していないので bridge に入る。

PS C:\> docker network inspect bridge
(抜粋)
 "Containers": {
                "Name": "Kali-Linux",
                "IPv4Address": "172.17.0.2/16",

BadTodoの起動後。badtodoプロジェクトとして docker-compose.yml で networks: internal: と指定されているため「badtodo_internal」が作成されそこに入る。

PS C:\> docker network inspect badtodo_internal
(抜粋)
[
    {
        "Name": "badtodo_internal",
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
        "Containers": {
            "29b72abfec3201881d44ad14f7f28a0015bee360690e5475a89a5273ebe46120": {
                "Name": "badtodo-mail",
                "IPv4Address": "172.18.0.2/16",
            },
            "2cbf8393604d06c994bdb06c0567c70eb384edf9402be6d1906e1901993054e4": {
                "Name": "badtodo-nginx",
                "IPv4Address": "172.18.0.5/16",
            },
            "b4dbf9e7515f0d118782cc76126652340faeccebfba31ac40e9770f074c43c4c": {
                "Name": "badtodo-db",
                "IPv4Address": "172.18.0.4/16",
            },
            "f9d0ff6a67a175ac00c4c6e9764a7e9c5b18ffe2e0d016a838a4df6ef1706cb1": {
                "Name": "badtodo-apache",
                "IPv4Address": "172.18.0.3/16",
            }
        },
    }
]

このように所属するネットワーク(サブネット)が違う場合は通信できません。

KaliからBadTodoのApacheへのPingは通りません。(Pingコマンドが入っていない場合はapt install iputils-ping net-toolsでインストールしてください)

# ping -c 3 172.18.0.3
PING 172.18.0.3 (172.18.0.3) 56(84) bytes of data.
From 172.18.0.3 icmp_seq=1 Destination Host Unreachable
From 172.18.0.3 icmp_seq=2 Destination Host Unreachable
From 172.18.0.3 icmp_seq=3 Destination Host Unreachable

--- 172.18.0.3 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2117ms

そこで同じネットワークに所属させます。今回は新たに一つネットワークを作ることにしました。

PS C:\> docker network create kali_badtodo
70cc585af973575696ebe49d08513daf70de01b7902522516a30db1ab1a0a55d
 
PS C:\> docker network ls
NETWORK ID     NAME               DRIVER    SCOPE
0285c3dece76   badtodo_internal   bridge    local
e7fcc0b85be5   bridge             bridge    local
c52f2b6c7a83   host               host      local
70cc585af973   kali_badtodo       bridge    local  ← 増えました
06b4a538de42   none               null      local
PS C:\> docker network inspect kali_badtodo
(抜粋)
[
    {
        "Name": "kali_badtodo",
        "Scope": "local",
        "Driver": "bridge",
            "Config": [
                {
                    "Subnet": "172.19.0.0/16",
                    "Gateway": "172.19.0.1"
                }
            ]
        "Containers": {},
    }
]

kali_badtodoネットワークにKaliとBadTodoのApacheコンテナを追加します。

PS C:\> docker network connect kali_badtodo Kali-Linux
PS C:\> docker network connect kali_badtodo badtodo-apache

PS C:\> docker network inspect kali_badtodo
(抜粋)
[
    {
        "Name": "kali_badtodo",
        "Scope": "local",
        "Driver": "bridge",
            "Config": [
                {
                    "Subnet": "172.19.0.0/16",
                    "Gateway": "172.19.0.1"
                }
        "Containers": {
            "11da21e5a0366f551e2937a6fe3d819400d66b39bb82736e858c5558fd620f4d": {
                "Name": "Kali-Linux",
                "IPv4Address": "172.19.0.3/16",
            },
            "f9d0ff6a67a175ac00c4c6e9764a7e9c5b18ffe2e0d016a838a4df6ef1706cb1": {
                "Name": "badtodo-apache",
                "IPv4Address": "172.19.0.2/16",
            }
        },
    }
]

172.19.0.0/16で新しいサブネットができています。
Kaliのターミナルでも確認。172.17.0.0 (bridge)と172.19.0.0 (badtodo-apache)の2つのネットワークに接続できることが分かります。

# 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
20: eth0@if21: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever
47: eth2@if48: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:13:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.19.0.3/16 brd 172.19.255.255 scope global eth2
       valid_lft forever preferred_lft forever

再度KaliからBadTodoへping

# ping -c 3 172.19.0.2
PING 172.19.0.2 (172.19.0.2) 56(84) bytes of data.
64 bytes from 172.19.0.2: icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from 172.19.0.2: icmp_seq=2 ttl=64 time=0.089 ms
64 bytes from 172.19.0.2: icmp_seq=3 ttl=64 time=0.060 ms

--- 172.19.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2058ms
rtt min/avg/max/mdev = 0.060/0.073/0.089/0.012 ms

通信できるようになりました。コンテナ名での名前解決もDockerの内部DNSサーバがやってくれます。

# ping badtodo-apache
PING badtodo-apache (172.19.0.2) 56(84) bytes of data.
64 bytes from badtodo-apache.kali_badtodo (172.19.0.2): icmp_seq=1 ttl=64 time=0.050 ms
64 bytes from badtodo-apache.kali_badtodo (172.19.0.2): icmp_seq=2 ttl=64 time=0.094 ms
64 bytes from badtodo-apache.kali_badtodo (172.19.0.2): icmp_seq=3 ttl=64 time=0.090 ms
^C
--- badtodo-apache ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2075ms
rtt min/avg/max/mdev = 0.050/0.078/0.094/0.019 ms
/* -----codeの行番号----- */