当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。
同时,Docker 随机分配一个本地未占用的私有网段(在 RFC1918 中定义)中的一个地址给 docker0 接口。比如典型的172.17.0.1 ,掩码为 255.255.0.0 。此后启动的容器内的网口也会自动分配一个同一网段( 172.17.0.0/16 )的地址。当创建一个 Docker 容器的时候,同时会创建了一对 veth pair 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 eth0 ;另一端在本地并被挂载到docker0 网桥,名称以 veth 开头(例如 vethAQI2QT )。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。
当你安装Docker时,它会自动创建三个网络。你可以使用以下docker network ls命令列出这些网络:
[root@centos7 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
c73da85e3d18 bridge bridge local
4c484f1fad68 host host local
08e0be372dd3 none null local
Docker内置这三个网络,当运行容器时,可以使用–network标志来指定容器使用何种网络。
docker0网络时默认使用的网络。除非你使用该docker run --network=选项指定,否则Docker守护程序默认将容器连接到此网络。
[root@centos7 ~]# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:8d:9c:5b:02 txqueuelen 0 (Ethernet)
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
Docker 四种网络模式
我们在使用docker run创建Docker容器时,可以用 --net 选项指定容器的网络模式,Docker可以有以下4种网络模式
Docker网络模式 | 配置 | 说明 |
---|---|---|
host模式 | –net=host | 容器和宿主机共享Network namespace。 |
container模式 | –net=container:NAME_or_ID | 容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace。 |
none模式 | –net=none | 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等,只有lo网卡。 |
bridge模式 | –net=bridge | (默认为该模式) |
如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好。
container模式
这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。
none模式
使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过–network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。
bridge模式
当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥(docker0桥是NAT桥),此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。
bridge模式是docker的默认网络模式,不写–net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。
创建一个使用none网络模式的容器
[root@centos7 ~]# docker run --rm --net none busybox:latest ifconfig -a
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
bridge container
创建一个桥接式容器,桥接式容器一般拥有两个接口:一个环回接口和一个连接至主机上某桥设备的以太网接口
[root@centos7 ~]# docker run --rm --net bridge busybox:latest ifconfig -a
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:02
inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:180 (180.0 B) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
在运行容器时,也可以通过一些选项,来设置一些与网络相关的参数。
“–hostname HOSTNAME”选项为容器指定主机名,例如
[root@centos7 ~]# docker run --rm -it --hostname WWW.CWJ.com busybox:latest
/ # hostname
WWW.CWJ.com
/ # cat /etc/resolv.conf
# Generated by NetworkManager
search DHCP HOST cwj.com
nameserver 211.140.13.188
nameserver 211.140.188.188
查看宿主机的DNS服务,可以看出容器中默认的DNS服务使用的是外部宿主机的DNS服务
[root@centos7 ~]# cat /etc/resolv.conf
# Generated by NetworkManager
search DHCP HOST cwj.com
nameserver 211.140.13.188
nameserver 211.140.188.188
但是,我们也可以自己指定DNS服务器,“–dns DNS_SERVER_IP”选项能够为容器指定所使用的dns服务器地址,例如
[root@centos7 ~]# docker run --rm -it --hostname WWW.CWJ.com --dns 114.144.114.114 busybox:latest
/ # cat /etc/resolv.conf
search DHCP HOST cwj.com
nameserver 114.144.114.114
当想要解析某个主机名时, “–add-host HOSTNAME:IP”选项能够为容器指定本地主机名解析项,例如
[root@centos7 ~]# docker run --rm -it --hostname WWW.CWJ.com --dns 114.144.114.114 --add-host "www.pornhub.com:192.168.114.114" busybox:latest
/ # cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
192.168.114.114 www.pornhub.com
172.17.0.2 WWW.CWJ.com WWW
Docker0为NAT桥,因此容器一般获得的是私有网络地址,此时容器想相当于宿主机NAT服务背后的主机,如果开放容器或其上的服务为外部网络访问,需要在宿主机上为其定义DNAT规则,但是在容器中无需定义那么复杂的iptables规则,只需在docker run时使用-p选项即可实现端口映射,无须手动添加规则。
将指定的容器端口映射至主机所有地址的一个动态端口
-p
[root@centos7 ~]# docker run --rm --name web1 -p 80 chenwenj/httpd:v3
[root@centos7 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
98caff43c5c1 chenwenj/httpd:v3 "/bin/httpd -f -h /d…" 50 seconds ago Up 49 seconds 0.0.0.0:32768->80/tcp web1
使用docker exec交互式连接到容器中,可以看到80端口已经开启了。
[root@centos7 ~]# docker exec -it web1 /bin/sh
/ # netstat -ntl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 :::80 :::* LISTEN
“动态端口”指随机端口,具体的映射结果可使用docker port命令查看
[root@centos7 ~]# docker port web1
80/tcp -> 0.0.0.0:32768
将容器端口containerPort映射至指定的主机端口hostPort
要确保该主机端口没被使用
-p :
[root@centos7 ~]# docker run --name web1 -p 81:80 chenwenj/httpd:v3
[root@centos7 ~]# docker port web1
80/tcp -> 0.0.0.0:81
通过外部访问
将指定的容器端口containerPort映射至主机指定ip的动态端口
-p ::
[root@centos7 ~]# docker run --rm --name web1 -p 192.168.239.132::80 chenwenj/httpd:v3
[root@centos7 ~]# docker port web1
80/tcp -> 192.168.239.132:32768
将指定的容器端口containerPort映射至主机指定ip的端口hostPort
-p ::
[root@centos7 ~]# docker run --rm --name web1 -p 192.168.239.132:83:80 chenwenj/httpd:v3
[root@centos7 ~]# docker port web1
80/tcp -> 192.168.239.132:83
“-P”选项或“–publish-all”将容器的所有计划要暴露端口全部映射至主机端口,计划要暴露的端口使用使用–expose选项指定
ɝ 例如
[root@centos7 ~]# docker run --rm -P --expose 81 --expose 82 --name web1 chenwenj/httpd:v3
查看映射结果
[root@centos7 ~]# docker port web1
81/tcp -> 0.0.0.0:32777
82/tcp -> 0.0.0.0:32776
[root@centos7 ~]# docker run --rm -P --expose 88 --expose 89 --name web1 busybox:latest /bin/httpd -f
查看映射结果
[root@centos7 ~]# docker port web1
88/tcp -> 0.0.0.0:32785
89/tcp -> 0.0.0.0:32784
Joined containers
联盟式容器是指使用某个已存在容器的网络接口的容器,接口被联盟内的各容器共享使用,因此,联盟式容器彼此间完全无隔离。
创建一个容器,并在容器中启动http服务,监听于80端口
[root@centos7 ~]# docker run --rm -it --name web1 busybox:latest /bin/sh
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:02
inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:7 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:578 (578.0 B) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
创建一个联盟式容器
此时会发现容器的网络IP与web1容器相同。
[root@centos7 ~]# docker run --rm --name joinweb1 -it --net container:web1 busybox:latest
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:02
inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:8 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:648 (648.0 B) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
然后在web1这个容器上启动http服务
/ # mkdir -p /data/html
/ # echo "hello world" > /data/html/index.html
/ # httpd -h /data/html
在联盟式容器上,查看端口情况,并访问本机的127.0.0.1的地址。
/ # netstat -ntl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 :::80 :::* LISTEN
/ # wget -O - -q 127.0.0.1
hello world
联盟式容器彼此间虽然共享同一个网络名称空间,但其它名称空间如User、Mount等还是隔离的。联盟式容器彼此间存在端口冲突的可能性,因此,通常只会在多个容器上的程序需要程序loopback接口互相通信、或对某已存的容器的网络属性进行监控时才使用此种模式的网络模型
Open containers
开放式容器共享主机网络名称空间的容器,它们对主机的网络名称空间拥有全部的访问权限,包括访问那些关键性服务,这
对宿主机安全性有很大潜在威胁
docker run命令使用“–net host”选项即可创建开放式容器,
[root@centos7 ~]# docker run -it --rm --net host busybox:latest /bin/sh
/ # ifconfig
docker0 Link encap:Ethernet HWaddr 02:42:8D:9C:5B:02
inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0
inet6 addr: fe80::42:8dff:fe9c:5b02/64 Scope:Link
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:68 errors:0 dropped:0 overruns:0 frame:0
TX packets:69 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:4858 (4.7 KiB) TX bytes:7390 (7.2 KiB)
ens33 Link encap:Ethernet HWaddr 00:0C:29:BF:A8:63
inet addr:192.168.239.132 Bcast:192.168.239.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:febf:a863/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:12351 errors:0 dropped:0 overruns:0 frame:0
TX packets:8670 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1122582 (1.0 MiB) TX bytes:887119 (866.3 KiB)
ens37 Link encap:Ethernet HWaddr 00:0C:29:BF:A8:6D
inet addr:192.168.1.109 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:febf:a86d/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:29189 errors:0 dropped:0 overruns:0 frame:0
TX packets:5432 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:11040014 (10.5 MiB) TX bytes:346738 (338.6 KiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:1404 (1.3 KiB) TX bytes:1404 (1.3 KiB)
virbr0 Link encap:Ethernet HWaddr 52:54:00:8F:D4:35
inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
在容器中开启http服务
/ # echo "hello container" > /tmp/index.html
/ # httpd -h /tmp/
/ # netstat -ntl | grep 80
tcp 0 0 :::80 :::* LISTEN
如果不想使用默认的docker0桥接口,或者需要修改此桥接口的网络属性,可通过为docker daemon命令使用-b、–bip、–
fixed-cidr、–default-gateway、–dns以及–mtu等选项进行设定。但是这些设定都是临时生效的,若想永久有效得编辑/etc/docker/daemon.json文件
自定义docker0桥的网络属性信息:/etc/docker/daemon.json文件
{
"bip": "192.168.1.5/24",
"fixed-cidr": "10.20.0.0/16",
"fixed-cidr-v6": "2001:db8::/64",
"mtu": 1500,
"default-gateway": "10.20.1.1",
"default-gateway-v6": "2001:db8:abcd::89",
"dns": ["10.20.1.2","10.20.1.3"]
}
核心选项为bip,即bridge ip之意,用于指定docker0桥自身的IP地址;其它选项可通过此地址计算得出。
dns服务得人工指定
[root@centos7 ~]# vim /etc/docker/daemon.json
{
"registry-mirrors" : ["https://registry.docker-cn.com","https://vwmwhn89.mirror.aliyuncs.com"],
"bip": "10.10.0.1/16",
"dns": ["114.114.114.114","8.8.8.8"]
}
重启docker服务此时,docker0桥
[root@centos7 ~]# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 10.10.0.1 netmask 255.255.0.0 broadcast 10.10.255.255
ether 02:42:ea:9e:ee:ba txqueuelen 0 (Ethernet)
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
自定义容器网络
如果我们不想使用docker默认的网络,也可以自定义网络,通过docker network create实现。
docker info查看容器支持的网络类型,目前的容器
[root@centos7 ~]# docker info | grep -i network
Network: bridge host ipvlan macvlan null overlay
示例:
创建一个名为mybr0的网络,其类型为bridge,网络地址是172.16.0.0/16,网关为172.16.0.1
[root@centos7 ~]# docker network create -d bridge --subnet "172.16.0.0/16" --gateway "172.16.0.1" mybr0
004f67c1a85f66fd6a5fa939600cfc7642e83dc792cce9e2ee4bf6b6104eb4f3
[root@centos7 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
c507728af225 bridge bridge local
4c484f1fad68 host host local
004f67c1a85f mybr0 bridge local
08e0be372dd3 none null local
这个网络的接口名是br-004f67c1a85f,不是mybr0。
[root@centos7 ~]# ifconfig
br-004f67c1a85f: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.16.0.1 netmask 255.255.0.0 broadcast 172.16.255.255
ether 02:42:5e:98:6c:ba txqueuelen 0 (Ethernet)
RX packets 9177 bytes 776303 (758.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1297 bytes 82288 (80.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
可以这个网络接口改个名字
[root@centos7 ~]# ip link set dev br-004f67c1a85f down ##改名之前先关闭这个网络接口
[root@centos7 ~]# ip link set dev br-004f67c1a85f name docker1
[root@centos7 ~]# ip link set dev docker1 up
[root@centos7 ~]# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 10.10.0.1 netmask 255.255.0.0 broadcast 10.10.255.255
ether 02:42:ea:9e:ee:ba txqueuelen 0 (Ethernet)
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
docker1: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.16.0.1 netmask 255.255.0.0 broadcast 172.16.255.255
ether 02:42:5e:98:6c:ba txqueuelen 0 (Ethernet)
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
指定容器运行时要加入mybr0网络
[root@centos7 ~]# systemctl restart docker
[root@centos7 ~]# docker run --name t1 -it --net mybr0 busybox:latest
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:10:00:02
inet addr:172.16.0.2 Bcast:172.16.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:24 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2650 (2.5 KiB) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
注意
更改自定义网络的网络接口名后,要重启docker,不然会报错。
同一宿主机上的两个属于不同网络的容器之间通信
再启动一个容器,使用docker0 桥的网络
[root@centos7 ~]# docker run --name t2 -it --net bridge busybox:latest
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:0A:0A:00:02
inet addr:10.10.0.2 Bcast:10.10.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:19 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2187 (2.1 KiB) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
此时t1容器若想与t2容器通信,只需在宿主机上开启路由转发即可
[root@centos7 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@centos7 ~]# cat /proc/sys/net/ipv4/ip_forward
1
在容器t1上ping 容器t2
[root@centos7 ~]# docker run --name t1 -it --net mybr0 busybox:latest
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:10:00:02
inet addr:172.16.0.2 Bcast:172.16.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:24 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2650 (2.5 KiB) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
/ # ping 10.10.0.2
PING 10.10.0.2 (10.10.0.2): 56 data bytes
先ping不通是由于iptables规则阻止。