24 04 2021

前言

上一节我们学习了通过link命令来进行容器间的单向通信。

那如果需要双向通信,是不是要再每个容器运行时都加link命令呢?
这样做太麻烦~
为了解决这个问题,docker为我们提供了另外的解决方案-利用网桥Bridge来实现多组容器间的双向通信。

基于Bridge网桥的容器间双向通信

1、什么是网桥

所谓的网桥就是虚拟的网络桥接,是docker环境与外部通信必不可少的一个组件,是一个完全虚拟出来的组件。

网桥的主要用途就是docker环境与外部环境进行通信

如图:

网桥可以把内部容器发送的数据包,通过物理网卡,发送给外部环境,与互联网进行交互,反之,物理网卡得到的响应数据也会随着网桥发送给指定的容器。

网桥还有一个更为重要的用途,即是对docker容器在网络层面上进行分组。意思是可以将指定的容器都绑定到网桥上,只要绑定以后这些容器天然可以进行互联互通。

2、网桥的使用

查看docker底层网络服务的明细:

  1. docker network ls
  2. ————————————————————————————————
  3. NETWORK ID NAME DRIVER SCOPE
  4. 39c1556bfec7 bridge bridge local
  5. 4ca94f250814 host host local
  6. 66a4e0d5cdc5 none null local

默认每一个docker都会有一个默认的网桥,承担容器内部与外部环境的通信。

自定义创建网桥:

  1. docker network create -d bridge my-bridge
  2. docker network ls
  3. ————————————————————————————————
  4. NETWORK ID NAME DRIVER SCOPE
  5. 39c1556bfec7 bridge bridge local
  6. 4ca94f250814 host host local
  7. 4f291b291ff9 my-bridge bridge local
  8. 66a4e0d5cdc5 none null local
  9. #自定义网桥创建成功

绑定容器与网桥,使绑定同一个网桥的容器实现互联互通:

  1. #创建两个容器,互不相通
  2. docker run -d --name web tomcat
  3. docker run -d --name database -it centos /bin/bash
  4. #查看容器
  5. docker ps
  6. ————————————————————————————————
  7. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  8. bbaa1942d31b centos "/bin/bash" 26 seconds ago Up 25 seconds database
  9. cc29f8669404 tomcat "catalina.sh run" About a minute ago Up About a minute 8080/tcp web
  10. #此时两个容器已经创建成功了~
  11. #绑定容器与网桥
  12. docker network connect my-bridge web
  13. docker network connect my-bridge database
  14. #验证1,进入web容器,ping database
  15. docker exec -it cc29f8669404 /bin/bash
  16. ping database
  17. ————————————————————————————————
  18. PING database (172.18.0.3) 56(84) bytes of data.
  19. 64 bytes from database.my-bridge (172.18.0.3): icmp_seq=1 ttl=64 time=0.057 ms
  20. 64 bytes from database.my-bridge (172.18.0.3): icmp_seq=2 ttl=64 time=0.059 ms
  21. 64 bytes from database.my-bridge (172.18.0.3): icmp_seq=3 ttl=64 time=0.047 ms
  22. 64 bytes from database.my-bridge (172.18.0.3): icmp_seq=4 ttl=64 time=0.052 ms
  23. #验证2,进入database容器,ping web
  24. docker exec -it bbaa1942d31b /bin/bash
  25. ping web
  26. PING web (172.18.0.2) 56(84) bytes of data.
  27. 64 bytes from web.my-bridge (172.18.0.2): icmp_seq=1 ttl=64 time=0.039 ms
  28. 64 bytes from web.my-bridge (172.18.0.2): icmp_seq=2 ttl=64 time=0.050 ms
  29. 64 bytes from web.my-bridge (172.18.0.2): icmp_seq=3 ttl=64 time=0.055 ms
  30. 64 bytes from web.my-bridge (172.18.0.2): icmp_seq=4 ttl=64 time=0.055 ms
  31. #说明两个容器之间是互通的~

3、网桥实现原理

每当创建网桥,docker都会在宿主机上创建一个虚拟网卡,虚拟网卡也承担了网关的作用。

也就是说容器通过与这个虚拟网卡绑定,容器之间就可以互联互通了,一个容器的数据可以通过网关发送给另外一个容器来接受数据虚拟网卡就实现了一个内部的通路。

但是如果要和外界进行通信,还是需要通过物理网卡来进行地址转换。

总结

本节我们学习了Bridge的基础概念,如何使用以及实现原理。

延伸阅读
  1. Windows下IIS搭建Ftp服务器
  2. Nginx开启Gzip压缩提升页面加载速度
  3. Nginx安装及配置(linux)
  4. Docker(10):Docker-Compose简介及安装
  5. Docker(5):docker镜像分层(layer)
发表评论