今から始めるDockerを始める人のためのDockerコマンド~ネットワーク編-その2~
Dockerをこれから学習していく方のために、Dockerのコマンドを紹介していきたいと思います。今回は、ネットワーク編ということで大きく下記の内容について紹介したいと思います。
- bridgeネットワークの作成
- 作成したbrg01ネットワークにコンテナ1を作成
- ホストOSのポートとコンテナのポートを紐づけたコンテナ2を作成
作っていたらだいぶ長くなってしまいましたがbridgeネットワークの特徴を把握しやすいように作成したので、是非最後まで読んでいただければと思います。
もし、Dockerの用語がわからない場合は、Dockerのコンポーネントについても紹介していますので、下記に目を通しておくことをお勧めします。
Dockerのコマンド体系はv1.13 以降新しいコマンド体系を採用しています。v1.13より前のコマンドも利用する事は可能ですが、これから学習する場合は新しいコマンド体系で学習していきましょう。今回紹介するコマンドは新しい体系のコマンドとなっています。
bridgeネットワークの作成
Docker で利用できるネットワークドライブの中で一番利用頻度がか高い、bridgeネットワークの作成方法について紹介したいと思います。
環境
bridgeネットワークを作成する環境としては下記となります。
ホストOS | CentOS7 |
ネットワーク | ens192 192.168.11.111/24 |
Docker Engine | Community Edition v19.03.8 |
コンテナは作成してなく、DockerCEをインストールした状態となります。
デバイスの確認
# nmcli device
DEVICE TYPE STATE CONNECTION
ens192 ethernet 接続済み ens192
docker0 bridge 接続済み docker0
lo loopback 管理無し --
デバイスとして下記があることが確認できます。
ens192 | 物理NICのデバイス |
lo | ループバックのデバイス |
docker0 | Dockerがデフォルトで作成するbridgeネットワーク用のデバイス |
Docker ネットワークの確認
# docker network ls
NETWORK ID NAME DRIVER SCOPE
4cd860ec5e2c bridge bridge local
d6c1823fca74 host host local
b7ae31f9d01a none null local
Dockerを起動時にデフォルト作成される「bridge」「host」「none」の3つのネットワークがあることが確認できます。
bridge | デフォルトで作成されるbridgeドライバ用のネットワーク |
host | デフォルトで作成されるhostドライバ用のネットワーク |
none | デフォルトで作成されるnullドライバ用のネットワーク |
IPアドレスの確認
# ip a
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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:cc:5a:f5 brd ff:ff:ff:ff:ff:ff
inet 192.168.11.111/24 brd 192.168.11.255 scope global noprefixroute ens192
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fecc:5af5/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:87:f4:ca:c7 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
デバイスに紐づくIPは下記となることがわかります。
ens192 | 192.168.11.111/24 |
docker0 | 172.17.0.1/16 |
bridgeネットワークの作成
まずは、bridgeネットワークとしてbrg01を作成したいと思います。
brg01ネットワークの作成
# docker network create \
> --driver=bridge \
> --subnet=172.28.0.0/24 \
> --gateway=172.28.0.1 \
> brg01
e2eb835d94d08a2c7712c552a926246cf41eac4b11d6a00565e22af7be86a511
これでbrg01ネットワークが作成できました。
docker network create のオプションについては、公式ドキュメントを参照ください。
デバイスの確認
# nmcli device
DEVICE TYPE STATE CONNECTION
ens192 ethernet 接続済み ens192
br-e2eb835d94d0 bridge 接続済み br-e2eb835d94d0
docker0 bridge 接続済み docker0
lo loopback 管理無し --
brg01用のデバイスが作成されたことが確認できます。
ens192 | 物理NICのデバイス |
lo | ループバックのデバイス |
docker0 | Dockerがデフォルトで作成するbridgeネットワーク用のデバイス |
br-e2eb835d94d0 | 作成した brg01ネットワーク用のデバイス |
Docker ネットワークの確認
# docker network ls
NETWORK ID NAME DRIVER SCOPE
e2eb835d94d0 brg01 bridge local
4cd860ec5e2c bridge bridge local
d6c1823fca74 host host local
b7ae31f9d01a none null local
brg01のネットワークが作成されたことが確認できます。
bridge | デフォルトで作成されるbridgeドライバ用のネットワーク |
host | デフォルトで作成されるhostドライバ用のネットワーク |
none | デフォルトで作成されるnullドライバ用のネットワーク |
brg01 | 作成した brg01ネットワーク用 のネットワーク |
IPアドレスの確認
# ip a
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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:cc:5a:f5 brd ff:ff:ff:ff:ff:ff
inet 192.168.11.111/24 brd 192.168.11.255 scope global noprefixroute ens192
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fecc:5af5/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:87:f4:ca:c7 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
4: br-e2eb835d94d0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:43:44:7f:4a brd ff:ff:ff:ff:ff:ff
inet 172.28.0.1/24 brd 172.28.0.255 scope global br-e2eb835d94d0
valid_lft forever preferred_lft forever
brg01(br-e2eb835d94d0)のIPアドレスが確認できます。
また、仮想インターフェイス等なにも接続されていない状態なので、ステータスがDOWNとなっています。
ens192 | 192.168.11.111/24 |
docker0 | 172.17.0.1/16 |
br-e2eb835d94d0 | 172.28.0.1/24 |
作成したbrg01ネットワークの詳細確認
# docker network inspect brg01
[
{
"Name": "brg01",
"Id": "e2eb835d94d08a2c7712c552a926246cf41eac4b11d6a00565e22af7be86a511",
"Created": "2020-05-04T17:14:51.592562084+09:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.28.0.0/24",
"Gateway": "172.28.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
作成したbrg01の詳細が確認できます。
作成したbrg01ネットワークにコンテナ1を作成
brg01にコンテナ1を作成してホストOSとどう通信できるかなどを確認して行きたいと思います。
コンテナ1の作成
# docker run -d --privileged --network=brg01 --name centos01 centos:latest /sbin/init
コンテナ1として、centos01を作成しました。
–network で接続するネットワークを指定します。
作成したコンテナ1の確認
# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9bfacfe18386 centos:latest "/sbin/init" 15 hours ago Up 15 hours centos01
コンテナ1として、centos01が作成されていることがわかります。
デバイスの確認
# nmcli device
DEVICE TYPE STATE CONNECTION
ens192 ethernet 接続済み ens192
br-e2eb835d94d0 bridge 接続済み br-e2eb835d94d0
docker0 bridge 接続済み docker0
veth4ba8862 ethernet 管理無し --
lo loopback 管理無し --
vethXXXXXというデバイスが作成されたことが確認できます。これがコンテナ1用のデバイスとなります。XXXXXは乱数となります。
ens192 | 物理NICのデバイス |
lo | ループバックのデバイス |
docker0 | Dockerがデフォルトで作成するbridgeネットワーク用のデバイス |
br-e2eb835d94d0 | 作成した brg01ネットワーク用のデバイス |
veth4ba8862 | 作成したコンテナ1用のデバイス |
Docker ネットワークの確認
# docker network ls
NETWORK ID NAME DRIVER SCOPE
e2eb835d94d0 brg01 bridge local
4cd860ec5e2c bridge bridge local
d6c1823fca74 host host local
b7ae31f9d01a none null local
ネットワークを追加で作成したわけではないため、特に変わりなしです。
IPアドレスの確認
# ip a
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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:cc:5a:f5 brd ff:ff:ff:ff:ff:ff
inet 192.168.11.111/24 brd 192.168.11.255 scope global noprefixroute ens192
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fecc:5af5/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:87:f4:ca:c7 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
4: br-e2eb835d94d0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:43:44:7f:4a brd ff:ff:ff:ff:ff:ff
inet 172.28.0.1/24 brd 172.28.0.255 scope global br-e2eb835d94d0
valid_lft forever preferred_lft forever
inet6 fe80::42:43ff:fe44:7f4a/64 scope link
valid_lft forever preferred_lft forever
6: veth4ba8862@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-e2eb835d94d0 state UP group default
link/ether 12:cc:2f:b5:18:01 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::10cc:2fff:feb5:1801/64 scope link
valid_lft forever preferred_lft forever
仮想インターフェイス(veth4ba8862)が作成したbrg01(br-e2eb835d94d0)に接続されていることが確認できます。
また、仮想インターフェイスが接続されたことによってbrg01(br-e2eb835d94d0)のステータスがUPとなっていることが確認できます。
ens192 | 192.168.11.111/24 |
docker0 | 172.17.0.1/16 |
br-e2eb835d94d0 | 172.28.0.1/24 |
veth4ba8862 |
作成したbrg01ネットワークの詳細確認
# docker network inspect brg01
[
{
"Name": "brg01",
"Id": "e2eb835d94d08a2c7712c552a926246cf41eac4b11d6a00565e22af7be86a511",
"Created": "2020-05-04T17:14:51.592562084+09:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.28.0.0/24",
"Gateway": "172.28.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"9bfacfe18386d8fc92ccdba8b1e9ba28d892548ce37b869b9b3671ff982ba2f4": {
"Name": "centos01",
"EndpointID": "b38bf71f4ad7bac7d57ebf1169810b9cb679ae8db6519a33dd7c1cfc240f8dd4",
"MacAddress": "02:42:ac:1c:00:02",
"IPv4Address": "172.28.0.2/24",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
作成したbrg01にコンテナ1(centos01)が接続され、コンテナ1のIPアドレスが172.28.0.2/24であることもわかります。
コンテナ1の詳細確認
# docker container inspect centos01
[
{
"Id": "9bfacfe18386d8fc92ccdba8b1e9ba28d892548ce37b869b9b3671ff982ba2f4",
~~省略~~
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "brg01",
"PortBindings": {},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
~~省略~~
"NetworkSettings": {
"Bridge": "",
"SandboxID": "3c1f845d5796ecc2754aa6af28bc19217891642f801f6e51029570454f6d84e7",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {},
"SandboxKey": "/var/run/docker/netns/3c1f845d5796",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "",
"Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "",
"IPPrefixLen": 0,
"IPv6Gateway": "",
"MacAddress": "",
"Networks": {
"brg01": {
"IPAMConfig": null,
"Links": null,
"Aliases": [
"9bfacfe18386"
],
"NetworkID": "e2eb835d94d08a2c7712c552a926246cf41eac4b11d6a00565e22af7be86a511",
"EndpointID": "b38bf71f4ad7bac7d57ebf1169810b9cb679ae8db6519a33dd7c1cfc240f8dd4",
"Gateway": "172.28.0.1",
"IPAddress": "172.28.0.2",
"IPPrefixLen": 24,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:1c:00:02",
"DriverOpts": null
}
}
}
}
]
コンテナ1(centos01)の詳細情報からも、brg01に接続されていることが確認できます。
ホストOSからコンテナ1への疎通確認
# ping 172.28.0.2
PING 172.28.0.2 (172.28.0.2) 56(84) bytes of data.
64 bytes from 172.28.0.2: icmp_seq=1 ttl=64 time=0.049 ms
64 bytes from 172.28.0.2: icmp_seq=2 ttl=64 time=0.077 ms
64 bytes from 172.28.0.2: icmp_seq=3 ttl=64 time=0.073 ms
^C
--- 172.28.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.049/0.066/0.077/0.014 ms
ホストOSからコンテナ1へping確認できました。ホストOSはbrg01のゲートウェイのIPを持っているので、コンテナと通信することが可能となります。
コンテナ1へログイン
# docker exec -it -u root centos01 /bin/bash
[root@9bfacfe18386 /]#
コンテナ1のIPアドレスの確認
[root@9bfacfe18386 /]# ip a
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
5: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:1c:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.28.0.2/24 brd 172.28.0.255 scope global eth0
valid_lft forever preferred_lft forever
eth0というデバイスがあり、172.28.0.2/24のIPアドレスが付与されていることがわかります。
brg01やcoentos01の詳細情報を確認した通りのIPアドレスが付与されています。
コンテナ1からホストOSへの疎通確認
[root@9bfacfe18386 /]# ping 172.28.0.1
PING 172.28.0.1 (172.28.0.1) 56(84) bytes of data.
64 bytes from 172.28.0.1: icmp_seq=1 ttl=64 time=0.043 ms
64 bytes from 172.28.0.1: icmp_seq=2 ttl=64 time=0.037 ms
64 bytes from 172.28.0.1: icmp_seq=3 ttl=64 time=0.036 ms
^C
--- 172.28.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.036/0.038/0.043/0.007 ms
疎通できることが確認できました。
[root@9bfacfe18386 /]# ping 192.168.11.111
PING 192.168.11.111 (192.168.11.111) 56(84) bytes of data.
64 bytes from 192.168.11.111: icmp_seq=1 ttl=64 time=0.034 ms
64 bytes from 192.168.11.111: icmp_seq=2 ttl=64 time=0.034 ms
64 bytes from 192.168.11.111: icmp_seq=3 ttl=64 time=0.070 ms
^C
--- 192.168.11.111 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.034/0.046/0.070/0.017 ms
ホストOSのens192デバイスに対しても疎通できました。
コンテナ1からはホストOSのens192を利用した通信ができるため、ホストOSがインターネットを利用できる環境であれば、コンテナ1もインターネットを利用可能です。
ただ、コンテナ1に対する通信はホストOSからは可能ですが、ホストOS以外の別サーバからコンテナ1へ通信することはできません。
ホストOSのポートとコンテナのポートを紐づけたコンテナ2を作成
続いては、ホストOSのポートとコンテナのポートを紐づけたコンテナ2をbrg01に作成して、ホストOSとどう通信できるかなどを確認して行きたいと思います。
コンテナ2の作成
# docker run -d --privileged --network=brg01 -p 8080:80 --name centos02 centos:latest /sbin/init
ce690533aa1603515821894f3f51a1538731a16f4982ed2aca2286dd5bc3089d
コンテナ2として、centos02を作成しました。
コンテナ1同様接続するネットワークを–network で指定します。
-p で、ホストOSのポートとコンテナのポートを紐づけます。今回は-p 8080:80としたので、ホストOSの8080ポートとコンテナの80ポートを紐づけています。
作成したコンテナ2の確認
# docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ce690533aa16 centos:latest "/sbin/init" 3 minutes ago Up 3 minutes 0.0.0.0:8080->80/tcp centos02
9bfacfe18386 centos:latest "/sbin/init" 17 hours ago Up 17 hours centos01
コンテナ2として、centos02が作成されていることがわかります。そして、ホストOSの8080ポートとコンテナの80ポートが紐づいていることもわかります。
デバイスの確認
# nmcli device
DEVICE TYPE STATE CONNECTION
ens192 ethernet 接続済み ens192
br-e2eb835d94d0 bridge 接続済み br-e2eb835d94d0
docker0 bridge 接続済み docker0
veth3a0a241 ethernet 管理無し --
veth4ba8862 ethernet 管理無し --
lo loopback 管理無し --
コンテナ1用の時と同様にコンテナ2用のデバイスveth3a0a241が作成されていることがわかります。
ens192 | 物理NICのデバイス |
lo | ループバックのデバイス |
docker0 | Dockerがデフォルトで作成するbridgeネットワーク用のデバイス |
br-e2eb835d94d0 | 作成した brg01ネットワーク用のデバイス |
veth4ba8862 | 作成したコンテナ1用のデバイス |
veth3a0a241 | 作成したコンテナ2用のデバイス |
Docker ネットワークの確認
# docker network ls
NETWORK ID NAME DRIVER SCOPE
e2eb835d94d0 brg01 bridge local
4cd860ec5e2c bridge bridge local
d6c1823fca74 host host local
b7ae31f9d01a none null local
ネットワークを追加で作成したわけではないため、特に変わりなしです。
IPアドレスの確認
# ip a
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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:cc:5a:f5 brd ff:ff:ff:ff:ff:ff
inet 192.168.11.111/24 brd 192.168.11.255 scope global noprefixroute ens192
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fecc:5af5/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:87:f4:ca:c7 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
4: br-e2eb835d94d0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:43:44:7f:4a brd ff:ff:ff:ff:ff:ff
inet 172.28.0.1/24 brd 172.28.0.255 scope global br-e2eb835d94d0
valid_lft forever preferred_lft forever
inet6 fe80::42:43ff:fe44:7f4a/64 scope link
valid_lft forever preferred_lft forever
6: veth4ba8862@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-e2eb835d94d0 state UP group default
link/ether 12:cc:2f:b5:18:01 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::10cc:2fff:feb5:1801/64 scope link
valid_lft forever preferred_lft forever
8: veth3a0a241@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-e2eb835d94d0 state UP group default
link/ether 22:ac:21:0e:6f:d8 brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet6 fe80::20ac:21ff:fe0e:6fd8/64 scope link
valid_lft forever preferred_lft forever
仮想インターフェイス(veth3a0a241)が作成したbrg01(br-e2eb835d94d0)に接続されていることが確認できます。
ens192 | 192.168.11.111/24 |
docker0 | 172.17.0.1/16 |
br-e2eb835d94d0 | 172.28.0.1/24 |
veth4ba8862 | |
veth3a0a241 |
作成したbrg01ネットワークの詳細確認
# docker network inspect brg01
[
{
"Name": "brg01",
"Id": "e2eb835d94d08a2c7712c552a926246cf41eac4b11d6a00565e22af7be86a511",
"Created": "2020-05-04T17:14:51.592562084+09:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.28.0.0/24",
"Gateway": "172.28.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"9bfacfe18386d8fc92ccdba8b1e9ba28d892548ce37b869b9b3671ff982ba2f4": {
"Name": "centos01",
"EndpointID": "b38bf71f4ad7bac7d57ebf1169810b9cb679ae8db6519a33dd7c1cfc240f8dd4",
"MacAddress": "02:42:ac:1c:00:02",
"IPv4Address": "172.28.0.2/24",
"IPv6Address": ""
},
"ce690533aa1603515821894f3f51a1538731a16f4982ed2aca2286dd5bc3089d": {
"Name": "centos02",
"EndpointID": "0932e0e6ec2e4153b5c9aff78772715c97a6615b36f238c3f50c503ea8a9fb2e",
"MacAddress": "02:42:ac:1c:00:03",
"IPv4Address": "172.28.0.3/24",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
作成したbrg01にコンテナ2(centos02)が接続され、コンテナ2のIPアドレスが172.28.0.3/24であることもわかります。
コンテナ2の詳細確認
# docker container inspect centos02
[
{
"Id": "ce690533aa1603515821894f3f51a1538731a16f4982ed2aca2286dd5bc3089d",
~~省略~~
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "brg01",
"PortBindings": {
"80/tcp": [
{
"HostIp": "",
"HostPort": "8080"
}
]
},
~~省略~~
"NetworkSettings": {
"Bridge": "",
"SandboxID": "faf0f66840cba1d67fa8989362a7b2d283247d8c17d8f61ad117f43ec9513179",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"80/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "8080"
}
]
},
"SandboxKey": "/var/run/docker/netns/faf0f66840cb",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "",
"Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "",
"IPPrefixLen": 0,
"IPv6Gateway": "",
"MacAddress": "",
"Networks": {
"brg01": {
"IPAMConfig": null,
"Links": null,
"Aliases": [
"ce690533aa16"
],
"NetworkID": "e2eb835d94d08a2c7712c552a926246cf41eac4b11d6a00565e22af7be86a511",
"EndpointID": "0932e0e6ec2e4153b5c9aff78772715c97a6615b36f238c3f50c503ea8a9fb2e",
"Gateway": "172.28.0.1",
"IPAddress": "172.28.0.3",
"IPPrefixLen": 24,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:1c:00:03",
"DriverOpts": null
}
}
}
}
]
コンテナ2(centos02)の詳細情報からも、brg01に接続されていることが確認できます。
また、ホストOSとコンテナのポートが紐づきとコンテナ2(centos02)のIPアドレスも確認できます。
ホストOSからコンテナ2への疎通確認
# ping 172.28.0.3
PING 172.28.0.3 (172.28.0.3) 56(84) bytes of data.
64 bytes from 172.28.0.3: icmp_seq=1 ttl=64 time=0.114 ms
64 bytes from 172.28.0.3: icmp_seq=2 ttl=64 time=0.038 ms
64 bytes from 172.28.0.3: icmp_seq=3 ttl=64 time=0.040 ms
^C
--- 172.28.0.3 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.038/0.064/0.114/0.035 ms
コンテナ1同様、ホストOSからコンテナ2へもping確認できました。
コンテナ2へログイン
# docker exec -it -u root centos02 /bin/bash
[root@ce690533aa16 /]#
コンテナ2のIPアドレスの確認
[root@ce690533aa16 /]# ip a
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
7: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:1c:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.28.0.3/24 brd 172.28.0.255 scope global eth0
valid_lft forever preferred_lft forever
eth0というデバイスがあり、172.28.0.3/24のIPアドレスが付与されていることがわかります。
brg01やcoentos02の詳細情報を確認した通りのIPアドレスが付与されています。
コンテナ2へapacheをインストール
[root@ce690533aa16 /]# yum install -y httpd
~~省略~~
Complete!
[root@ce690533aa16 /]# systemctl start httpd
[root@ce690533aa16 /]# echo "Hello! This is kubalog." > /var/www/html/index.html
[root@ce690533aa16 /]# curl http://172.28.0.3:80
Hello! This is kubalog.
コンテナ2(centos02)にhttpで80ポートでアクセスすると「Hello! This is kubalog.」と応答するテスト用のWebページを作成しました。
コンテナ2からコンテナ1への疎通確認
[root@ce690533aa16 /]# ping 172.28.0.2
PING 172.28.0.2 (172.28.0.2) 56(84) bytes of data.
64 bytes from 172.28.0.2: icmp_seq=1 ttl=64 time=0.062 ms
64 bytes from 172.28.0.2: icmp_seq=2 ttl=64 time=0.041 ms
64 bytes from 172.28.0.2: icmp_seq=3 ttl=64 time=0.041 ms
^C
--- 172.28.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.041/0.048/0.062/0.009 ms
[root@ce690533aa16 /]# ping centos01
PING centos01 (172.28.0.2) 56(84) bytes of data.
64 bytes from centos01.brg01 (172.28.0.2): icmp_seq=1 ttl=64 time=0.038 ms
64 bytes from centos01.brg01 (172.28.0.2): icmp_seq=2 ttl=64 time=0.075 ms
64 bytes from centos01.brg01 (172.28.0.2): icmp_seq=3 ttl=64 time=0.039 ms
^C
--- centos01 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2ms
rtt min/avg/max/mdev = 0.038/0.050/0.075/0.019 ms
IPアドレスでも疎通確認できましたが、ホスト名(コンテナ名)でも疎通確認できます。
ホスト名で名前解決できるのは、作成したbridgeネットワークのコンテナのみとなります。Dockerによってデフォルトで作成されるBridgeネットワークにおいては、基本的にはIPアドレスのみで通信できます。ただし–linkオプション(レガシー機能のため今後は利用しないほうがよいでしょう)を利用してホスト名を定義することも可能です。
公式ドキュメントにも記載ありますので、併せて確認するとよいかと思います。
ホストOSからコンテナ2への疎通確認
# ping 172.28.0.3
PING 172.28.0.3 (172.28.0.3) 56(84) bytes of data.
64 bytes from 172.28.0.3: icmp_seq=1 ttl=64 time=0.064 ms
64 bytes from 172.28.0.3: icmp_seq=2 ttl=64 time=0.037 ms
64 bytes from 172.28.0.3: icmp_seq=3 ttl=64 time=0.037 ms
^C
--- 172.28.0.3 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.037/0.046/0.064/0.012 ms
# ping centos02
ping: centos02: 名前またはサービスが不明です
ホストOSからはコンテナ2(centos02)へ疎通確認できましたが、はやりホストOSからコンテナ2の名前解決はできないみたいですね。名前解決ができるのはあくまでコンテナ間のみとなります。
# curl http://172.28.0.3:80
Hello! This is kubalog.
# curl http://192.168.11.111:8080
Hello! This is kubalog.
1つ目がホストOSからコンテナ2(centos02)の80ポートへのアクセス
2つ目がホストOSからホストOS自身の8080ポートへのアクセス
ホストOSの8080ポートとコンテナ2(centos02)の80ポートの紐づけを行ったので、ホストOS自身の8080がコンテナ2(centos02)の80ポートに転送されているのが、確認できました。
これができることによって、ホストOSと通信できる別サーバからコンテナにアクセスすることが可能となります。
ホストOSとは別サーバからコンテナ2への疎通確認
# ping 192.168.11.111
PING 192.168.11.111 (192.168.11.111) 56(84) bytes of data.
64 bytes from 192.168.11.111: icmp_seq=1 ttl=64 time=0.191 ms
64 bytes from 192.168.11.111: icmp_seq=2 ttl=64 time=0.238 ms
64 bytes from 192.168.11.111: icmp_seq=3 ttl=64 time=0.133 ms
^C
--- 192.168.11.111 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.133/0.187/0.238/0.044 ms
# ping 172.28.0.3
PING 172.28.0.3 (172.28.0.3) 56(84) bytes of data.
^C
--- 172.28.0.3 ping statistics ---
24 packets transmitted, 0 received, 100% packet loss, time 22999ms
別サーバからホストOSへは疎通できましたが、コンテナ2へは疎通できないことがわかります。
# curl http://192.168.11.111:8080
Hello! This is kubalog.
ホストOSとコンテナ2のポートが紐づいているため、想定通りアクセスできました。
# curl http://172.28.0.3:80
^C
やはり、コンテナ2のでは想定どおりアクセスできませんでした。