• 理解容器之间的连通性


    通过前面小节的实践,当前 docker host 的网络拓扑结构如下图所示,今天我们将讨论这几个容器之间的连通性。

    163.png

    两个 busybox 容器都挂在 my_net2 上,应该能够互通,我们验证一下:

    可见同一网络中的容器、网关之间都是可以通信的。

    my_net2 与默认 bridge 网络能通信吗?

    从拓扑图可知,两个网络属于不同的网桥,应该不能通信,我们通过实验验证一下,让 busybox 容器 ping httpd 容器:

    确实 ping 不通,符合预期。

    “等等!不同的网络如果加上路由应该就可以通信了吧?”我已经听到有读者在建议了。

    这是一个非常非常好的想法。

    确实,如果 host 上对每个网络的都有一条路由,同时操作系统上打开了 ip forwarding,host 就成了一个路由器,挂接在不同网桥上的网络就能够相互通信。下面我们来看看 docker host 满不满足这些条件呢?

    ip r 查看 host 上的路由表:

    # ip r

    ......

    172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.0.1

    172.22.16.0/24 dev br-5d863e9f78b6  proto kernel  scope link  src 172.22.16.1

    ......


    172.17.0.0/16 和 172.22.16.0/24 两个网络的路由都定义好了。再看看 ip forwarding:

    # sysctl net.ipv4.ip_forward

    net.ipv4.ip_forward = 1


    ip forwarding 也已经启用了。

    条件都满足,为什么不能通行呢?

    我们还得看看 iptables:

    # iptables-save

    ......

    -A DOCKER-ISOLATION -i br-5d863e9f78b6 -o docker0 -j DROP

    -A DOCKER-ISOLATION -i docker0 -o br-5d863e9f78b6 -j DROP

    ......


    原因就在这里了:iptables DROP 掉了网桥 docker0 与 br-5d863e9f78b6 之间双向的流量

    从规则的命名 DOCKER-ISOLATION 可知 docker 在设计上就是要隔离不同的 netwrok。

    那么接下来的问题是:怎样才能让 busybox 与 httpd 通信呢?

    答案是:为 httpd 容器添加一块 net_my2 的网卡。这个可以通过docker network connect 命令实现。

    我们在 httpd 容器中查看一下网络配置:

    容器中增加了一个网卡 eth1,分配了 my_net2 的 IP 172.22.16.3。现在 busybox 应该能够访问 httpd 了,验证一下:

    busybox 能够 ping 到 httpd,并且可以访问 httpd 的 web 服务。当前网络结构如图所示:

    下一节我们讨论容器间通信的三种方式

    二维码+指纹.png

  • 相关阅读:
    初识React
    前端跨页面传值 cookie,sessionStorage,url传参
    commonJS 和 es6规范 的引入导出(摘自简书sf)
    Vue2.x 添加element UI 组件
    python3 基础1
    webapck 插件HtmlWebpackPlugin的使用以及webpack 热更新;
    ES6 基础(set数据结构和map数据结构)
    ansible批量部署模块(二)
    ansible批量部署(一)
    ssh远程管理
  • 原文地址:https://www.cnblogs.com/CloudMan6/p/7087765.html
Copyright © 2020-2023  润新知