介绍
docker相当于虚拟机软件 Vmware 或 VirtualBox,是有网络模式,并且安装虚拟网卡
docker虚拟网卡
查看宿主机的ip:
ip a
执行结果如下:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether fa:16:3e:83:56:13 brd ff:ff:ff:ff:ff:ff
inet 192.168.16.4/20 brd 192.168.31.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:fe83:5613/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:22:ab:7b:ff brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:22ff:feab:7bff/64 scope link
valid_lft forever preferred_lft forever
上面的 3: docker0:就是虚拟网卡,ip是172.17.0.1
docker 网络模式
同样,docker中也有网络模式,共4种:
bridge模式,不写参数 或 使用
--net=bridge指定,默认设置。host模式,使用
--net=host指定。container模式,使用
--net=container:NAME_or_ID指定。none模式,使用
--net=none指定。
查看docker网络
查看docker安装了哪些网络
docker network ls
执行结果如下:
NETWORK ID NAME DRIVER SCOPE
2b55b4d8cb35 bridge bridge local
de8e17860cc8 host host local
c25c6222ce03 none null local
有3种网络
查看某网络的详细信息
docker network inspect 【NETWORK ID 或 NAME】
例子:
docker network inspect bridge
执行结果如下:
[
{
"Name": "bridge",
"Id": "2b55b4d8cb353bd6c5784e12fbe58d7ecd0f8018964a2fd22e8d7e579f08d565",
"Created": "2020-07-16T00:24:20.88312208+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"1c1be00c22ed26e1fd89a58778e4d39896cf68020a4ddd822b7d337286ced3b5": {
"Name": "mysql5.7_test",
"EndpointID": "dcde2d7b5c9fc6415797f81a6730369980550f4252dcd98efd0b5411ce2213fb",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
},
"7f426fce9213911c851edb74494ab2a3e77c67a01d889c4f66969fc9fa7f4013": {
"Name": "redis6.0_test3",
"EndpointID": "ccbdb31af8f70ff94305e06c6be17d7d970cb7696822265b64c256ba9aad8573",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
},
"92de4401b2997fc8e3c36068b7c08c95d30b1cdffb66aa27c9412e9e35453634": {
"Name": "tomcat_test",
"EndpointID": "a2a3305d6589fd452b34e31f9d3c8a012b29ff7657628015ba44f17d7f2af4b6",
"MacAddress": "02:42:ac:11:00:04",
"IPv4Address": "172.17.0.4/16",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
其中在 Containers 部分列出有哪些容器使用了该网络
查看容器的网络模式
https://www.malaoshi.top/show_1EF5kAX8OlBQ.html
bridge模式
默认模式
当docker server启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机(路由器)类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。
从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。
类似于Vmware的nat网络模式。同一个宿主机上的所有容器会在同一个网段下,相互之间是可以通信的。
原理
在主机上创建一对虚拟网卡 veth pair 设备,Docker将 veth pair 设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。
验证原理
确定启动上面的tomcat容器后,查看该容器的ip:
docker exec -it tomcat_test ip a
执行结果如下:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
582: eth0@if583: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:04 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.4/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
注意: 上面的 582: eth0@if583:,ip是172.17.0.4
查看宿主机的ip:
ip a
执行结果如下:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether fa:16:3e:83:56:13 brd ff:ff:ff:ff:ff:ff
inet 192.168.16.4/20 brd 192.168.31.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:fe83:5613/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:22:ab:7b:ff brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:22ff:feab:7bff/64 scope link
valid_lft forever preferred_lft forever
583: veth289a0d8@if582: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 82:f5:62:6e:70:be brd ff:ff:ff:ff:ff:ff link-netnsid 2
inet6 fe80::80f5:62ff:fe6e:70be/64 scope link
valid_lft forever preferred_lft forever
注意: 583: veth289a0d8@if582:与容器的网络相对应,这就是 veth pair
优缺点
- 网络的隔离性好
- 一个镜像创建多个容器时,通过
-p参数映射端口,容器本身不需要修改端口 - 有些情况性能较差,如:nginx在大并发压力测试时
- 有些服务不能使用这种模式
host模式
容器 和 宿主机 共用一个Network Namespace,使用宿主机的IP和端口,可以直接与外界通信
容器将不会虚拟出自己的网卡,配置自己的IP等,在容器内看到的网卡ip是宿主机上的ip,不需要进行NAT
除了网络方面,其他的如文件系统、进程列表等还是隔离的
优缺点
网络性能好,nginx docker推荐使用该网络模式
网络的隔离性不好,一个容器使用宿主机的某个端口后,该端口的其他容器无法创建,也无法运行
测试
先停掉容器所有容器
docker stop $(docker ps -q)启动第一个容器,网络为host模式
docker run -d --net="host" tomcat- 启动第一个容器,网络为host模式
docker run -d --net="host" tomcat
- 启动第一个容器,网络为host模式
查看启动的容器:
docker ps发现只有第一个容器启动了查看所有容器:
docker ps -a,发现第二个停掉了
container模式
多个容器使用共同的网络,看到的ip是一样的。
指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。
除了网络方面,其他的如文件系统、进程列表等还是隔离的
none模式
不配置任何网络。
这个模式和前两个不同。在这种模式下,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
应用场景:
- 不需要网络的容器
- 要求安全的容器
感谢:
https://www.jianshu.com/p/22a7032bb7bd



