Docker容器技术:容器通信-bridge网络

64 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情

之前课程我们测试过在一个docker容器里面可以ping另一个容器里面:

也就是说两个network-namespace是连在一起的

1. Docker中container如何连在一起的?

sudo docker network ls

上述可以看到docker有哪些网络,现在我们可以看到有三个网络:

第一个其实就是linux的bridge

1.1 bridge介绍

sudo docker network inspect [newtork-id]

这里对应IP看一下可以发现:

我们接着输入ip a 来查看一下机器里面的网络:

image.png

这里我们可以思考一下,我们的busybox容器其实自身有network-namespace,而要连接到docker0上面就需要一对veth,也就是上面的14,然后我们打印一下这个容器的端口:

接着我们如何验证这个呢?我们可以借助一个bridge工具:

sudo yum install bridge-utils

然后执行:

brctl show

image.png

可以看到当前机器上面只有Linux bridge,可以看到他有一个接口veth26d281c,和之前本机的对应veth相同,这就是一对veth。

接着我们新启动一个容器,也就是之前删掉的test2:

sudo docker run -d --name test2 busybox /bin/sh -c "while true;do sleep3600;done"

然后再执行:

sudo docker network inspect bridge

然后我们可以看到除了Container中新增了一段,这里又有一个test2容器练到了bridge上面,接着本机上运行ip a:

image.png

因为我们又多了一个容器,所以又增加了一个veth和test2容器相连:

所以这两个container之间也是可以通信的,就像现实中的网络,例如两台设备都连着同一个交互机,这两台机器就是局域网可以相互通信,原理类似~

2. 容器如何连接外网

其实这个好解释,因为主机是可以访问外网的,所以容器里面数据包要访问外网需要借助NAT(网络地址转换技术)转换成eth0的地址,这样就可以作为linux主机的数据包发到外面去,所以可以通信

3. 创建容器不使用bridge

之前我们发现在创建容器时候其实会默认使用bridge,能不能不使用或者使用自定义的呢?

3.1 自建bridge

通过

sudo docker network create -d bridge my-bridge

这样我们就创建了一个网络:

我们还可以通过brctl show看一下当前的bridge:

发现多了一个~

3.2 新建容器指定网络

可以通过加入 --network [bridge-name]:

然后我们可以通过查看一下这个bridge网络

sudo docker network inspect my-bridge

3.3 改变已存在容器网络

当前之前已经存在的容器也有办法让他指向新的网络:

sudo docker network connect my-bridge test2

然后inspect一下新的bridge,test2也连接过来了:

多了一个test2过来了,但是我们inspect默认的bridge,发现其实也存在:

所以test2连着两个网络。

另外test2连的新建bridge里面也有test3,所以按道理这两个也是连的通的,的确如此:

这里还有一个神奇的地方,就是test3里面也可以通过ping test2形式来ping通test2,但是并没有加入link机制(下面笔记里面的内容),这时因为两个容器都连接到了用户自定义bridge上,这时候两个容器就是link好的了,我们看一下test2这个横跨两个网络的容器:

其实两个eth,这时候ping test3是可以通的,但是ping test1就不行了,但是如果把test1也连接到新建的bridge那么三者就都可以联通了~