Docker网络模型详解
摘要:本文详细介绍了Docker网络配置与管理。首先阐述了网络对Docker体系的重要性,并提供了Docker-CE安装及阿里云镜像加速配置方法。主要内容包括:1)Docker网络基础功能,包括端口映射(-P随机端口、-p指定端口)、端口暴露(EXPOSE指令)和容器互联(自定义网络与link参数);2)四种网络模式详解:host模式(共享宿主机网络)、container模式(共享容器网络)、no

网络是激活Docker体系的唯一途径,如果Docker没有比较出色的容器网络,那么Docker根本没有如今的竞争力,起初Docker网络的解决方案并不理想,但是经过最近几年的发展,再加上很多云计算服务商都参与了进来,大批的SDN方案如雨后春笋般的冒了出来。
前提准备
官网链接:
https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.111e1b11jyJEib
安装docker-ce
[root@localhost ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@localhost ~]# yum -y install yum-utils device-mapper-persistent-data lvm2
[root@localhost ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@localhost ~]# ls /etc/yum.repos.d/
backup Centos-aliyun.repo CentOS-Media.repo docker-ce.repo
[root@localhost ~]# yum -y install docker-ce
[root@localhost ~]# systemctl start docker
[root@localhost ~]# systemctl enable docker
阿里云镜像加速器
[root@localhost ~]# cat << END > /etc/docker/daemon.json
{
"registry-mirrors":[ "https://nyakyfun.mirror.aliyuncs.com" ]
}
END
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
[root@localhost ~]# docker version
Client: Docker Engine - Community
Version: 19.03.8
API version: 1.40
Go version: go1.12.17
Git commit: afacb8b
Built: Wed Mar 11 01:27:04 2020
OS/Arch: linux/amd64
Experimental: false
Server: Docker Engine - Community
Engine:
Version: 19.03.8
API version: 1.40 (minimum version 1.12)
Go version: go1.12.17
Git commit: afacb8b
Built: Wed Mar 11 01:25:42 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.2.13
GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683
[root@docker ~]# docker pull nginx
[root@docker ~]# docker pull busybox
[root@docker ~]# docker pull mysql
[root@docker ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@docker ~]# sysctl -p
一、Docker网络基础
Docker目前对单节点的设备提供了将容器端口映射到宿主机和容器互联两个网络服务。
1.1、端口映射
在Docker中容器默认是无法与外部通信的,需要在启动命令中加入对应的参数才允许容器与外界通信。
当Docker中运行一个Web服务时,需要把容器内的Web服务应用程序端口映射到本地宿主机的端口。这样,用户访问宿主机指定的端口的话,就相当于访问容器内部的Web服务端口。
1、使用-P选项时Docker会随机映射一个端口至容器内部的开放端口
[root@docker ~]# docker run -d -P --name test1 nginx
##使用docker port可以查看端口映射情况
[root@docker ~]# docker port test1
80/tcp -> 0.0.0.0:32768
使用docker logs查看Nginx的日志

[root@docker ~]# docker logs test1
172.17.0.1 - - [24/Nov/2020:14:45:37 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "-"
查看映射的随机端口范围
[root@docker ~]# cat /proc/sys/net/ipv4/ip_local_port_range
32768 60999
2、使用-p可以指定要映射到的本地端口。
-
Local_Port:Container_Port
端口映射参数中指定了宿主机的8000映射到容器内部的80端口,可以多次使用-p选项
[root@docker ~]# docker run -d -p 8000:80 --name test2 nginx

这种方式会映射到所有接口地址,所有访客都可以通过宿主机所有IP的端口来访问容器。
-
Local_IP:Local_Port:Container_Port
映射到指定地址的指定端口
[root@docker ~]# docker run -d -p 192.168.200.111:9000:80 --name test3 nginx

-
Local_IP::Container_Port
映射到指定地址,但是宿主机端口是随机分配的
[root@docker ~]# docker run -d -p 192.168.200.111::80 --name test4 nginx
[root@docker ~]# docker port test4
80/tcp -> 192.168.200.111:32769

-
指定传输协议
[root@docker ~]# docker run -d -p 80:80/tcp --name test5 nginx
[root@docker ~]# docker port test5
80/tcp -> 0.0.0.0:80
1.2、端口暴露
咱们之前讲过EXPOSE命令用于端口暴露,很多人会把端口暴露和端口映射混为一谈,目前有两种方式用于端口暴露,--expose和EXPOSE方式,这两种方式作用相同,但是--expose可以接受端口范围作为参数,例如--expose=2000~3000。
Dockerfile的作者一般在包含EXPOSE规则时都只提示哪个端口提供哪个服务。访问时还需要运维人员通过端口映射来指定。--expose和EXPOSE只是为其他命令提供所需信息的元数据。
通过docker inspect container_name查看网络配置:
[root@docker ~]# docker inspect test1
"NetworkSettings": {
"Bridge": "",
"SandboxID": "c83ae4368c468d3054eede1a83a3a67fe9dc375013f4a585387e5e16243406b3",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"80/tcp": [
{
"HostIp": "0.0.0.0",
"HostPort": "32768"
}
]
},
1.3、容器互联
容器互联是除了端口映射外另一种可以与容器通信的方式。端口映射的用途是宿主机网络与容器的通信,而容器互联是容器之间的通信。
当前实现容器互联有两种方式,一种是把两个容器放进一个用户自定义的网络中,另一种是使用--link参数(已经弃用,即将删除的功能)。
为什么要使用一个单独的网络来连接两个容器呢?
设想一下后端容器需要调用一个数据库环境,数据库容器和后端服务容器如果使用上下文中的暴露端口或者映射端口来通信,势必会把数据库的端口也暴露在外网中,导致数据库容器的安全性大大降低,为了解决这个问题,docker允许用户建立一个独立的网络来放置相应的容器,只有在该网络中的容器才能相互通信,外部容器是无法进入这个特定网络中的。
一个容器可以同时加入多个网络,使用不同地址可以访问不同网络中的容器。
用户自定义的网络
首先创建两个容器,命名为container1和container2
[root@docker ~]# docker run -itd --name=container1 busybox
6200098cb616e6f414b39934153bb18388908547cd1049ea94851df57ec4b74f
[root@docker ~]# docker run -itd --name=container2 busybox
2d77db9b4415f9446f700cd7fb4ad7cf5352797bf79dd712dc69a5ebb139a1f7
接下来创建一个独立的容器网络,这里使用bridge驱动(桥接模式),其他可选的值还有overlay和macvlan。
[root@docker ~]# docker network create -d bridge --subnet 172.25.0.0/16 demo_net
2abcbbf2ecae053b2abdf04fe3169359ca1720711326010762f8fa5e7a08abc5
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
a6f1f7907e11 bridge bridge local
2abcbbf2ecae demo_net bridge local
e963d0ca867a host host local
3995cdd212c7 none null local
使用--subnet和--gateway可以指定子网和网关,现在我们把container2加入到demo_net中
[root@docker ~]# docker network connect demo_net container2
[root@docker ~]# docker network inspect demo_net
"Containers": {
"2d77db9b4415f9446f700cd7fb4ad7cf5352797bf79dd712dc69a5ebb139a1f7": {
"Name": "container2",
"EndpointID": "edccd77eb0fc4a1bf928109ebe4a832a51b506ede59455d934184c1ae26439b5",
"MacAddress": "02:42:ac:19:00:02",
"IPv4Address": "172.25.0.2/16",
"IPv6Address": ""
}
},
使用docker network inspect可以查看网络中容器的连接状态。Container2已经在demo_net网络中,注意IP地址使自动分配的。
启动第三个容器:
[root@docker ~]# docker run --network=demo_net --ip=172.25.3.3 -itd --name=container3 busybox
e480fceffe8be7bbc3bed1c2adca16f75d121a1832dabd6e91a80c7ee6969148
[root@docker ~]# docker network inspect demo_net
"Containers": {
"71cf566a0b7de502c8843206853df1afa38093bb132d91ad0ea0d105b2bbb1e8": {
"Name": "container2",
"EndpointID": "4f56122d24bad49bc6b0e32910e652bf10584fccaac504d0124fb24d754fa01e",
"MacAddress": "02:42:ac:19:00:02",
"IPv4Address": "172.25.0.2/16",
"IPv6Address": ""
},
"e59b255b9abe2d164c08b29411fa9c684f82dee5dbd959aca535ceeafbc527a6": {
"Name": "container3",
"EndpointID": "666aa849ea7b8e9662ed72b817432110543eafefe621cbb0217d850df79c5613",
"MacAddress": "02:42:ac:19:03:03",
"IPv4Address": "172.25.3.3/16",
"IPv6Address": ""
}
},

查看三个容器内部的网络
[root@docker ~]# docker exec -it container1 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:31 errors:0 dropped:0 overruns:0 frame:0
TX packets:11 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3218 (3.1 KiB) TX bytes:742 (742.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:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
[root@docker ~]# docker exec -it container2 ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:03
inet addr:172.17.0.3 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:33 errors:0 dropped:0 overruns:0 frame:0
TX packets:15 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3460 (3.3 KiB) TX bytes:994 (994.0 B)
eth1 Link encap:Ethernet HWaddr 02:42:AC:19:00:02
inet addr:172.25.0.2 Bcast:172.25.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:4 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2598 (2.5 KiB) TX bytes:280 (280.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:19 errors:0 dropped:0 overruns:0 frame:0
TX packets:19 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1502 (1.4 KiB) TX bytes:1502 (1.4 KiB)
[root@docker ~]# docker exec -it container3 ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:19:03:03
inet addr:172.25.3.3 Bcast:172.25.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:936 (936.0 B) TX bytes:280 (280.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:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
[root@docker ~]# docker exec -it container2 ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.132 ms
64 bytes from 172.17.0.2: seq=1 ttl=64 time=0.214 ms
^C
--- 172.17.0.2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.132/0.173/0.214 ms
[root@docker ~]# docker exec -it container2 ping 172.25.3.3
PING 172.25.3.3 (172.25.3.3): 56 data bytes
64 bytes from 172.25.3.3: seq=0 ttl=64 time=0.162 ms
64 bytes from 172.25.3.3: seq=1 ttl=64 time=0.184 ms
[root@docker ~]# docker exec -it container2 ping container3
PING container3 (172.25.3.3): 56 data bytes
64 bytes from 172.25.3.3: seq=0 ttl=64 time=0.160 ms
64 bytes from 172.25.3.3: seq=1 ttl=64 time=0.077 ms
使用link参数
容器的连接(linking)系统是除了端口映射外另一种可以与容器中应用进行交互的方式。它会在源和接收容器之间创建一个隧道,接收容器可以看到源容器指定的信息。
使用这个参数容器必须设置一个名字,也就是--name指定的值。
[root@docker ~]# docker run -itd --name test busybox
7aa2300b180dc5ae443ac5791a77d54686cc7651eab8ce2fcae76a95731c8ba3
--link参数的格式: --link name:alias , 其中name是要链接的容器的名称,alias是这个链接的别名。
[root@docker ~]# docker run -itd --name=link --link test:test busybox
59c1602376ada1238e1ad5007ceaa9931b8309356a53f5aa7ec7a7adda93d205
[root@docker ~]# docker exec -it link ping test
PING test (172.17.0.5): 56 data bytes
64 bytes from 172.17.0.5: seq=0 ttl=64 time=0.201 ms
64 bytes from 172.17.0.5: seq=1 ttl=64 time=0.201 ms
如果忘记设置名字可以通过docker rename来重命名容器,容器名字是唯一的。
此外--link还可以传递环境变量,实现在两个容器之间共享环境变量。
二、Docker网络模式
安装Docker时会自动创建3个网络,可以使用docker network ls命令列出这些网络。
[root@docker ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
2479ceca4e84 bridge bridge local
39e2de843b38 host host local
2621f28b1641 none null local
我们在使用docker run创建容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式:
- Host模式,使用--net=host指定。
- Container模式,使用--net=container:NAME_or_ID指定。
- None模式,使用--net=none指定。
- Bridge模式,使用--net=bridge指定,默认设置。
2.1、Host模式
Docker底层使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptables规则等都与其他的Network Namespace隔离。
一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Root Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。出于安全考虑不推荐使用这种网络模式。
我们在192.168.200.111/24的机器上用Host模式启动一个含有WEB应用的Docker容器,监听TCP 80端口。当我们在容器中执行任何类似ifconfig命令查看网络环境时,看到的都是宿主机上的信息。而外界访问容器中的应用,则直接使用192.168.200.111:80即可,不用任何NAT转换,就如直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
[root@docker ~]# docker run -itd --net=host --name=host busybox
b8875395a491c00bcf57cebc8c7d49d364da5943c32991448e911a207af0b0ea
[root@docker ~]# docker exec -it host ifconfig
br-cbbd18004d01 Link encap:Ethernet HWaddr 02:42:DA:05:B0:06
inet addr:172.25.0.1 Bcast:172.25.255.255 Mask:255.255.0.0
inet6 addr: fe80::42:daff:fe05:b006/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1 errors:0 dropped:0 overruns:0 frame:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:28 (28.0 B) TX bytes:1662 (1.6 KiB)
docker0 Link encap:Ethernet HWaddr 02:42:97:BF:DB:16
inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0
inet6 addr: fe80::42:97ff:febf:db16/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:22 errors:0 dropped:0 overruns:0 frame:0
TX packets:27 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:980 (980.0 B) TX bytes:3180 (3.1 KiB)
ens33 Link encap:Ethernet HWaddr 00:0C:29:CE:EF:5F
inet addr:192.168.200.111 Bcast:192.168.200.255 Mask:255.255.255
.0 inet6 addr: fe80::d69a:8775:e61a:bae1/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:294619 errors:0 dropped:0 overruns:0 frame:0
TX packets:69315 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:426399659 (406.6 MiB) TX bytes:5125327 (4.8 MiB)
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:74 errors:0 dropped:0 overruns:0 frame:0
TX packets:74 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:6220 (6.0 KiB) TX bytes:6220 (6.0 KiB)
veth29219db Link encap:Ethernet HWaddr E6:D1:C5:31:23:E6
inet6 addr: fe80::e4d1:c5ff:fe31:23e6/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4 errors:0 dropped:0 overruns:0 frame:0
TX packets:13 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:280 (280.0 B) TX bytes:978 (978.0 B)
veth356a015 Link encap:Ethernet HWaddr 66:98:14:28:88:6B
inet6 addr: fe80::6498:14ff:fe28:886b/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4 errors:0 dropped:0 overruns:0 frame:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:280 (280.0 B) TX bytes:936 (936.0 B)
veth485953e Link encap:Ethernet HWaddr 22:7C:14:AE:23:83
inet6 addr: fe80::207c:14ff:feae:2383/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:11 errors:0 dropped:0 overruns:0 frame:0
TX packets:19 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:854 (854.0 B) TX bytes:1510 (1.4 KiB)
veth5353e56 Link encap:Ethernet HWaddr FE:33:36:04:A4:79
inet6 addr: fe80::fc33:36ff:fe04:a479/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:11 errors:0 dropped:0 overruns:0 frame:0
TX packets:31 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:854 (854.0 B) TX bytes:3172 (3.0 KiB)
veth895fcaa Link encap:Ethernet HWaddr CE:69:CB:02:5C:46
inet6 addr: fe80::cc69:cbff:fe02:5c46/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:19 errors:0 dropped:0 overruns:0 frame:0
TX packets:40 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1302 (1.2 KiB) TX bytes:3820 (3.7 KiB)
veth8ccf20f Link encap:Ethernet HWaddr 32:E8:09:C3:53:FC
inet6 addr: fe80::30e8:9ff:fec3:53fc/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4 errors:0 dropped:0 overruns:0 frame:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:280 (280.0 B) TX bytes:936 (936.0 B)
vethe977319 Link encap:Ethernet HWaddr 82:9C:A5:2A:2B:C2
inet6 addr: fe80::809c:a5ff:fe2a:2bc2/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:22 errors:0 dropped:0 overruns:0 frame:0
TX packets:42 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1456 (1.4 KiB) TX bytes:4156 (4.0 KiB)
virbr0 Link encap:Ethernet HWaddr 52:54:00:0B:2F:5D
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)
[root@docker ~]# ifconfig
br-cbbd18004d01: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.25.0.1 netmask 255.255.0.0 broadcast 172.25.255.255
inet6 fe80::42:daff:fe05:b006 prefixlen 64 scopeid 0x20<link>
ether 02:42:da:05:b0:06 txqueuelen 0 (Ethernet)
RX packets 11 bytes 854 (854.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 19 bytes 1510 (1.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:97ff:febf:db16 prefixlen 64 scopeid 0x20<link>
ether 02:42:97:bf:db:16 txqueuelen 0 (Ethernet)
RX packets 22 bytes 980 (980.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 27 bytes 3180 (3.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.200.111 netmask 255.255.255.0 broadcast 192.168.200.255
inet6 fe80::d69a:8775:e61a:bae1 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:ce:ef:5f txqueuelen 1000 (Ethernet)
RX packets 294648 bytes 426402027 (406.6 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 69336 bytes 5133939 (4.8 MiB)
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
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 74 bytes 6220 (6.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 74 bytes 6220 (6.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
veth29219db: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::e4d1:c5ff:fe31:23e6 prefixlen 64 scopeid 0x20<link>
ether e6:d1:c5:31:23:e6 txqueuelen 0 (Ethernet)
RX packets 4 bytes 280 (280.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 13 bytes 978 (978.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
veth356a015: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::6498:14ff:fe28:886b prefixlen 64 scopeid 0x20<link>
ether 66:98:14:28:88:6b txqueuelen 0 (Ethernet)
RX packets 4 bytes 280 (280.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 12 bytes 936 (936.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
veth485953e: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::207c:14ff:feae:2383 prefixlen 64 scopeid 0x20<link>
ether 22:7c:14:ae:23:83 txqueuelen 0 (Ethernet)
RX packets 11 bytes 854 (854.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 19 bytes 1510 (1.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
veth5353e56: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::fc33:36ff:fe04:a479 prefixlen 64 scopeid 0x20<link>
ether fe:33:36:04:a4:79 txqueuelen 0 (Ethernet)
RX packets 11 bytes 854 (854.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 31 bytes 3172 (3.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
veth895fcaa: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::cc69:cbff:fe02:5c46 prefixlen 64 scopeid 0x20<link>
ether ce:69:cb:02:5c:46 txqueuelen 0 (Ethernet)
RX packets 19 bytes 1302 (1.2 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 40 bytes 3820 (3.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
veth8ccf20f: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::30e8:9ff:fec3:53fc prefixlen 64 scopeid 0x20<link>
ether 32:e8:09:c3:53:fc txqueuelen 0 (Ethernet)
RX packets 4 bytes 280 (280.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 12 bytes 936 (936.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
vethe977319: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::809c:a5ff:fe2a:2bc2 prefixlen 64 scopeid 0x20<link>
ether 82:9c:a5:2a:2b:c2 txqueuelen 0 (Ethernet)
RX packets 22 bytes 1456 (1.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 42 bytes 4156 (4.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:0b:2f:5d txqueuelen 1000 (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
2.2、container模式
这个模式可以指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。
使用--net=container:container_id/container_name,多个容器使用共同的网络看到的ip是一样的。
[root@docker ~]# docker run -itd --name=con1 busybox
29a3279e8e70169d5840d941c426b59c8408a5b4f50afc810cc214310b06c3c3
[root@docker ~]# docker exec -it con1 ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:07
inet addr:172.17.0.7 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:656 (656.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:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
[root@docker ~]# docker run -itd --net=container:con1 --name=con2 busybox
7985ce368c27e0d03984ca92a7e3bdafacc0972dc3391a6e85973a82fc7fe13f
[root@docker ~]# docker exec -it con2 ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:07
inet addr:172.17.0.7 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:656 (656.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:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
2.3、none模式
在这种模式下,Docker容器拥有自己的Network Namespace,但是并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
使用--net=none指定,这种模式下不会配置任何网络。
[root@docker ~]# docker run -itd --name=none --net=none busybox
7d2703641f604b9125fec65fede1994c18ff0d49febaa8f8e030be46a3e20e18
[root@docker ~]# docker exec -it none ifconfig
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:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
2.4、bridge模式
bridge模式是Docker默认的网络设置,属于一种NAT网络模型,Docker daemon在启动的时候就会建立一个docker0网桥(通过-b参数可以指定),每个容器使用bridge模式启动时,Docker都会为容器创建一对虚拟网络接口(veth pair)设备,这对接口一端在容器的Network Namespace,另一端在docker0,这样就实现了容器与宿主机之间的通信。

在bridge模式下,Docker容器与外部网络通信都是通过iptables规则控制的,这也是Docker网络性能低下的一个重要原因。使用iptables -vnL -t nat可以查看NAT表,在Chain Docker中可以看到容器桥接的规则。
[root@docker ~]# iptables -vnL -t nat
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
0 0 RETURN all -- br-cbbd18004d01 * 0.0.0.0/0 0.0.0.0/0
0 0 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0

2.5、Overlay模式
这是Docker原生的跨主机多子网的网络模型,当创建一个新的网络时,Docker会在主机上创建一个Network Namespace,Network Namespace内有一个网桥,网桥上有一个vxlan接口,每个网络占用一个vxlan ID,当容器被添加到网络中时,Docker会分配一对veth网卡设备,与bridge模式类似,一端在容器里面,另一端在本地的Network Namespace中。
容器A、B、C都在主机A上面,而容器D、E则在主机B上面,现在通过Overlay网络模型可以实现容器A、B、D处于同一个子网,而容器C、E则处于另一个子网中。

Overlay中有一个vxlan ID,值得范围为256~1000,vxlan隧道会把每一个ID相同的网络沙盒连接起来实现一个子网。
更多推荐


所有评论(0)