容器的网络方案可以分为三大部分:
- 单机的容器间通信;
- 跨主机的容器间通信;
- 容器与主机间通信。
Docker有以下4种网络模式:
- bridge模式,通过--network=bridge指定;
- host模式,通过--network=host指定;
- container模式,通过--network=container:NAME_or_ID指定,即joiner容器;
- none模式,通过--network=none指定。
我们在使用docker run命令创建Docker容器时,可以使用--network选项指定容器的网络模式。
docker run ... --network=bridge
docker run ... --network=host
docker run ... --network=container:其他容器name或id
docker run ... --network=none
在安装完Docker之后,Docker Daemon会在宿主机上自动创建三个网络,分别是bridge网络、host网络和none网络,可以使用docker network ls命令查看,如下所示:
#docker network ls
NETWORK ID NAME DRIVER SCOPE
2f01f5e5421a bridge bridge local
75462fae20e3 host host local
1d84d00c73db none null local
bridge模式
host模式
在host模式下,容器和宿主机共用一个network namespace。,如下图所示。

创建一个host网络的容器:
docker run -it --rm --network=host busybox
在容器中查看一下网络信息:
ifconfig
docker0 Link encap:Ethernet HWaddr 02:42:5E:BF:85:DC
...
ens33 Link encap:Ethernet HWaddr 00:0C:29:66:D9:C8
...
lo Link encap:Local Loopback
...
看到的网卡信息和宿主机中一摸一样。
尝试在容器中操作网络,发现没有权限,所以在容器中对网络的操作是有限制的。
ip link add veth0 type veth peer name veth1
ip: RTNETLINK answers: Operation not permitted
ip addr add 1.2.3.3/24 dev ens33
ip: RTNETLINK answers: Operation not permitted
container模式
与一个指定的容器共用一个network namespace。
同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。Kubernetes的Pod网络采用的就是Docker的container模式网络。
我们创建一个运行nginx服务的容器,再创建一个容器再容器内访问nginx服务器,因为它们共用一个network namespace,所以通过本地回环地址127.0.0.1就可以访问了, 如下所示。
docker run --name some-nginx -d nginx
docker run --network=container:some-nginx rancher/curl curl http://127.0.0.1
none模式
这种模式下的Docker容器拥有自己的network namespace,但是并不为Docker容器进行任何网络配置。 也就是说,这个Docker容器没有网卡、IP、路由等信息,需要我们自己为Docker容器添加网卡、配置IP等。