[Docker]八.Docker 容器跨主机通讯
一.跨主机通讯原理

在主机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上ping主机192.168.31.81,发现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
- 这样配置之后,两个主机上的Docker容器就肯定不会使用相同的IP地址从而避免了IP冲突
接下来定义两条路由规则即可:从container1 发往 container2 的数据包,首先发往 container1 的 “网关 ”docker0 ,然后通过查找主机 1的路由得知需要将数据包发给主机2 ,数据包到达主机 2 后再转发给主机 2 的 docker0 ,最后由其将数据包转到container2 中,反向原理相同
二.两台主机机通讯实验
1.分别在主机1和主机2上面创建两个网络
主机1创建网络
docker network create --driver bridge --subnet 192.168.1.0/24 --gateway
192.168.1.1 docker1
docker network 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 inspect 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 network 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 inspect 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,...}
这样就在两台主机上创建了两个网络,一个主机的网段为1.0,一个主机的网段为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 1500inet 192.168.1.2 netmask 255.255.255.0 broadcast 192.168.1.255ether 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 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0loop txqueuelen 1000 (Local Loopback)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX 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 1500inet 192.168.2.2 netmask 255.255.255.0 broadcast 192.168.2.255ether 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 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0loop txqueuelen 1000 (Local Loopback)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- 在主机1上ping主机2,能够ping通,他们处于同一网段
- 在主机1的容器中ping主机1,他们也能ping通
- 在主机1的容器中ping主机2可以ping通
- 在主机1的容器中ping主机2的容器,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 当访问192.168.2.0这个结点的ip时,就会转发到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 当访问192.168.1.0这个结点的ip时,就会转发到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的容器中ping主机2容器,发现可以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 ms64 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的容器中ping主机1容器,发现可以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 ms64 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配置就可以实现相互通信
三.三台主机通讯实验
这个和上面方法一致
1.分别在主机1、主机2、主机3上面创建两个网络
- 主机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 network 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 inspect 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 network 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 inspect 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 network 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 inspect 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,...}
这样就在三台主机上创建了三个网络,一个主机的网段为1.0,一个主机的网段为2.0,,一个主机的网段为3.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 1500inet 192.168.1.2 netmask 255.255.255.0 broadcast 192.168.1.255ether 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 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0loop txqueuelen 1000 (Local Loopback)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX 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 1500inet 192.168.2.2 netmask 255.255.255.0 broadcast 192.168.2.255ether 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 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0loop txqueuelen 1000 (Local Loopback)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX 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 1500inet 192.168.3.2 netmask 255.255.255.0 broadcast 192.168.3.255ether 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 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0loop txqueuelen 1000 (Local Loopback)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- 在主机1上ping主机2,能够ping通,他们处于同一网段
- 在主机1的容器中ping主机1,他们也能ping通
- 在主机1的容器中ping主机2可以ping通
- 在主机1的容器中ping主机2的容器,在主机1的容器中ping主机3的容器,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 当访问192.168.2.0这个结点的ip时,就会转发到192.168.31.81这台主机服务器上
当访问192.168.3.0这个结点的ip时,就会转发到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 当访问192.168.1.0这个结点的ip时,就会转发到192.168.31.140这台主机服务器上
当访问192.168.3.0这个结点的ip时,就会转发到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.1iptables -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.1iptables -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.1iptables -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的容器中ping主机2容器/主机3容器,发现可以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 ms64 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 ms64 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的容器中ping主机1容器/主机3容器,发现可以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 ms64 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]七.配置 Docker 网络
[下一节][Docker]九.Docker compose讲解
相关文章:
[Docker]八.Docker 容器跨主机通讯
一.跨主机通讯原理 在主机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上ping主机192.168.31.81,发现ping不通要实现两个主…...
面试cast:reinterpret_cast/const_cast/static_cast/dynamic_cast
目录 1. cast 2. reinterpret_cast 3. const_cast 3.1 加上const的情况 3.2 去掉const的情况 4. static_cast 4.1 基本类型之间的转换 4.2 void指针转换为任意基本类型的指针 4.3 子类和父类之间的转换 5. dynamic_cast 5.1 RTTI(Run-time Type Identification) 1.…...
致远M3 反序列化RCE漏洞复现(XVE-2023-24878)
0x01 产品简介 M3移动办公是致远互联打造的一站式智能工作平台,提供全方位的企业移动业务管理,致力于构建以人为中心的智能化移动应用场景,促进人员工作积极性和创造力,提升企业效率和效能,是为企业量身定制的移动智慧…...
Ubuntu安装CUDA驱动
Ubuntu安装CUDA驱动 前言官网安装确认安装版本安装CUDA Toolkit 前言 CUDA驱动一般指CUDA Toolkit,可通过Nvidia官网下载安装。本文介绍安装方法。 官网 CUDA Toolkit 最新版:CUDA Toolkit Downloads | NVIDIA Developer CUDA Toolkit 最新版文档&…...
【MySQL】内连接和外连接
内连接和外连接 前言正式开始内连接外连接左外连接右外连接 前言 前一篇讲多表查询的时候讲过笛卡尔积,其实笛卡尔积就算一种连接,不过前一篇讲的时候并没有细说连接相关的内容,本篇就来详细说说表的连接有哪些。 本篇博客中主要用到的还是…...
U盘启动制作工具Rufus
U盘启动制作工具Rufus 下载U盘启动制作工具Rufus,进入Rufus官网:http://rufus.ie/en/,打开之后往后滑动,找到download即可点击下载。 需要插入U盘 首先需要插入U盘,如果U盘有重要文件一定要备份,然后右键…...
Ubuntu 22.04安装vscode
要在Ubuntu 22.04安装vscode,请完成这些步骤。 首先apt命令更新软件包索引并安装导入微软GPG密钥的依赖软件。 更新,近期内执行过可忽略 sudo apt update安装工具包 sudo apt install software-properties-common apt-transport-https curl当导入GPG后…...
计算机视觉的应用19-基于pytorch框架搭建卷积神经网络CNN的卫星地图分类问题实战应用
大家好,我是微学AI,今天给大家介绍一下计算机视觉的应用19-基于pytorch框架搭建卷积神经网络CNN的卫星地图分类问题实战应用。随着遥感技术和卫星图像获取能力的快速发展,卫星图像分类任务成为了计算机视觉研究中一个重要的挑战。为了促进这一…...
Java 获取本地ip网卡信息
工具类 public static Optional<Inet4Address> getLocalIp4Address() throws SocketException {final List<Inet4Address> inet4Addresses getLocalIp4AddressFromNetworkInterface();if (inet4Addresses.size() ! 1) {final Optional<Inet4Address> ipBySo…...
将kali系统放在U盘中插入电脑直接进入kali系统
首先准备一个空白的 U 盘。 Kali Linux | Penetration Testing and Ethical Hacking Linux Distribution 在 Windows 上制作 Kali 可启动 USB 驱动器 Making a Kali Bootable USB Drive on Windows | Kali Linux Documentation 1. 首先下载 .iso 镜像 Index of /kali-images…...
二十四、RestClient操作文档
目录 一、新增文档 1、编写测试代码 二、查询文档 1、编写测试代码 三、删除文档 1、编写测试代码 四、修改文档 1、编写测试代码 五、批量导入文档 批量查询 一、新增文档 1、编写测试代码 SpringBootTest public class HotelDocumentTest {private RestHighLevelC…...
【Docker】从零开始:9.Docker命令:Push推送仓库(Docker Hub,阿里云)
【Docker】从零开始:9.Docker命令:Push推送仓库 知识点1.Docker Push有什么作用?2.Docker仓库有哪几种2.1 公有仓库2.2 第三方仓库2.3 私有仓库2.4 搭建私有仓库的方法有哪几种 3.Docker公有仓库与私有仓库的优缺点对比 Docker Push 命令标准语法操作参数…...
Centos部署GitLab-备份恢复
1. 下载rpm包 wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-10.8.4-ce.0.el7.x86_64.rpm2. 安装依赖 yum -y install policycoreutils openssh-server openssh-clients postfix policycoreutils-python3. rpm安装 rpm -ivh gitlab-ce-10.8.4-ce.…...
CSV用EXCEL打开后为科学计数法(后几位丢失)解决方法
当在Excel中打开含有长数字(如订单号)的CSV文件时,Excel可能会默认将这些长数字格式化为科学计数法。 而当您尝试将它们转换为文本格式时,如果数字非常长,Excel可能无法正确处理其精度,导致数字的后几位变…...
flink sqlClient提交hiveIceberg
flink sqlClient提交hiveIceberg 环境准备sqlclient启动前准备启动sqlclientinit.sqlinsert.sql 环境准备 组件名版本flink客户端1.14.4-2.12hadoop集群3.1.4hive客户端3.1.2icebergiceberg-flink-runtime-1.14-0.13.2.jariceberg-hive依赖iceberg-hive-runtime-0.13.2.jar s…...
SpringBoot 导入其他配置文件
默认情况下,springboot 初始的项目中都有一个 application.yml 或者 application.properties 文件,如果我们希望再定义一个独立的配置文件用来配置特定业务数据,而不希望把这些配置内容都堆积在 application 配置文件中,实现这个需…...
景区智慧旅游智能化系统方案:PPT全文58页,附下载
关键词:智慧景区解决方案,智慧文旅解决方案,智慧旅游解决方案,智慧文旅综合运营平台 一、景区智慧旅游智能化系统建设背景 近年来,随着信息技术的快速发展和普及,以及旅游市场的不断扩大和升级࿰…...
Java特殊文件读取案例Properties
代码 package com.itheima.d1;import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.util.Properties;public class Test3 {public static void main(String[] args) throws Exception {//目标:读取属性文件…...
搜维尔科技:Faceware面部捕捉最佳实践!
视频源和分辨率: 我们的软件针对 RGB 彩色素材进行了优化,不支持使用红外摄像机。 我们建议视频分辨率为 720p 和 1080p。低于 720p 的分辨率可能会对跟踪质量产生负面影响,而高于 1080p 的分辨率会导致存储要求和传输时间增加,而…...
如何使用ArcGIS Pro进行坐标转换
不同来源的数据坐标系可能是不同的,为了统一使用这些数据就需要进行坐标转换,ArcGIS Pro作为专业的GIS软件,坐标转换功能肯定也是包含的,这里为大家介绍一下ArcGIS Pro如何进行坐标转换,希望能对你有所帮助。 数据来源…...
Windows上安装安卓应用:APK安装器的全新体验
Windows上安装安卓应用:APK安装器的全新体验 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer APK安装器是一款专为Windows系统设计的安卓应用安装工具&#…...
保姆级教程:手把手教你用示波器调试HDMI音频(从I2S信号抓取到ACR时钟恢复)
保姆级教程:手把手教你用示波器调试HDMI音频(从I2S信号抓取到ACR时钟恢复) 当你面对一台HDMI设备突然"失声"时,是否曾感到无从下手?作为硬件工程师,我们常常需要从最底层的信号层面寻找答案。本文…...
Windows下实现Claude Code多账户隔离:环境变量与启动参数配置指南
1. 项目概述:告别手动切换,实现IDE内Claude账户的优雅隔离如果你是一名在Windows上使用Claude Code(Claude AI的IDE插件)的开发者,并且需要在个人和工作账户之间频繁切换,那么你大概率经历过这种烦恼&#…...
Pandas进阶:除了pd.read_csv,用这2种方法也能把格式化字符串完美变回DataFrame
Pandas进阶:3种高效方法将复杂字符串还原为DataFrame 当你从网页日志、API响应或同事的邮件中获取到一段看似表格的字符串数据时,如何快速准确地将其转换回Pandas DataFrame?pd.read_csv确实是常见选择,但在处理非标准格式时往往…...
如何用Python脚本绕过百度网盘限速:从技术原理到实战应用
如何用Python脚本绕过百度网盘限速:从技术原理到实战应用 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 在当今数字资源分享时代,百度网盘作为国内主流…...
视频字幕提取终极指南:用Video-subtitle-extractor本地提取87种语言字幕
视频字幕提取终极指南:用Video-subtitle-extractor本地提取87种语言字幕 【免费下载链接】video-subtitle-extractor 视频硬字幕提取,生成srt文件。无需申请第三方API,本地实现文本识别。基于深度学习的视频字幕提取框架,包含字幕…...
XUnity Auto Translator
XUnity Auto Translator 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 项目简介 这是一个高级翻译插件,可用于自动翻译基于Unity的游戏,并提供手动翻译所需的工具。 核心功能 …...
开源光标主题合集:从原理到实战,打造个性化桌面交互体验
1. 项目概述:打造你的专属桌面光标库如果你和我一样,是个对桌面美学有点“偏执”的玩家,那么系统自带的那几套万年不变的光标主题,恐怕早就看腻了。无论是Windows那套经典的Aero,还是Linux发行版里预装的Adwaita&#…...
Python数据分析实战:Pandas处理缺失值的5个高级技巧(附完整代码)
Python数据分析实战:Pandas处理缺失值的5个高级技巧真实业务数据从来不会干净。今天把我在项目中踩过的坑,一次性整理给你。做数据分析的都知道,数据清洗占整个分析工作量的60-80%。而缺失值处理,又是数据清洗中最常见的问题。很多…...
GoPro WiFi Hack实战项目:构建智能相机控制系统的完整案例
GoPro WiFi Hack实战项目:构建智能相机控制系统的完整案例 【免费下载链接】goprowifihack Unofficial GoPro WiFi API Documentation - HTTP GET requests for commands, status, livestreaming and media query. 项目地址: https://gitcode.com/gh_mirrors/go/g…...
