侧边栏壁纸
博主头像
码森林博主等级

一起走进码森林,享受编程的乐趣,发现科技的魅力,创造智能的未来!

  • 累计撰写 146 篇文章
  • 累计创建 74 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

Docker(8):基于 Bridge 网桥的容器间双向通信

码森林
2022-02-24 / 0 评论 / 0 点赞 / 612 阅读 / 2,248 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-02-24,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

上一节我们学习了通过 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的基础概念,如何使用以及实现原理。

0

评论区