Bridge 模式
当我们安装完 docker 后,启动 Docker daemon,就会在主机上看到一个 docker0 的网桥,默认在此主机上启动的容器都会连接到这个网桥上。虚拟网桥的工作方式和物理交换机的工作方式类似,我们可以把主机当作是一个物理交换机,这样所有容器都通过交换机连接在了一个二层网络。
当我们启动一个容器,默认会从 docker0 的子网中分配一个 IP 给容器使用,并设置 docker0 的 IP 为容器的默认网关。并且会创建一对虚拟网卡 veth pair 设备,Docker 将 veth pair 的一段放到容器中,命令为 eth0,另一端放在主机上,并以 vethxxxx 命名,并将这个网络设备加入 docker0 网桥中。具体的网络信息可以通过 brctl show 查看,如果没有这个命令,可以通过如下方式安装。
yum install bridge-utils -y
如下,在我们没有启动容器的时候,我的服务器上的网卡信息
现在,我通过如下命令启动容器
docker run -it busybox /bin/sh
再次查看主机上网卡信息,可以看到主机上多了一个 veth2978031@if51 网卡信息
而我们在容器里面,可以看到容器的网卡信息
我们可以看到容器的网卡名为 eth0,而且 IP 地址和 docker0 在同一个网段,这时候在容器内 ping docker0 是通的。
所以,如果用 bridge 模式,在同一台主机上启动的容器,默认情况下相互是可达的。
Bridge 默认是 docker 默认的网络模式,如果不写-net 参数,就是 bridge 模式。使用 docker run -p 时,docker 实际是在 iptables 上做 DNAT 规则,实现端口转发功能。可以使用 iptables -t nat -vnL 查看。
Bridge 默认如下所示:
如果你之前有 Docker 使用经验,你可能已经习惯了使用--link
参数来使容器互联。随着 Docker 网络的完善,强烈建议大家将容器加入自定义的 Docker 网络来连接多个容器,而不是使用 --link 参数。
下面先创建一个新的 Docker 网络。
$ docker network create -d bridge my-net
-d
参数指定 Docker 网络类型,有 bridge overlay
。其中 overlay 网络类型用于 Swarm mode,在本小节中你可以忽略它。
运行一个容器并连接到新建的 my-net 网络
$ docker run -it --rm --name busybox1 --network my-net busybox sh
打开新的终端,再运行一个容器并加入到 my-net 网络
$ docker run -it --rm --name busybox2 --network my-net busybox sh
再打开一个新的终端查看容器信息
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b47060aca56b busybox "sh" 11 minutes ago Up 11 minutes busybox2
8720575823ec busybox "sh" 16 minutes ago Up 16 minutes busybox1
下面通过 ping 来证明 busybox1 容器和 busybox2 容器建立了互联关系。 在 busybox1 容器输入以下命令
/ # ping busybox2
PING busybox2 (172.19.0.3): 56 data bytes
64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.072 ms
64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.118 ms
用 ping 来测试连接 busybox2 容器,它会解析成 172.19.0.3。 同理在 busybox2 容器执行 ping busybox1,也会成功连接到。
/ # ping busybox1
PING busybox1 (172.19.0.2): 56 data bytes
64 bytes from 172.19.0.2: seq=0 ttl=64 time=0.064 ms
64 bytes from 172.19.0.2: seq=1 ttl=64 time=0.143 ms
这样,busybox1 容器和 busybox2 容器建立了互联关系。
如果你有多个容器之间需要互相连接,推荐使用Docker Compose
。
Host 模式
`host``Network Namespace`例如:
首先启动两个容器,指定网络为 host
docker run -itd --name docker1 --net=host busybox
docker run -itd --name docker2 --net=host busybox
然后进入容器查看容器的 IP 地址,以 docker1 为例
docker exec -it docker1 /bin/sh
可以发现和宿主机一模一样。
None 模式
`none`docker run -it --name docker1 --net=none busybox
然后查看 IP 信息,是没有配置 IP 的。
Container 模式
比如,我们启动先启动一个容器:
# # docker run -itd --name my_os ubuntu /bin/bash
然后我们共享 my_web 的网络:
# # docker run -itd --rm --net=container:my_os --name new_os ubuntu
我们分别查看两个容器的网络信息:
在 my_os 容器中:
docker exec -it my_os /bin/bash
ifconfig -a
在 new_os 中:
docker exec -it new_os /bin/bash
ifconfig -a