1.クロスホスト通信の原理
ホスト 192.168.31.140 上の docker0 (172.17.0.0/16) にコンテナー mycentos (172.17.0.2/16) があります。
ホスト 192.168.31.81 上の docker0 (172.17.0.0/16) にコンテナー mycentos (172.17.0.2/16) があり、ホスト 192.168.31.140 上のホスト 192.168.31.81 に ping を実行すると、ping が実行できないことがわかります。コンテナ通信を実装するにはどうすればよいですか?
構成は以下のとおりです(例)。
- ホスト 1のIPアドレスは192.168.31.140です。
- ホスト 2のIPアドレスは192.168.31.81です。
- ホスト 1上のDockerコンテナに割り当てられたサブネット: 192.168.1.0/24
- ホスト 2上のDockerコンテナに割り当てられたサブネット: 192.168.2.0/24
- この構成の後、IP の競合を避けるために、2 つのホスト上の Docker コンテナは同じIPアドレスを使用しなくなります。
次に 2 つのルーティング ルールを定義します。コンテナ 1 から コンテナ 2 に送信されたデータ パケットは、最初に コンテナ1の「ゲートウェイ」docker0に送信され、次にホスト 1 のルートを検索することにより、データ パケットをホスト 2 に送信する必要があることがわかります。が host 2に到達すると、 host 2のdocker0に転送され、最後にデータ パケットをcontainer2 に転送します。逆の原理も同じです。
2. 2台のホストマシン間の通信実験
1.ホスト1とホスト2に2 つのネットワークをそれぞれ作成します。
ホスト1がネットワークを作成します
docker network create --driver bridge --subnet 192.168.1.0/24 --gateway
192.168.1.1 docker1
dockerネットワークlsビューネットワーク
[root@MiWiFi-R3L-srv docker]# docker network ls
NETWORK ID NAME DRIVER SCOPE
2d19a8dfb493 bridge bridge local
c0fbaf2266c8 docker1 bridge local
fc03b9653496 host host local
Docker は NETWORK_ID を検査して構成を表示します。ネットワークが 192.168.1.0/24 上にあり、ゲートウェイが 192.168.1.1 であることがわかりました。
[root@MiWiFi-R3L-srv docker]# docker inspect c0fbaf2266c8
[
{
"Name": "docker1",
"Id": "c0fbaf2266c86f504d02a9324c45fb49c1909f908631d6a2cd5b1bb04dc981a8",
"Created": "2023-11-20T18:19:18.375826061-08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.1.0/24",
"Gateway": "192.168.1.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
...
}
ホスト2がネットワークを作成する
docker network create --driver bridge --subnet 192.168.2.0/24 --gateway 192.168.2.1 docker1
dockerネットワークlsビューネットワーク
[root@MiWiFi-R3L-srv centos7]# docker network ls
NETWORK ID NAME DRIVER SCOPE
5fd741696fa2 bridge bridge local
04f03105e411 docker1 bridge local
2110fa85f0da host host local
Docker は NETWORK_ID を検査して構成を表示します。ネットワークが 192.168.2.0/24 にあり、ゲートウェイが 192.168.2.1 であることがわかりました。
[root@MiWiFi-R3L-srv docker]# docker inspect 04f03105e411
[
{
"Name": "docker1",
"Id": "c0fbaf2266c86f504d02a9324c45fb49c1909f908631d6a2cd5b1bb04dc981a8",
"Created": "2023-11-20T18:19:18.375826061-08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.2.0/24",
"Gateway": "192.168.2.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
...
}
このようにして、2 つのネットワークが 2 つのホスト上に作成され、1 つのホストには 1.0 のネットワーク セグメントがあり、もう 1 つのホストには 2.0 のネットワーク セグメントがあります。
次に、コンテナを起動するときに、コンテナを別のネットワークに追加する必要があります。
2. 両方のホストで対応するコンテナを起動します
ホスト 1 上のイメージを介してコンテナー mycentos を起動します。
#通过cnetos镜像启动一个mycentos1的容器,并指定网络为docker1
[root@MiWiFi-R3L-srv docker]# docker run -it -d --name mycentos1 --net docker1 d757f6342cfa /bin/bash
644cdc0acda390cf236f247bbec6c20080ea9b7a064670fdbbaaeb33cef8995f
[root@MiWiFi-R3L-srv docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
644cdc0acda3 d757f6342cfa "/bin/bash" 20 seconds ago Up 13 seconds mycentos1
#查看mycentos1容器网络:发现ip:192.168.1.2 在docker1网络上
[root@MiWiFi-R3L-srv docker]# docker exec -it mycentos1 ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.2 netmask 255.255.255.0 broadcast 192.168.1.255
ether 02:42:c0:a8:01:02 txqueuelen 0 (Ethernet)
RX packets 19 bytes 2376 (2.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ホスト 2 上のイメージを介してコンテナー mycentos を開始します。
#通过cnetos镜像启动一个mycentos1的容器,并指定网络为docker1
[root@MiWiFi-R3L-srv docker]# docker run -it -d --name mycentos1 --net docker1 d757f6342cfa /bin/bash
644cdc0acda390cf236f247bbec6c20080ea9b7a064670fdbbaaeb33cef8995f
[root@MiWiFi-R3L-srv docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4ba38cf3943b d757f6342cfa "/bin/bash" 20 seconds ago Up 13 seconds mycentos1
#查看mycentos1容器网络:发现ip:192.168.2.2 在docker1网络上
[root@MiWiFi-R3L-srv docker]# docker exec -it mycentos1 ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.2.2 netmask 255.255.255.0 broadcast 192.168.2.255
ether 02:42:c0:a8:01:02 txqueuelen 0 (Ethernet)
RX packets 19 bytes 2376 (2.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- ホスト 1 上でホスト 2 に ping を実行すると、正常に ping できます。これらは同じネットワーク セグメント上にあります。
- ホスト 1 のコンテナ内でホスト 1 に ping を実行すると、ホスト 1 も正常に ping できます。
- ホスト 1 のコンテナ内のホスト 2 に ping を実行すると、正常に ping を実行できる
- ホスト 1 のコンテナで、ホスト 2 のコンテナに ping を実行します。これらは同じネットワーク セグメント内にないため、ping は失敗します。
#主机1上ping主机2,ping通
[root@MiWiFi-R3L-srv docker]# ping 192.168.31.81
PING 192.168.31.81 (192.168.31.81) 56(84) bytes of data.
64 bytes from 192.168.31.81: icmp_seq=1 ttl=64 time=1.42 ms
^C
--- 192.168.31.81 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.418/1.418/1.418/0.000 ms
[root@MiWiFi-R3L-srv docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
644cdc0acda3 d757f6342cfa "/bin/bash" 12 minutes ago Up 12 minutes mycentos1
#进入主机1容器
[root@MiWiFi-R3L-srv docker]# docker exec -it 644cdc0acda3 /bin/bash
[root@644cdc0acda3 wwwroot]#
#容器中ping主机2,ping通
[root@644cdc0acda3 wwwroot]# ping 192.168.31.140
PING 192.168.31.140 (192.168.31.140) 56(84) bytes of data.
64 bytes from 192.168.31.140: icmp_seq=1 ttl=64 time=0.359 ms
^C
--- 192.168.31.140 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.359/0.359/0.359/0.000 ms
#容器中ping主机1,ping通
[root@644cdc0acda3 wwwroot]# ping 192.168.31.81
PING 192.168.31.81 (192.168.31.81) 56(84) bytes of data.
64 bytes from 192.168.31.81: icmp_seq=1 ttl=63 time=0.419 ms
64 bytes from 192.168.31.81: icmp_seq=2 ttl=63 time=0.387 ms
^C
--- 192.168.31.81 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1049ms
rtt min/avg/max/mdev = 0.387/0.403/0.419/0.016 ms
#容器中ping主机2中的容器,ping不通
[root@644cdc0acda3 wwwroot]# ping 192.168.2.2
PING 192.168.2.2 (192.168.2.2) 56(84) bytes of data.
では、ホスト 1 のコンテナがホスト 2 のコンテナと通信したい場合はどうすればよいでしょうか? これには、ルーティングルールを構成する必要があります。
3.ルーティングルールを追加する
ホスト 1 にルーティング ルールを追加します
#查看主机1上的路由规则
[root@MiWiFi-R3L-srv docker]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default XiaoQiang 0.0.0.0 UG 100 0 0 ens33
172.17.0.0 0.0.0.0 255.255.0.0 U 427 0 0 docker0
172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-9a2fe27fdd30
172.19.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-fe75119d5a77
192.168.1.0 0.0.0.0 255.255.255.0 U 426 0 0 br-c0fbaf2266c8
192.168.2.0 0.0.0.0 255.255.255.0 U 425 0 0 br-2d9c2d29e6d3
192.168.31.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
192.168.2.0 にアクセスするリクエストを ホスト 2 サーバー 192.168.31.81に転送します。
#在主机1上配置192.168.2.0这个路由
[root@MiWiFi-R3L-srv docker]# route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.31.81
ノードの IP アドレス 192.168.2.0 にアクセスすると、ホストサーバー 192.168.31.81 に転送されます。
[root@MiWiFi-R3L-srv docker]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default XiaoQiang 0.0.0.0 UG 100 0 0 ens33
172.17.0.0 0.0.0.0 255.255.0.0 U 427 0 0 docker0
172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-9a2fe27fdd30
172.19.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-fe75119d5a77
192.168.1.0 0.0.0.0 255.255.255.0 U 426 0 0 br-c0fbaf2266c8
192.168.2.0 192.168.31.81 255.255.255.0 UG 0 0 0 ens33
192.168.2.0 0.0.0.0 255.255.255.0 U 425 0 0 br-2d9c2d29e6d3
192.168.31.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
ホスト 2 にルーティング ルールを追加する
#查看主机1上的路由规则
[root@MiWiFi-R3L-srv docker]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default XiaoQiang 0.0.0.0 UG 100 0 0 ens33
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 br-04f03105e411
192.168.31.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
192.168.1.0に アクセスするリクエストを ホスト 2 サーバー 192.168.31.140に転送します。
#在主机2上配置192.168.1.0这个路由
[root@MiWiFi-R3L-srv docker]# route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.31.140
ノードの IP アドレス 192.168.1.0 にアクセスすると、ホストサーバー 192.168.31.140 に転送されます。
[root@MiWiFi-R3L-srv docker]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default XiaoQiang 0.0.0.0 UG 100 0 0 ens33
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.1.0 192.168.31.140 255.255.255.0 UG 0 0 0 ens33
192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 br-04f03105e411
192.168.31.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
4. iptablesルールの構成
IPTABLESは、最新バージョン3.5 Linuxカーネルと統合されたIPパケット フィルタリング システム(IP ファイアウォールに相当)
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网>
--sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作
iptables -t nat -I PREROUTING -s 192.168.1.0/24 -d 192.168.2.0/24 -j DNAT --to
192.168.1.1
-t nat : 实现共享网络
-I PREROUTING:用于目标地址转换(DNAT)。
-I POSTOUTING:用于源地址转换(SNAT)
-s 源ip/子网
-d 目标ip/子网
-j DNAT DNAT:目标地址转换
ホスト 1 に次のルールを追加します。
iptables -t nat -I PREROUTING -s 192.168.1.0/24 -d 192.168.2.0/24 -j DNAT --to 192.168.1.1
ホスト 2 に次のルールを追加します。
iptables -t nat -I PREROUTING -s 192.168.2.0/24 -d 192.168.1.0/24 -j DNAT --to 192.168.2.1
5. コンテナ間通信
ホスト 1/ホスト 1 コンテナ内のホスト 2 コンテナに ping を実行すると、ping が成功することがわかります。
#主机1上ping主机2的容器:可以ping通
[root@MiWiFi-R3L-srv docker]# ping 192.168.2.2
PING 192.168.2.2 (192.168.2.2) 56(84) bytes of data.
64 bytes from 192.168.2.2: icmp_seq=1 ttl=63 time=1.74 ms
64 bytes from 192.168.2.2: icmp_seq=2 ttl=63 time=0.346 ms
#进入主机1容器
[root@MiWiFi-R3L-srv docker]# docker exec -it 644cdc0acda3 /bin/bash
#ping主机2的容器,可以ping通
[root@644cdc0acda3 wwwroot]# ping 192.168.2.2
PING 192.168.2.2 (192.168.2.2) 56(84) bytes of data.
64 bytes from 192.168.2.2: icmp_seq=1 ttl=64 time=0.192 ms
ホスト 2/ホスト 2 コンテナ内のホスト 1 コンテナに ping を実行すると、ping が成功することがわかります。
#主机2上ping主机1的容器:可以ping通
[root@MiWiFi-R3L-srv docker]# ping 192.168.1.2
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.2.2: icmp_seq=1 ttl=63 time=1.74 ms
64 bytes from 192.168.2.2: icmp_seq=2 ttl=63 time=0.346 ms
#进入主机2容器
[root@MiWiFi-R3L-srv docker]# docker exec -it 644cdc0acd1a3 /bin/bash
#ping主机1的容器,可以ping通
[root@644cdc0acda3 wwwroot]# ping 192.168.1.2
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.2.2: icmp_seq=1 ttl=64 time=0.192 ms
これにより、異なるホスト間のコンテナ間で通信、つまりロードバランシングやフォワーディングなどの機能を実現することができ、一方のホストではWebをデプロイし、もう一方のホストではデータベースをデプロイすることができ、相互通信はdockerの設定により実現できます。
3. 3ホスト通信実験
これは上記の方法と同じです
1.ホスト1 、ホスト2、およびホスト3上に2 つのネットワークをそれぞれ作成します。
- ホスト 1のIPアドレスは192.168.31.140です。
- ホスト 2のIPアドレスは192.168.31.81です。
- ホスト 2のIPアドレスは192.168.31.117です。
ホスト1がネットワークを作成します
docker network create --driver bridge --subnet 192.168.1.0/24 --gateway
192.168.1.1 docker1
dockerネットワークlsビューネットワーク
[root@MiWiFi-R3L-srv docker]# docker network ls
NETWORK ID NAME DRIVER SCOPE
2d19a8dfb493 bridge bridge local
c0fbaf2266c8 docker1 bridge local
fc03b9653496 host host local
Docker は NETWORK_ID を検査して構成を表示します。ネットワークが 192.168.1.0/24 上にあり、ゲートウェイが 192.168.1.1 であることがわかりました。
[root@MiWiFi-R3L-srv docker]# docker inspect c0fbaf2266c8
[
{
"Name": "docker1",
"Id": "c0fbaf2266c86f504d02a9324c45fb49c1909f908631d6a2cd5b1bb04dc981a8",
"Created": "2023-11-20T18:19:18.375826061-08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.1.0/24",
"Gateway": "192.168.1.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
...
}
ホスト2がネットワークを作成する
docker network create --driver bridge --subnet 192.168.2.0/24 --gateway 192.168.2.1 docker1
dockerネットワークlsビューネットワーク
[root@MiWiFi-R3L-srv centos7]# docker network ls
NETWORK ID NAME DRIVER SCOPE
5fd741696fa2 bridge bridge local
04f03105e411 docker1 bridge local
2110fa85f0da host host local
Docker は NETWORK_ID を検査して構成を表示します。ネットワークが 192.168.2.0/24 にあり、ゲートウェイが 192.168.2.1 であることがわかりました。
[root@MiWiFi-R3L-srv docker]# docker inspect 04f03105e411
[
{
"Name": "docker1",
"Id": "c0fbaf2266c86f504d02a9324c45fb49c1909f908631d6a2cd5b1bb04dc981a8",
"Created": "2023-11-20T18:19:18.375826061-08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.2.0/24",
"Gateway": "192.168.2.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
...
}
ホスト 3 がネットワークを作成します
docker network create --driver bridge --subnet 192.168.3.0/24 --gateway 192.168.3.1 docker1
dockerネットワークlsビューネットワーク
[root@MiWiFi-R3L-srv centos7]# docker network ls
NETWORK ID NAME DRIVER SCOPE
5fd741696fa2 bridge bridge local
04f03105e413 docker1 bridge local
2110fa85f0da host host local
Docker は NETWORK_ID を検査して構成を表示します。ネットワークが 192.168.3.0/24 にあり、ゲートウェイが 192.168.3.1 であることがわかりました。
[root@MiWiFi-R3L-srv docker]# docker inspect 04f03105e413
[
{
"Name": "docker1",
"Id": "c0fbaf2266c86f504d02a9324c45fb49c1909f908631d6a2cd5b1bb04dc981a8",
"Created": "2023-11-20T18:19:18.375826061-08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.3.0/24",
"Gateway": "192.168.3.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
...
}
このようにして、3 つのホスト上に 3 つのネットワークが作成されます。1 つのホストのネットワーク セグメントは 1.0、1 つのホストのネットワーク セグメントは 2.0、1 つのホストのネットワーク セグメントは 3.0 になります。次に、コンテナを起動するときに、次の操作を行う必要があります。ネットワーク内の別の場所にコンテナを追加します
2. 3 つのホスト上で対応するコンテナを起動します。
ホスト 1 上のイメージを介してコンテナー mycentos を起動します。
#通过cnetos镜像启动一个mycentos1的容器,并指定网络为docker1
[root@MiWiFi-R3L-srv docker]# docker run -it -d --name mycentos1 --net docker1 d757f6342cfa /bin/bash
644cdc0acda390cf236f247bbec6c20080ea9b7a064670fdbbaaeb33cef8995f
[root@MiWiFi-R3L-srv docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
644cdc0acda3 d757f6342cfa "/bin/bash" 20 seconds ago Up 13 seconds mycentos1
#查看mycentos1容器网络:发现ip:192.168.1.2 在docker1网络上
[root@MiWiFi-R3L-srv docker]# docker exec -it mycentos1 ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.2 netmask 255.255.255.0 broadcast 192.168.1.255
ether 02:42:c0:a8:01:02 txqueuelen 0 (Ethernet)
RX packets 19 bytes 2376 (2.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ホスト 2 上のイメージを介してコンテナー mycentos を開始します。
#通过cnetos镜像启动一个mycentos1的容器,并指定网络为docker1
[root@MiWiFi-R3L-srv docker]# docker run -it -d --name mycentos1 --net docker1 d757f6342cfa /bin/bash
644cdc0acda390cf236f247bbec6c20080ea9b7a064670fdbbaaeb33cef8995f
[root@MiWiFi-R3L-srv docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4ba38cf3943b d757f6342cfa "/bin/bash" 20 seconds ago Up 13 seconds mycentos1
#查看mycentos1容器网络:发现ip:192.168.2.2 在docker1网络上
[root@MiWiFi-R3L-srv docker]# docker exec -it mycentos1 ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.2.2 netmask 255.255.255.0 broadcast 192.168.2.255
ether 02:42:c0:a8:01:02 txqueuelen 0 (Ethernet)
RX packets 19 bytes 2376 (2.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ホスト 3 上のイメージを介してコンテナー mycentos を開始します。
#通过cnetos镜像启动一个mycentos1的容器,并指定网络为docker1
[root@MiWiFi-R3L-srv docker]# docker run -it -d --name mycentos1 --net docker1 d757f6342cfa /bin/bash
644cdc0acda390cf236f247bbec6c20080ea9b7a064670fdbbaaeb33cef8995f
[root@MiWiFi-R3L-srv docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4ba38cf3943b3 d757f6342cfa "/bin/bash" 20 seconds ago Up 13 seconds mycentos1
#查看mycentos1容器网络:发现ip:192.168.3.2 在docker1网络上
[root@MiWiFi-R3L-srv docker]# docker exec -it mycentos1 ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.3.2 netmask 255.255.255.0 broadcast 192.168.3.255
ether 02:42:c0:a8:01:02 txqueuelen 0 (Ethernet)
RX packets 19 bytes 2376 (2.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- ホスト 1 上でホスト 2 に ping を実行すると、正常に ping できます。これらは同じネットワーク セグメント上にあります。
- ホスト 1 のコンテナ内でホスト 1 に ping を実行すると、ホスト 1 も正常に ping できます。
- ホスト 1 のコンテナ内のホスト 2 に ping を実行すると、正常に ping を実行できる
- ホスト 1 のコンテナでホスト 2 のコンテナに ping を実行し、ホスト 1 のコンテナでホスト 3 のコンテナに ping を実行します。これらは同じネットワーク セグメント内にないため、ping は失敗します。
#主机1上ping主机2,ping通
[root@MiWiFi-R3L-srv docker]# ping 192.168.31.81
PING 192.168.31.81 (192.168.31.81) 56(84) bytes of data.
64 bytes from 192.168.31.81: icmp_seq=1 ttl=64 time=1.42 ms
^C
--- 192.168.31.81 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.418/1.418/1.418/0.000 ms
[root@MiWiFi-R3L-srv docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
644cdc0acda3 d757f6342cfa "/bin/bash" 12 minutes ago Up 12 minutes mycentos1
#进入主机1容器
[root@MiWiFi-R3L-srv docker]# docker exec -it 644cdc0acda3 /bin/bash
[root@644cdc0acda3 wwwroot]#
#容器中ping主机2,ping通
[root@644cdc0acda3 wwwroot]# ping 192.168.31.140
PING 192.168.31.140 (192.168.31.140) 56(84) bytes of data.
64 bytes from 192.168.31.140: icmp_seq=1 ttl=64 time=0.359 ms
^C
--- 192.168.31.140 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.359/0.359/0.359/0.000 ms
#容器中ping主机1,ping通
[root@644cdc0acda3 wwwroot]# ping 192.168.31.81
PING 192.168.31.81 (192.168.31.81) 56(84) bytes of data.
64 bytes from 192.168.31.81: icmp_seq=1 ttl=63 time=0.419 ms
64 bytes from 192.168.31.81: icmp_seq=2 ttl=63 time=0.387 ms
^C
--- 192.168.31.81 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1049ms
rtt min/avg/max/mdev = 0.387/0.403/0.419/0.016 ms
#容器中ping主机2中的容器,ping不通
[root@644cdc0acda3 wwwroot]# ping 192.168.2.2
PING 192.168.2.2 (192.168.2.2) 56(84) bytes of data.
#容器中ping主机3中的容器,ping不通
[root@644cdc0acda3 wwwroot]# ping 192.168.3.2
PING 192.168.2.2 (192.168.2.2) 56(84) bytes of data.
では、ホスト 1 のコンテナがホスト 2 のコンテナまたはホスト 2 のコンテナと通信したい場合はどうすればよいでしょうか? これには、ルーティングルールを構成する必要があります。
3.ルーティングルールを追加する
ホスト 1 にルーティング ルールを追加します
#查看主机1上的路由规则
[root@MiWiFi-R3L-srv docker]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default XiaoQiang 0.0.0.0 UG 100 0 0 ens33
172.17.0.0 0.0.0.0 255.255.0.0 U 427 0 0 docker0
172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-9a2fe27fdd30
172.19.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-fe75119d5a77
192.168.1.0 0.0.0.0 255.255.255.0 U 426 0 0 br-c0fbaf2266c8
192.168.2.0 0.0.0.0 255.255.255.0 U 425 0 0 br-2d9c2d29e6d3
192.168.31.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
192.168.2.0 にアクセスするリクエストを ホスト 2 サーバー 192.168.31.81に転送します。192.168.2.0に アクセスするリクエストを ホスト 3 サーバー 192.168.31.117に転送します。
#在主机1上配置192.168.2.0这个路由
[root@MiWiFi-R3L-srv docker]# route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.31.81
#在主机1上配置192.168.3.0这个路由
[root@MiWiFi-R3L-srv docker]# route add -net 192.168.3.0 netmask 255.255.255.0 gw 192.168.31.117
ノードの IP アドレス 192.168.2.0 にアクセスすると、ホストサーバー 192.168.31.81 に転送されます。
ノードの IP アドレス 192.168.3.0 にアクセスすると、ホストサーバー 192.168.31.117 に転送されます。
[root@MiWiFi-R3L-srv docker]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default XiaoQiang 0.0.0.0 UG 100 0 0 ens33
172.17.0.0 0.0.0.0 255.255.0.0 U 427 0 0 docker0
172.18.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-9a2fe27fdd30
172.19.0.0 0.0.0.0 255.255.0.0 U 0 0 0 br-fe75119d5a77
192.168.1.0 0.0.0.0 255.255.255.0 U 426 0 0 br-c0fbaf2266c8
192.168.2.0 192.168.31.81 255.255.255.0 UG 0 0 0 ens33
192.168.3.0 192.168.31.117 255.255.255.0 UG 0 0 0 ens33
192.168.2.0 0.0.0.0 255.255.255.0 U 425 0 0 br-2d9c2d29e6d3
192.168.31.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
ホスト 2 にルーティング ルールを追加する
#查看主机1上的路由规则
[root@MiWiFi-R3L-srv docker]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default XiaoQiang 0.0.0.0 UG 100 0 0 ens33
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 br-04f03105e411
192.168.31.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
192.168.1.0に アクセスするリクエストを ホスト 2 サーバー 192.168.31.140に転送します。192.168.3.0 へのアクセス要求を ホスト 2 サーバー 192.168.31.117に転送します。
#在主机2上配置192.168.1.0这个路由
[root@MiWiFi-R3L-srv docker]# route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.31.140
#在主机2上配置192.168.3.0这个路由
[root@MiWiFi-R3L-srv docker]# route add -net 192.168.3.0 netmask 255.255.255.0 gw 192.168.31.117
ノードの IP アドレス 192.168.1.0 にアクセスすると、ホストサーバー 192.168.31.140 に転送されます。
ノードの IP アドレス 192.168.3.0 にアクセスすると、ホストサーバー 192.168.31.117 に転送されます。
[root@MiWiFi-R3L-srv docker]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default XiaoQiang 0.0.0.0 UG 100 0 0 ens33
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.1.0 192.168.31.140 255.255.255.0 UG 0 0 0 ens33
192.168.3.0 192.168.31.117 255.255.255.0 UG 0 0 0 ens33
192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 br-04f03105e411
192.168.31.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
4. iptablesルールの構成
IPTABLESは、最新バージョン3.5 Linuxカーネルと統合されたIPパケット フィルタリング システム(IP ファイアウォールに相当)
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网>
--sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作
iptables -t nat -I PREROUTING -s 192.168.1.0/24 -d 192.168.2.0/24 -j DNAT --to
192.168.1.1
-t nat : 实现共享网络
-I PREROUTING:用于目标地址转换(DNAT)。
-I POSTOUTING:用于源地址转换(SNAT)
-s 源ip/子网
-d 目标ip/子网
-j DNAT DNAT:目标地址转换
ホスト 1 に次のルールを追加します。
iptables -t nat -I PREROUTING -s 192.168.1.0/24 -d 192.168.2.0/24 -j DNAT --to 192.168.1.1
iptables -t nat -I PREROUTING -s 192.168.1.0/24 -d 192.168.3.0/24 -j DNAT --to 192.168.1.1
ホスト 2 に次のルールを追加します。
iptables -t nat -I PREROUTING -s 192.168.2.0/24 -d 192.168.1.0/24 -j DNAT --to 192.168.2.1
iptables -t nat -I PREROUTING -s 192.168.2.0/24 -d 192.168.3.0/24 -j DNAT --to 192.168.2.1
ホスト 3 に次のルールを追加します。
iptables -t nat -I PREROUTING -s 192.168.3.0/24 -d 192.168.1.0/24 -j DNAT --to 192.168.2.1
iptables -t nat -I PREROUTING -s 192.168.3.0/24 -d 192.168.2.0/24 -j DNAT --to 192.168.2.1
5. コンテナ間通信
ホスト 1/ホスト 1 コンテナ内のホスト 2 コンテナ/ホスト 3 コンテナに ping を実行し、ping が成功することを確認します。
#主机1上ping主机2的容器:可以ping通
[root@MiWiFi-R3L-srv docker]# ping 192.168.2.2
PING 192.168.2.2 (192.168.2.2) 56(84) bytes of data.
64 bytes from 192.168.2.2: icmp_seq=1 ttl=63 time=1.74 ms
64 bytes from 192.168.2.2: icmp_seq=2 ttl=63 time=0.346 ms
#主机1上ping主机3的容器:可以ping通
[root@MiWiFi-R3L-srv docker]# ping 192.168.3.2
PING 192.168.3.2 (192.168.3.2) 56(84) bytes of data.
64 bytes from 192.168.3.2: icmp_seq=1 ttl=63 time=1.74 ms
64 bytes from 192.168.3.2: icmp_seq=2 ttl=63 time=0.346 ms
#进入主机1容器
[root@MiWiFi-R3L-srv docker]# docker exec -it 644cdc0acda3 /bin/bash
#ping主机2的容器,可以ping通
[root@644cdc0acda3 wwwroot]# ping 192.168.2.2
PING 192.168.2.2 (192.168.2.2) 56(84) bytes of data.
64 bytes from 192.168.2.2: icmp_seq=1 ttl=64 time=0.192 ms
#ping主机3的容器,可以ping通
[root@644cdc0acda3 wwwroot]# ping 192.168.3.2
PING 192.168.3.2 (192.168.3.2) 56(84) bytes of data.
64 bytes from 192.168.3.2: icmp_seq=1 ttl=64 time=0.192 ms
ホスト 2/ホスト 2 コンテナ内のホスト 1 コンテナ/ホスト 3 コンテナに ping を実行し、ping が成功することを確認します。
#主机2上ping主机1的容器:可以ping通
[root@MiWiFi-R3L-srv docker]# ping 192.168.1.2
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.2.2: icmp_seq=1 ttl=63 time=1.74 ms
64 bytes from 192.168.2.2: icmp_seq=2 ttl=63 time=0.346 ms
#进入主机2容器
[root@MiWiFi-R3L-srv docker]# docker exec -it 644cdc0acd1a3 /bin/bash
#ping主机1的容器,可以ping通
[root@644cdc0acda3 wwwroot]# ping 192.168.1.2
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.2.2: icmp_seq=1 ttl=64 time=0.192 ms
[前のセクション] [Docker] 7. Docker ネットワークの構成