docker网络

130 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

Docker网络

理解Docker0

  • 看一看我们的网络

1645255753(1).jpg

docker是如何处理网络访问的?

三个测试

#启动一个容器
docker run -d -P --nmae tomcat01 tomcat
#这时查看你的本地网络你会发现多了一个网络信息

企业微信截图_16452561885815.png

这里多出的网络就是docker分配给tomcat01这个容器的

#查看tomcat01这个容器网络地址
docker exec -it tomcat01 ip addr

1645256397(1).jpg

#这里我们在我们的宿主机里ping一下这个容器地址
ping 172.18.0.2
这里我们会发现我们能在宿主机里ping成功
#我们开启第二个容器
docker run -d -P --nmae tomcat02 tomcat
#此时我们取容器02的地址
docker exec -it tomcat02 ip addr
#此时我们再尝试在容器01里平02
docker exec -it tomcat01 ping 172.18.0.3
此时你会发现也能ping通

原理

我们安装docker时会自动给docker分配一个网卡docker0(桥接模式)

我们每启动一个容器,docker0就会给容器分配一个ip

这里使用了evth-pair技术

  • evth-pair
  1. 我们发现网卡是成功成对出现的
  2. evth-pair就是就是一堆虚拟设备接口,一边连着协议,一边相互连着

网络图

1645257551(1).jpg

  • 结论

所有容器公用一个路由器,docker0,在不指定网络的情况下,ip是docker0随机分配的

1645257806(1).jpg

--link

如上面所说,既然接口是虚拟的,ip分配是随机的,那么我们万一容器除了问题,ip随机重置,那我们是不是又要重新配置网络呢??

这里我们在想如果我们能实现直接连接容器的名字是不是就可以解决这些问题了呢?于是我们有了一下测试

  • 来个测试
#接着上述的步骤,我们在tomcat02这个容器里面直接ping tomcat01会发生什么呢?
docker exec -it tomcat02 ping tomcat01
#这里你会发现根本ping不通

显然,在未做其他多余操作时,我们是无法直接ping容器名的

此时的我们只需要添加一个属性就能实现以上想法

#将tomcat03和tomcat02连接
docker run -d tomcat03 --link tomcat02 tomcat
#此时我们来ping tomcat02
docker exec -it tomcat03 ping tomcat02
#这时我们会发现我们能直接ping了

6f542f80dfccb5b447c3b7adb8f7418.png

那有些人闲人就在想我这样能成功吗?

docker exec -it tomcat02 ping tomcat03
#这样反向ping能成功吗? 不行

这里是为什么呢?

docker network ls

1645265771(1).jpg

我们在这里是因为没有在tomcat02里面设置连接tomcat03,所以无法反向ping

#想要实现上述我怎么还需
docker run -d tomcat02 --link tomcat03 tomcat