Skip to content

Bridge 模式

当我们安装完 docker 后,启动 Docker daemon,就会在主机上看到一个 docker0 的网桥,默认在此主机上启动的容器都会连接到这个网桥上。虚拟网桥的工作方式和物理交换机的工作方式类似,我们可以把主机当作是一个物理交换机,这样所有容器都通过交换机连接在了一个二层网络。

当我们启动一个容器,默认会从 docker0 的子网中分配一个 IP 给容器使用,并设置 docker0 的 IP 为容器的默认网关。并且会创建一对虚拟网卡 veth pair 设备,Docker 将 veth pair 的一段放到容器中,命令为 eth0,另一端放在主机上,并以 vethxxxx 命名,并将这个网络设备加入 docker0 网桥中。具体的网络信息可以通过 brctl show 查看,如果没有这个命令,可以通过如下方式安装。

bash
yum install bridge-utils -y

ddf84867974cea95cd0288f64d248be7 MD5

如下,在我们没有启动容器的时候,我的服务器上的网卡信息

8cdd749738c0cb9e6d5ed422a0a30098 MD5

现在,我通过如下命令启动容器

bash
docker run -it busybox /bin/sh

再次查看主机上网卡信息,可以看到主机上多了一个 veth2978031@if51 网卡信息

9f652f17090635e18db50dc0e69b6c43 MD5

而我们在容器里面,可以看到容器的网卡信息

e4841c5e13bb8b57ec389b279b7eb8d7 MD5

我们可以看到容器的网卡名为 eth0,而且 IP 地址和 docker0 在同一个网段,这时候在容器内 ping docker0 是通的。

29db5b79e7942d191aa85aa579b89297 MD5

所以,如果用 bridge 模式,在同一台主机上启动的容器,默认情况下相互是可达的。

Bridge 默认是 docker 默认的网络模式,如果不写-net 参数,就是 bridge 模式。使用 docker run -p 时,docker 实际是在 iptables 上做 DNAT 规则,实现端口转发功能。可以使用 iptables -t nat -vnL 查看。

Bridge 默认如下所示:

d4e92a5ab4aa8fb380c66973588ffb29 MD5

如果你之前有 Docker 使用经验,你可能已经习惯了使用--link参数来使容器互联。随着 Docker 网络的完善,强烈建议大家将容器加入自定义的 Docker 网络来连接多个容器,而不是使用 --link 参数。

下面先创建一个新的 Docker 网络。

plain
$ docker network create -d bridge my-net

-d参数指定 Docker 网络类型,有 bridge overlay。其中 overlay 网络类型用于 Swarm mode,在本小节中你可以忽略它。

运行一个容器并连接到新建的 my-net 网络

plain
$ docker run -it --rm --name busybox1 --network my-net busybox sh

打开新的终端,再运行一个容器并加入到 my-net 网络

plain
$ docker run -it --rm --name busybox2 --network my-net busybox sh

再打开一个新的终端查看容器信息

plain
$ 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 容器输入以下命令

plain
/ # 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,也会成功连接到。

plain
/ # 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`

fec7a218614fb31df1425fbb797eb67c MD5

例如:

首先启动两个容器,指定网络为 host

plain
docker run -itd --name docker1 --net=host busybox
docker run -itd --name docker2 --net=host busybox

然后进入容器查看容器的 IP 地址,以 docker1 为例

plain
docker exec -it docker1 /bin/sh

5d79cb5e788ff39d003ca4903d17ccdc MD5

可以发现和宿主机一模一样。

None 模式

`none`
plain
docker run -it --name docker1 --net=none busybox

然后查看 IP 信息,是没有配置 IP 的。

792a06f2ff29d758c1fd7f892a4d15e3 MD5

Container 模式

a51efe7e0d6eb6af3f8e17f3882531bf MD5

比如,我们启动先启动一个容器:

plain
# # docker run -itd --name my_os ubuntu /bin/bash

然后我们共享 my_web 的网络:

plain
# # docker run -itd --rm --net=container:my_os --name new_os ubuntu

我们分别查看两个容器的网络信息:

在 my_os 容器中:

plain
docker exec -it my_os /bin/bash
ifconfig -a

在 new_os 中:

plain
docker exec -it new_os /bin/bash
ifconfig -a
最近更新