跨主机通信
容器和容器之间。
[ ~]# docker pull busybox
[ ~]# docker run -itd --name web5 busybox:latest
把网卡指定web5:
[ ~]# docker run -itd --name web6 --network container:web5 busybox:latest
Web6:
[ ~]# docker exec -it web6 /bin/sh
/ # echo 123456 > /tmp/index.html
/ # httpd -h /tmp/
Web5:
[ ~]# docker exec -it web5 /bin/sh
/ # wget -O - -q 127.0.0.1
这时会发现,两个容器的ip地址一样。
PS:这种方法的使用场景:由于这种网络的特殊性,一般在运行同一个服务,并且合格服务需要做监控,以及日志收集,或者网络监控的时候,可以选择这种网络。
docker的跨主机网络解决方案
Overlay的解决方案(覆盖型解决方案)
实验环境:
Docker01:1.10
Docker02:1.20
Docker03:1.30
暂时不考虑防火墙和selinux安全问题。
将3台Dockerhost防火墙和selinux全部关闭,并且分别更改主机名称
[ ~]# hostnamectl set-hostname docker01
[ ~]# su -
[ ~]# systemctl stop firewalld
[ ~]# systemctl disable firewalld
[ ~]# setenforce 0
Docker01:
[ ~]# rz
导入镜像包:
[ ~]# docker load -i myprogrium-consul.tar
-h:hostname,主机名 -server -bootstrap:集群
启动consul服务:consul:分布式,数据库,数据中心,集群的方式存储东西
[ ~]#docker run -d -p 8500:8500 -h consul --name consul --restart always progrium/consul -server -bootstrap
报错重启服务:
[ ~]# systemctl restart docker
PS:容器生产之后,我们可以通过浏览器访问consul服务,验证consul服务是否正常。访问dockerHost加映射端口。
访问:
http://192.168.1.10:8500/
修改Docker02和Docker03的配置文件
Docker02:
[ ~]# vim /usr/lib/systemd/system/docker.service
13行:
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2376 --cluster-store=consul://192.168.1.10:8500 --cluster-advertise=ens33:2376
[ ~]# systemctl daemon-reload
[ ~]# systemctl restart docker
Docker03同上
PS:返回浏览器consul服务界面没找到KEY/VALUE----->DOCKER------>NODES会看到刚刚加入的docker02的信息。
在docker02上创建自定义网络: global(全局)
在docker02上创建的网络,我们可以看到它的SCOPE定义的是global(全局),意味着加入到consul这个服务的docker服务,都可以看到我们自定义的网络。
同理如果是用此网络创建的容器,会有两张网卡。
默认这张网卡的网段是10.0.0.0网段,如果想要docker01也可以看到这个网络,那么也只需在docker01的配置文件添加相应内容即可。
同理,因为是自定义网络,符合组定义网络的特性,可以直接通过docker容器的名称相互通信,当然也可以在自定义网络的时候,指定它的网段,那么是用此网络
docker network create -d overlay ov_net1
在docker03上查看网卡:
在docker01上修改配置文件,重启docker查看:
[ ~]# vim /usr/lib/systemd/system/docker.service
13行:
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2376 --cluster-store=consul://192.168.1.10:8500 --cluster-advertise=ens33:2376
[ ~]# systemctl daemon-reload
[ ~]# systemctl restart docker
[ ~]# docker network ls
Docker01:
[ ~]# docker run -itd --name t1 --network ov_net1 busybox
[ ~]# docker exec -it t1 /bin/sh
/ # ip a
Docker02:
[ ~]# docker run -itd --name t2 --network ov_net1 busybox
[ ~]# docker exec -it t1 /bin/sh
/ # ip a
Docker03:
[ ~]# docker run -itd --name t3 --network ov_net1 busybox
[ ~]# docker exec -it t1 /bin/sh
/ # ip a