13. Docker网络
1. Docker 网络
docker安装并启动服务后,会在宿主机中添加一个虚拟网卡。
在Docker服务启动前,使用 ifconfig 或
ip addr 查看网卡信息:
ens33或eth0:本机网卡lo:本机回环网络网卡- 可能有
virbr0(CentOS安装时如果选择的有相关虚拟化服务,就会多一个以网桥连接的私网地址的virbr0网卡,作用是为连接虚拟网卡提供NAT访问外网的功能。如果要移除该服务,可以使用yum remove libvirt-libs.x86_64)
使用 systemctl start docker启动Docker服务后,会多出一个
docker0 网卡。
作用:
- 容器间的互联和通信以及端口映射
- 容器IP变动时候可以通过服务名直接网络通信而不受到影响
Docker容器的网络隔离,是通过Linux内核特性 namespace和
cgroup 实现的。
2. docker网络命令
查看Docker网络模式:
1 | |
如果没有修改过docker network,则默认有3个网络模式:
bridgehostnone
添加Docker网络:
1 | |
删除Docker网络:
1 | |
查看网络元数据:
1 | |
删除所有无效的网络:
1 | |
3. Docker 网络模式
Docker 的网络模式:
| 网络模式 | 简介 | 使用方式 |
|---|---|---|
| bridge | 为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,默认为该模式 |
--network bridge |
| host | 容器将不会虚拟出自己的网卡、配置自己的IP等,而是使用宿主机的IP和端口 | --network host |
| none | 容器有独立的 Network namespace,但并没有对齐进行任何网络设置,如分配
veth pari和 网桥连接、IP等 |
--network none |
| container | 新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口范围等 | --network container:NAME或者容器ID |
查看某个容器的网络模式:
1 | |
4. docker0
Docker
服务默认会创建一个docker0网桥(其上有一个docker0内部接口),该桥接网络的名称为
docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。
Docker默认指定了docker0接口的IP地址和子网掩码,让主机和容器之间可以通过网桥互相通信。
查看bridge网络的详细信息,并通过grep获取名称:
1 | |
可以看到其名称为docker0。
5. bridge模式
Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一个宿主机内的容器接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
docker run的时候,没有指定--network的话,默认使用的网桥模式就是bridge,使用的就是docker0。在宿主机ifconfig就可以看到docker0和自己create的network。
网桥docker0创建一对对等虚拟设备接口,一个叫veth,另一个叫eth0,成对匹配:
整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫
veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫做
veth pair)。
每个容器实例内部也有一块网卡,容器内的网卡接口叫做eth0。
docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。

例如:
启动tomcat容器,进入tomcat容器后,执行
ip addr,可以看到其网卡信息:
1 | |
在宿主机执行 ip addr 查看宿主机网卡信息:
1 | |
6. host模式
直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行 NAT 转换。
容器将不会获得一个独立的 Network Namespace,而是和宿主机共用一个 Network space。
容器将不会虚拟出自己的网卡,而是直接使用宿主机的 IP 和端口。

如果在 docker run 命令中同时使用了
--network host 和 -p端口映射,例如:
1 | |
那么会出现一个警告:
1 | |
因为此时已经使用了host模式,本身就是直接使用的宿主机的IP和端口,此时的-p端口映射就没有了意义,也不会生效,端口号还是会以主机端口号为主。
正确做法是:不再进行-p端口映射,或者改用bridge模式
1 | |
7. none模式
禁用网络功能。
在none模式下,并不为docker容器进行任何网络配置。进入容器内,使用
ip addr查看网卡信息,只能看到
lo(本地回环网络127.0.0.1网卡)。
1 | |
8. container模式
新建的容器和已经存在的一个容器共享网络IP配置,而不是和宿主机共享。
新创建的容器不会创建自己的网卡、IP,而是和一个指定的容器共享IP、端口范围。两个容器除了网络共享,其他的如文件系统、进程列表依然是隔离的。

示例:
1 | |
此时使用
ip addr查看两台容器的网络,会发现两台容器的eth0网卡内的IP等信息完全相同。
如果关掉了alpine1容器,因为alpine2的网络使用的alpine1共享网络,所以关掉alpin1后,alpine2的eth0网卡也随之消失了。
1 | |
9. 自定义网络
容器间的互联和通信以及端口映射。
容器 IP 变动时候可以通过服务名直接网络通信而不受影响。(类似Eureka,通过服务名直接互相通信,而不是写死IP地址)。
docker中还有一个
--link进行容器网络互联,但是已经被标记为过时的,可能会在将来的版本中移除这个功能。推荐使用自定义网络替换link。
自定义桥接网络(自定义网络默认使用的是桥接网络
bridge):
- 新建自定义网络
1 | |
- 查看网络列表
1 | |
- 创建容器时,指定加入我们自定义的网络中
1 | |
- 此时进入
tomcat1中,使用ping命令测试连接tomcat2容器名,发现可以正常连通
1 | |
10. link连接
示例:
1 | |