『中级篇』 容器之间的Link(27)
2018-09-10 16:27:01
李明
  • 访问次数: 382
  • 注册日期: 2018-07-09
  • 最后登录: 2022-11-17

原创文章,欢迎转载。转载请注明:转载自 IT人故事会,谢谢!
原文链接地址: 『中级篇』 容器之间的Link(27)

上次介绍了默认的网络Bridge,连接到docker0之后还可以跟外界进行通信,查看docker之间的关系link。上节生成了test1和test2,test1和test2之前可以通过ip地址的房还是进行通信的。

场景

如果创建2个容器,一个mysql容器,一个tomcat容器,tomcat容器内后台应用,需要访问mysql数据库容器,按照上节的原理,我需要先进入mysql的容器中查看mysql的ip地址,然后在在tomcat容器的应用中修改程序里面的数据库连接地址才可以完成应用的连接。这样是不是很麻烦。 其实还有一种link的方式可以让应用通信变的简单

  • 启动test1 和test2

sudo docker ps

1240

  • 停止test2,删除test2

sudo docker stop test2 sudo docker rm test2 sudo docker ps

image.png
image.png

  • 加入link创建test2

sudo docker run -d --name test2 --link test1 busybox /bin/sh -c "while true; do sleep 3600; done" sudo docker ps sudo docker exec -it test2 /bin/sh #ping test1 ping 172.17.0.2 ping test1

通过link test1 也就是直接把test1 告诉给test2的ip地址,直接可以通过test1的容器名字,直接找test1

1240
1240

  • 反过来我在test1里面直接ping test2咱们试试

sudo docker exec -it test1 /bin/sh ping test2

1240

上节课通过docker network ls 可以看到一个bridge host none

我们自己创建一个bridge,让容器直接绑定新的bridge

1240

sudo docker network create -d bridge mybridge  sudo docker network ls brctl show

1240
image.png
image.png

#新建test3 连接新的mybridge sudo docker run -d --name test3 --network mybridge busybox /bin/sh -c "while true; do sleep 3600; done" #查看新的mybridge上有新的接口了 brctl show

1240

1240

#查看下新的mybridage它的网络 sudo docker network inspect mybridge

之前都是172.17 这里的是172.18

1240

问题来了,一个17,一个18网段如何让17网段的容器 可以连接在新的18网段上呢

sudo docker network  sudo docker network connect

1240

#我们让连接到mybridage这个network上  sudo docker network connect mybridge test2  sudo docker network inspect mybridge

image.png
image.png

我们在test3上尝试ping下test2 看能否ping通

sudo docker exec -it test3 /bin/sh #ping test2的ip地址 ping 172.18.0.3 #ping test2 ping test2

1240

是不是有点神奇,按照常理我不通过link不可以通过名称直接ping通test2,而这里我们成功的ping通了test2,这是为什么呢?我们test2和test3因为都连接了用户自己创建的bridge上,这2个默认就是连接好的,可以直接通过名称。咱们在试试通过test2来ping test3试试.

sudo docker exec -it test2 /bin/sh ip a ping test3 #ping test1,是可以ping通的 因为之前咱们已经link上去了,如果不link根本是ping不通的。如果ping不通 也可以通过 sudo docker network connect mybridge test1 的方式来ping ping test1

1240
1240

PS:用户自定义的bridge 和 docker0 这个bridge他们之前的区别,docker0 如果通过名称想找到需要通过link,实际的项目中很少使用link,其实让大家知道link这个命令。