一、实现效果

docker下的三个容器相互ping通,docker0相当于一个路由器或者网关,容器之间并可以ping通是因为有docker0存在,并不是直接容器ping通容器,每新建一个容器就会出现一个成对存在的网卡,新建容器如果没有指定网络那么默认会在docker0下。这钟技术叫veth-pair技术。

docker 不同网段可以通讯 docker互通_docker 不同网段可以通讯

二、准备工作

一台linux系统虚拟机,提前拉取busybox镜像,我们以busybox镜像为例子,同时需要安装一个网桥管理工具,sudo yum install -y bridge-utils。

!!!如果不以busybox为例子,镜像可能自身不带ping命令,需要用命令获得ping命令,apt-get update && apt-get install iputils-ping。!!!

docker 不同网段可以通讯 docker互通_docker_02

 

docker 不同网段可以通讯 docker互通_docker_03

三、实例配置

1、创建三个容器,分别是test1、test2、test3。

 docker run -dit --name test1 busybox sh

docker 不同网段可以通讯 docker互通_容器_04

查看容器是否启动docker ps

docker 不同网段可以通讯 docker互通_网络_05

2、进入容器:docker exec -it test1 sh,尝试ping。

docker 不同网段可以通讯 docker互通_容器_06

使用docker network ls可以显示当前的docker网络,所有新建的容器网络参数都会记录在bridge网络中,且包括该网络的网关,如果不新建网络的话,只能通过ip才能ping通。

docker 不同网段可以通讯 docker互通_ip地址_07

通过查看bridge网络的内容,查看容器的ip地址:docker inspect bridge

docker 不同网段可以通讯 docker互通_网络_08

docker 不同网段可以通讯 docker互通_容器_09

 再次进入容器ping ip地址,发现可以ping通。(ctrl+p+q可以不关闭容器退出)

或者用docker exec -it test1 ping 172.17.0.2(不用进入容器查看,快捷一点)

docker 不同网段可以通讯 docker互通_容器_10

 现在我们通过ip已经可以互ping了,但我们在实际生活中ip有时候是会变化的,所以我们为了方便一般都是通过容器名称来互ping;现在就来解决这个问题。

首先我们要自定义一个网络,然后再把我们刚刚建立好的容器把他们都放到该网络里面,然后再ping。

3、新建一个名为my-bridge的docker网络(可以用容器的id去ping)

!!!此处有个重点,bridge网络和自行建立的my-bridge的区别,bridge记录所有容器的ip,以及bridge网络的网关,网关一般是172.17.0.1,而my-bridge网络一开始仅仅只有网关,只有你加入的容器,容器网络信息才会在my-bridge里。!!!

docker network create --driver bridge my-bridge

docker 不同网段可以通讯 docker互通_docker_11

 检查网络是否存在:docker network ls

docker 不同网段可以通讯 docker互通_ip地址_12

将容器加入该网络:docker network connect my-bridge test1

docker 不同网段可以通讯 docker互通_网络_13

检查容器是否成功加入my-bridge网络:docker inspect my-bridge

docker 不同网段可以通讯 docker互通_docker_14

另外,值得一提的是如果你想要删除docker网络,使用命令docker network rm my-bridge,如果网络里还有容器的话会报错,可以用docker network disconnect

四、实例测试

再次进入test1容器,用容器名字直接ping通,实例配置完成。至此,不管用ip还是容器名字,都可以ping通。

docker 不同网段可以通讯 docker互通_ip地址_15