docker之容器互联
作者:互联网
1、跨主机通信案例
启动容器时,我们可以使用"--link"选项来关联指定的容器,本质上是将关联容器的名称的机器IP地址添加到容器的"/etc/hosts"解析中。
使用"--link"有一个美中不足的情况,就是要求被关联的容器必须处于运行状态!否则就会抛出"Cannot link to a non running container"异常。
值得一提的是,"--link"参数只是单向的配置,本质上是你在某个容器的"/etc/hosts"添加了相应的解析,对其它容器的"/etc/hosts"并没有任何影响哟~
1 里alpine为例子 2 #拉取alpine镜像 3 docker image pull alpine 4 #创建容器 5 docker container run -itd --name zhanghe_ap01 alpine 6 #查看容器的ip地址 7 docker container inspect -f "{{.NetworkSettings.IPAddress}}" zhanghe_ap01 8 #创建容器 写入zhanghe_ap01和容器id域名解析并写入新的域名zhanghe02 9 docker container run -itd --link zhanghe_ap01:zhanghe02 --name connected_container alpine 10 [root@docker102 ~]# docker exec connected_container cat /etc/hosts 11 127.0.0.1 localhost 12 ::1 localhost ip6-localhost ip6-loopback 13 fe00::0 ip6-localnet 14 ff00::0 ip6-mcastprefix 15 ff02::1 ip6-allnodes 16 ff02::2 ip6-allrouters 17 172.17.0.3 zhanghe02 1e323225ad3b zhanghe_ap01 18 172.17.0.5 f0aadf5ed5d5
如果 zhanghe_ap01容器停止,connected_container容器将无法访问。如下图
2、docker五种基础网络类型
bridge: 默认类型,桥接到宿主机docker0的网络,类似于VM的Nat模式。 host: host类型,使用宿主机网络,网络性能最高。 container: 容器类型,使用其它容器的共享网络,这在K8S中频繁使用。比如同一个Pod中可以有多个容器共存。 none: 没有网络,该容器不能上外网。 network: 自定义网络,我们可以使用docker network create创建自定义网络。 温馨提示: (1)从严格意义上来说docker就只有3种基础网络类型,分别为bridge,host和none; (2)其中container和network本质上都是基于上述3种基础网络类型哟;
[root@docker102 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
07f2bc765655 bridge bridge local
7700940c7cc1 host host local
94e6ae6d5cc7 none null local
3.创建自定义网络
1 [root@docker102 ~]# docker network ls 2 NETWORK ID NAME DRIVER SCOPE 3 07f2bc765655 bridge bridge local 4 7700940c7cc1 host host local 5 94e6ae6d5cc7 none null local 6 [root@docker102 ~]# docker network create -d bridge --subnet 172.28.0.0/16 --gateway 172.28.0.254 zhanghe_network 7 aa69afcc15774b47d1c59367b961658a928b840c445b926fae6fa756621c721c 8 [root@docker102 ~]# docker container run -itd --name zhanghe_net_docker --network zhanghe_network -p 81:80 nginx:1.20.1 9 9dd3d68e86c842ad6e7e0de6152bfe8a7f5367564e9bcd47952a2d079e68cbf2 10 [root@docker102 ~]# docker container inspect --format="{{.NetworkSettings.Networks.zhanghe_network.IPAddress}}" `docker container ls -lq` 11 172.28.0.1 12 [root@docker102 ~]# curl 172.28.0.1 13 <!DOCTYPE html> 14 <html> 15 <head> 16 <title>Welcome to nginx!</title> 17 <style> 18 body { 19 width: 35em; 20 margin: 0 auto; 21 font-family: Tahoma, Verdana, Arial, sans-serif; 22 } 23 </style> 24 </head> 25 <body> 26 <h1>Welcome to nginx!</h1> 27 <p>If you see this page, the nginx web server is successfully installed and 28 working. Further configuration is required.</p> 29 30 <p>For online documentation and support please refer to 31 <a href="http://nginx.org/">nginx.org</a>.<br/> 32 Commercial support is available at 33 <a href="http://nginx.com/">nginx.com</a>.</p> 34 35 <p><em>Thank you for using nginx.</em></p> 36 </body> 37 </html> 38 [root@docker102 ~]#
4.自定义macvlan网络
1 [root@docker101 volumes]# docker network create -d macvlan --subnet=172.29.0.0/16 --gateway=172.29.0.254 -o parent=bond0 zhanghe_macvlan 2 40248bf1b695c5e89a8efa0eed6795f03a36ff6087f8dd4c8616c394fb806ed4 3 [root@docker101 volumes]# docker network ls 4 NETWORK ID NAME DRIVER SCOPE 5 9dba3ff846db bridge bridge local 6 9dfe297f88b0 host host local 7 efb2a203a984 none null local 8 40248bf1b695 zhanghe_macvlan macvlan local 9[root@docker101 volumes]# docker container run -itd --name zhanghe_contaner01 --network zhanghe_macvlan --ip 172.29.0.101 alpine
11cde3d618d851e748a46c064aafe78f9690df0b85fc3f9d36318304a11c6a21
1 [root@docker102 ~]# docker network create -d macvlan --subnet 172.29.0.0/16 --gateway 172.29.0.254 -o parent=bond0 zhanghe_macvlan 2 698262f48fb21c1a4b6600e1dc1a495991f3f9e916e68c9054e4b99fb965be2d 3 [root@docker102 ~]# docker network ls 4 NETWORK ID NAME DRIVER SCOPE 5 07f2bc765655 bridge bridge local 6 7700940c7cc1 host host local 7 94e6ae6d5cc7 none null local 8 698262f48fb2 zhanghe_macvlan macvlan local 9[root@docker102 ~]# docker container run -itd --name zhanghe_container2 --network zhanghe_macvlan --ip 172.29.0.102 alpine
90e1b037475df378c70ada37fe3ab2c6b3df272355d7b7d4cb597a31e6fe2be8
1 [root@docker102 ~]# docker container exec zhanghe_container2 ip a 2 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000 3 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 4 inet 127.0.0.1/8 scope host lo 5 valid_lft forever preferred_lft forever 6 96: eth0@if4: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UNKNOWN 7 link/ether 02:42:ac:1d:00:66 brd ff:ff:ff:ff:ff:ff 8 inet 172.29.0.102/16 brd 172.29.255.255 scope global eth0 9 valid_lft forever preferred_lft forever 10 [root@docker102 ~]# 11 12 13 14 [root@docker101 volumes]# docker container exec zhanghe_contaner01 ip a 15 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000 16 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 17 inet 127.0.0.1/8 scope host lo 18 valid_lft forever preferred_lft forever 19 94: eth0@if4: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UNKNOWN 20 link/ether 02:42:ac:1d:00:65 brd ff:ff:ff:ff:ff:ff 21 inet 172.29.0.101/16 brd 172.29.255.255 scope global eth0 22 valid_lft forever preferred_lft forever 23 [root@docker101 volumes]# docker container exec zhanghe_contaner01 ping 172.29.0.102 24 PING 172.29.0.102 (172.29.0.102): 56 data bytes 25 64 bytes from 172.29.0.102: seq=0 ttl=64 time=0.760 ms 26 64 bytes from 172.29.0.102: seq=1 ttl=64 time=0.450 ms
macvlan网络的优缺点:
优点: (1)docker原生支持,无需安装额外插件,配置起来相对简单。 (2)适合小规模docker环境,例如只有1-3台,如果服务器过多,手动分配IP地址可能会无形之间增加工作量; 缺点: (1)需要手动分配IP地址,如果让其自动分配IP地址可能会存在多个主机自动分配的IP地址冲突的情况,到时候还需要人工介入维护; (2)本机相同网络(本案例为"oldboyedu_macvlan")的容器之间相互通信没问题,跨主机之间的容器进行通信也没问题,但容器无法与宿主机之间进行通信,也无法连接到外网 温馨提示: 如果非要使用macvlan,我们需要手动分配IP地址,无法联网的问题,只需要使用"docker network connect"重新分配一块网卡即可解决。
5.部署consul键值对数据库
简而言之,consul是类似于zookeeper,etcd一样的键值对数据库,我们用它来存储已分配的IP地址。如下图所示,我们成功的部署了2台docker环境指向了同一个consul服务。 (1)加载consul进行 [root@101~]# docker image pull consul:latest (2)运行容器 [root@101 ~]# docker container run -it -d -p 10.0.0.101:8500:8500/tcp --restart=always consul:latest (3)修改所有客户端的配置文件(我这里仅演示了一台,你可以根据自己的情况做相关的微调即可) [root@101 ~]# vim /etc/docker/daemon.json [root@101 ~]# [root@101 ~]# cat /etc/docker/daemon.json { "registry-mirrors": ["https://tuv7rqqq.mirror.aliyuncs.com"], # "insecure-registries": ["docker201.oldboyedu.com:5000"], # "data-root":"/oldboyedu/docker", "cluster-store": "consul://10.0.0.101:8500", "cluster-advertise": "10.0.0.101:6666" } [root@101 ~]# [root@101 ~]# systemctl restart docker [root@101 ~]#
参数说明:
data-root:
指定docker的数据存储目录。
cluster-store:
配置的是nginx监听的地址。
cluster-advertise:
指定的是docker的宿主机注册到consul中的指定网卡中的ip,也可以写ip和端口号,端口只要没被占用就可以了。
标签:互联,容器,00,container,--,zhanghe,docker,root 来源: https://www.cnblogs.com/zh-h/p/15920641.html