上次介绍了默认的网络Bridge,连接到docker0之后还可以跟外界进行通信,查看docker之间的关系link。上节生成了test1和test2,test1和test2之前可以通过ip地址的房还是进行通信的。
场景
如果创建2个容器,一个mysql容器,一个tomcat容器,tomcat容器内后台应用,需要访问mysql数据库容器,按照上节的原理,我需要先进入mysql的容器中查看mysql的ip地址,然后在在tomcat容器的应用中修改程序里面的数据库连接地址才可以完成应用的连接。这样是不是很麻烦。 其实还有一种link的方式可以让应用通信变的简单
- 启动test1 和test2
sudo docker ps
- 停止test2,删除test2
sudo docker stop test2 sudo docker rm test2 sudo docker ps
- 加入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
- 反过来我在test1里面直接ping test2咱们试试
sudo docker exec -it test1 /bin/sh ping test2
上节课通过docker network ls 可以看到一个bridge host none
我们自己创建一个bridge,让容器直接绑定新的bridge
sudo docker network create -d bridge mybridge
sudo docker network ls
brctl show
#新建test3 连接新的mybridge
sudo docker run -d --name test3 --network mybridge busybox /bin/sh -c "while true; do sleep 3600; done"
#查看新的mybridge上有新的接口了
brctl show
#查看下新的mybridage它的网络
sudo docker network inspect mybridge
之前都是172.17 这里的是172.18
问题来了,一个17,一个18网段如何让17网段的容器 可以连接在新的18网段上呢
sudo docker network
sudo docker network connect
#我们让连接到mybridage这个network上
sudo docker network connect mybridge test2
sudo docker network inspect mybridge
我们在test3上尝试ping下test2 看能否ping通
sudo docker exec -it test3 /bin/sh #ping test2的ip地址 ping 172.18.0.3 #ping test2 ping test2
是不是有点神奇,按照常理我不通过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
PS:用户自定义的bridge 和 docker0 这个bridge他们之前的区别,docker0 如果通过名称想找到需要通过link,实际的项目中很少使用link,其实让大家知道link这个命令。