上一节我们学习了通过 link 命令来进行容器间的单向通信。那如果需要双向通信,是不是要再每个容器运行时都加 link 命令呢?这样做太麻烦~为了解决这个问题,docker 为我们提供了另外的解决方案-利用网桥 Bridge 来实现多组容器间的双向通信。
基于Bridge网桥的容器间双向通信
什么是网桥
所谓的网桥就是虚拟的网络桥接,是docker环境与外部通信必不可少的一个组件,是一个完全虚拟出来的组件。
网桥的主要用途就是docker环境与外部环境进行通信。
如图:
网桥可以把内部容器发送的数据包,通过物理网卡,发送给外部环境,与互联网进行交互,反之,物理网卡得到的响应数据也会随着网桥发送给指定的容器。
网桥还有一个更为重要的用途,即是对docker容器在网络层面上进行分组。意思是可以将指定的容器都绑定到网桥上,只要绑定以后这些容器天然可以进行互联互通。
网桥的使用
查看docker底层网络服务的明细:
docker network ls
————————————————————————————————
NETWORK ID NAME DRIVER SCOPE
39c1556bfec7 bridge bridge local
4ca94f250814 host host local
66a4e0d5cdc5 none null local
默认每一个docker都会有一个默认的网桥,承担容器内部与外部环境的通信。
自定义创建网桥:
docker network create -d bridge my-bridge
docker network ls
————————————————————————————————
NETWORK ID NAME DRIVER SCOPE
39c1556bfec7 bridge bridge local
4ca94f250814 host host local
4f291b291ff9 my-bridge bridge local
66a4e0d5cdc5 none null local
#自定义网桥创建成功
绑定容器与网桥,使绑定同一个网桥的容器实现互联互通:
#创建两个容器,互不相通
docker run -d --name web tomcat
docker run -d --name database -it centos /bin/bash
#查看容器
docker ps
————————————————————————————————
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bbaa1942d31b centos "/bin/bash" 26 seconds ago Up 25 seconds database
cc29f8669404 tomcat "catalina.sh run" About a minute ago Up About a minute 8080/tcp web
#此时两个容器已经创建成功了~
#绑定容器与网桥
docker network connect my-bridge web
docker network connect my-bridge database
#验证1,进入web容器,ping database
docker exec -it cc29f8669404 /bin/bash
ping database
————————————————————————————————
PING database (172.18.0.3) 56(84) bytes of data.
64 bytes from database.my-bridge (172.18.0.3): icmp_seq=1 ttl=64 time=0.057 ms
64 bytes from database.my-bridge (172.18.0.3): icmp_seq=2 ttl=64 time=0.059 ms
64 bytes from database.my-bridge (172.18.0.3): icmp_seq=3 ttl=64 time=0.047 ms
64 bytes from database.my-bridge (172.18.0.3): icmp_seq=4 ttl=64 time=0.052 ms
#验证2,进入database容器,ping web
docker exec -it bbaa1942d31b /bin/bash
ping web
PING web (172.18.0.2) 56(84) bytes of data.
64 bytes from web.my-bridge (172.18.0.2): icmp_seq=1 ttl=64 time=0.039 ms
64 bytes from web.my-bridge (172.18.0.2): icmp_seq=2 ttl=64 time=0.050 ms
64 bytes from web.my-bridge (172.18.0.2): icmp_seq=3 ttl=64 time=0.055 ms
64 bytes from web.my-bridge (172.18.0.2): icmp_seq=4 ttl=64 time=0.055 ms
#说明两个容器之间是互通的~
网桥实现原理
每当创建网桥,docker都会在宿主机上创建一个虚拟网卡,虚拟网卡也承担了网关的作用。
也就是说容器通过与这个虚拟网卡绑定,容器之间就可以互联互通了,一个容器的数据可以通过网关发送给另外一个容器来接受数据虚拟网卡就实现了一个内部的通路。
但是如果要和外界进行通信,还是需要通过物理网卡来进行地址转换。
总结
本节我们学习了Bridge的基础概念,如何使用以及实现原理。
评论区