其他分享
首页 > 其他分享> > docker之容器互联

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