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 run启动容器时用参数 –link 创建两个容器间的 客户-服务 链接,
需要两个参数,一个是链接容器的名字,一个是链接的别名,即 –link redis:db,
被链接的容器是服务,链接让服务容器能够和客户容器通信,
客户容器可直接访问服务容器的任意公开端口,所以服务容器的端口不需要对本地宿主机公开,相对更加安全;
可以把多个客户容器链接到同一个服务容器,也可通过指定多次–link来链接到多个服务容器,
docker在容器的/etc/hosts文件和包含链接信息的环境变量里写入链接信息;
-
一个Web服务器容器
-
一个Redis数据库容器
-
两个容器间的一个安全链接
用户自定义bridge相对于使用默认bridge的主要优势:
用户自定义bridge可以在容器化的应用程序提供更好的隔离效果和更好的互通性:
这段话看似有些矛盾,但是其中更好的隔离效果是针对外界网络,而更好的互通性则是指同一bridge下的不同容器之间。
而同属于用户自定义bridge的容器container1、container2之间自动将所有端口暴露,方便容器间进行无障碍的通信,而不会遭受到外界的意外访问。
用户自定义bridge在容器之间提供了自动DNS解析:
不同于默认bridge只能通过IP互连的限制,用户自定义的bridge自动提供了容器间的DNS解析功能,容器间可以通过容器名或别名进行通信。
docker network create my-net # 创建了一个名为"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": "" } }, } ]
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
由于我们的容器仍然连接着默认bridgedocker0,而现在我们已经不需要它,所以应该将容器与docker0的连接断开,执行以下操作:
# 断开容器与docker0的连接 docker network disconnect bridge test_demo docker network disconnect bridge mysqld5.7
复制一下以前的老笔记,原本是写在腾讯云Coding的知识管理里边,这东西有点恶心,得一行行的复制,不然格式全没,要不就得先导出Markdown然后在复制,给哥们整无语了。