首页 > 经验记录 > Docker networking

Docker networking

 

docker 网络设置

容器之间的连接用网络创建。

允许用户创建自己的网络,容器通过这个网络互相通信;

可以跨越不同的宿主机来通信,网络配置也更灵活;

可以在无需更新连接的情况下,停止、启动或者重启容器;

不必事先创建容器再去连接它,也不必关心容器的运行顺序,可以在网络内部获得容器名解析和发现;

和docker compose以及swarm进行了集成;

在docker网络内部启动的容器,会感知到所有在这个网络下运行的容器,

并通过/etc/hosts文件将这些容器的地址保存到本地DNS中, 网络内的任何主机都可以使用hostname或 hostname.netname 的形式来被解析访问,

如果任何一个容器重启了,其IP地址会自动在/etc/hosts文件中更新,

测试中发现/etc/hosts文件中好像没有新增其他容器的地址,但也能互相ping通;

一个容器可以同时加入多个网络,所以可以创建非常复杂的网络模型;

  • docker network create 创建一个网络

  • docker network inspect 查看网络的详细信息

  • docker network ls 列出当前系统中的所有网络

  • docker network connect 将已有容器连接到一个网络

  • docker network disconnect 从网络中断开一个容器

  • docker network rm 删除一个或多个网络

  • docker network prune 删除所有未使用的网络

 

docker链接 (高版本已经被废弃)

在链接过程中要引用到容器的名字,且只能工作于同一台宿主机中。

在docker run启动容器时用参数 –link 创建两个容器间的 客户-服务 链接,

需要两个参数,一个是链接容器的名字,一个是链接的别名,即 –link redis:db,

被链接的容器是服务,链接让服务容器能够和客户容器通信,

客户容器可直接访问服务容器的任意公开端口,所以服务容器的端口不需要对本地宿主机公开,相对更加安全;

可以把多个客户容器链接到同一个服务容器,也可通过指定多次–link来链接到多个服务容器,

docker在容器的/etc/hosts文件和包含链接信息的环境变量里写入链接信息;

无论采用哪种方式,都可以创建一个Web应用程序栈,包含以下组件:

  • 一个Web服务器容器

  • 一个Redis数据库容器

  • 两个容器间的一个安全链接

 

用户自定义bridge

用户自定义bridge相对于使用默认bridge的主要优势:

用户自定义bridge可以在容器化的应用程序提供更好的隔离效果和更好的互通性:

这段话看似有些矛盾,但是其中更好的隔离效果是针对外界网络,而更好的互通性则是指同一bridge下的不同容器之间。

还是以一个分别部署了Web服务和mysql服务的两个容器container1、container2为例,container1只需要对外界网络暴露Web服务的80端口,而负责后端的container2只需与container1互连,不需要对外暴露,有效地保护了后端容器的安全性,提高了容器对外的隔离效果。

而同属于用户自定义bridge的容器container1、container2之间自动将所有端口暴露,方便容器间进行无障碍的通信,而不会遭受到外界的意外访问。

用户自定义bridge在容器之间提供了自动DNS解析:

不同于默认bridge只能通过IP互连的限制,用户自定义的bridge自动提供了容器间的DNS解析功能,容器间可以通过容器名或别名进行通信。

 

如何使用用户自定义bridge

1、创建用户自定义bridge

docker network create my-net        # 创建了一个名为"my-net"的网络

 

2、将Web服务容器和mysql服务容器加入到”my-net”中,并观察变化

docker network connect my-net test_demo         # 将Web服务加入my-net网络中
docker network connect my-net mysqld5.7         # 将mysql服务加入my-net网络中
# 查看my-net的网络配置
docker network inspect my-net
# 输出结果(省略部分内容):
[
    {
        "Name": "my-net",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",      # my-net的子网
                    "Gateway": "172.18.0.1"         # my-net的网关
                }
            ]
        },
        "Containers": {
            "d6f33e9bbd60e10d02dd2eebea424a7fc129d9646c96742ec3fe467833017679": {
                "Name": "mysqld5.7",
                "EndpointID": "7d0e8d70bb523cceb4d2d8d4e3f8231fc68332c70f7f9b4e5d4abccce2b31a65",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",         # mysql服务容器的IP,与之前不同
                "IPv6Address": ""
            },
            "dd292d535d16bbfe5382e29486756f4dddfea8e9b10af769db61618d739c5c4e": {
                "Name": "test_demo",
                "EndpointID": "f7802f1af81e258f77e227609dfdcdf66c49f19776381eb8b0dca6d9e794ccad",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",         # Web服务容器的IP,与之前不同
                "IPv6Address": ""
            }
        },
    }
]

如上所示,用户自定义网络my-net的子网为”172.18.0.0/16″,所以两docker容器在my-net网络中的IP分别为:”172.18.0.3/16″、”172.18.0.2/16″,与之前的”172.17.0.2/16″、”172.17.0.3/16″不同。

 

3、通过容器名或别名互连

进入到Web服务器container1中连接container2:

ping mysqld5.7 -c 3
# 输出结果:
PING mysqld5.7 (172.18.0.3) 56(84) bytes of data.
64 bytes from mysqld5.7.my-net (172.18.0.3): icmp_seq=1 ttl=64 time=0.066 ms
64 bytes from mysqld5.7.my-net (172.18.0.3): icmp_seq=2 ttl=64 time=0.145 ms
64 bytes from mysqld5.7.my-net (172.18.0.3): icmp_seq=3 ttl=64 time=0.143 ms

--- mysqld5.7 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2048ms
rtt min/avg/max/mdev = 0.066/0.118/0.145/0.036 ms

如上所示,我们已经可以通过容器名”mysqld5.7″连接mysql服务器了。

 

4、断开网络

由于我们的容器仍然连接着默认bridgedocker0,而现在我们已经不需要它,所以应该将容器与docker0的连接断开,执行以下操作:

# 断开容器与docker0的连接
docker network disconnect bridge test_demo
docker network disconnect bridge mysqld5.7

 

 

复制一下以前的老笔记,原本是写在腾讯云Coding的知识管理里边,这东西有点恶心,得一行行的复制,不然格式全没,要不就得先导出Markdown然后在复制,给哥们整无语了。

           


CAPTCHAis initialing...
EA PLAYER &

历史记录 [ 注意:部分数据仅限于当前浏览器 ]清空

      00:00/00:00