大家好,如果觉得小名写的文章对大家有帮助的话,麻烦三连一下下!(加关注,点个赞,转个发)
一、介绍本次研究使用docker自带的overlay覆盖网络模式
1、overlay模式下指定具体ip网段 结果:可以
2、overlay模式下各主机各容器是否能相互内网访问。结果:可以
3、各主机是否能访问外网. 结果:可以
4、overlay对consul的依赖程度,在容器启动后关闭consul会有什么影响,,
影响:
各容器直接访问consul关闭前的状态,比如a容器 ping b容器,之前的通的,不管b容器有没有关闭,都是通的
依赖overlay网络的容器无法启动
二、搭建和测试简单说下思路:
第一步:搭建consul做配置共享
第二步:各服务器启动dockerd,但是启动的时候指定配置保持至consul中
第三步:创建虚拟网络overlay
第四步:各服务器的容器启动的时候指定网络为虚拟网络overlay
使用的服务器ip分别是:
172.17.3.3和172.17.3.4
第一步:搭建consul做配置共享先在172.17.3.4部署consul服务,用来做配置同步,该服务可做成单机也可集群看实际需求,这边研究就用来单机模式
1、下载consul启动包
wget https://releases.hashicorp.com/consul/1.2.1/consul_1.2.1_linux_amd64.zip2、解压并启动consul服务
unzip consul_1.2.1_linux_amd64.zipnohup /root/consul agent -server -bootstrap -ui -data-dir=/root/consul-data -client=0.0.0.0 -bind=172.17.3.4 -node=172.17.3.4 & 第二步:各服务器启动dockerd,但是启动的时候指定配置保持至consul中在172.17.3.4服务器上开启docker守护进程
nohup /usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store consul://172.17.3.4:8500 --cluster-advertise 172.17.3.4:2375 &在172.17.3.3服务器上开启docker守护进程
nohup /usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --cluster-store consul://172.17.3.4:8500 --cluster-advertise 172.17.3.3:2375 &第三步:创建虚拟网络overlay在172.17.3.4服务器上创建虚拟网络(默认网段为10.0.x.0/24)
docker network create -d overlay ov_net1第四步:各服务器的容器启动的时候指定网络为虚拟网络overlay两台服务器下载镜像
docker pull wuweichina/kong:v0.10.4
两台服务器开启容器kong
docker run -ti -p 8000:8000 --restart=always --network ov_net1 --name kong -v kong:/data -d wuweichina/kong:v0.10.4
然后登录两台服务器进行网络操作,看看是否通,也可以通过以下命令查看网段中ip的分配信息具体信息
docker network inspect ov_net1
结束,后面有需要也可以看看,修改网段测试的命令
如果需要创建指定新覆盖网络网段
docker network create -d overlay --subnet 10.22.1.0/24 ov_net2
然后把之前的ov_net1移到ov_net2
增加新网络
docker network connect ov_net2 kong
移除旧网络
docker network disconnect ov_net1 kong
查看网段具体信息
docker network inspect ov_net1
Dcoker容器之间的通信非常重要,也一直被关注,容器通信分为两类,一类是单宿主机的相互通信,一类是跨主机的容器通信,本篇来进行一个介绍进行梳理,集合我现阶段的docker应用的一些总结分享。
一、单宿主机的容器间的通信:1.1通过容器默认ip访问容器重启后;ip会发生变化。通过容器ip访问不是一个好的方案。
1.2通过宿主机的ip:port访问通过宿主机的ip:port访问;只能依靠监听在暴露出的端口的进程来进行有限的通信。只能监听内网ip地址和端口,外网ip肯定不能放开
1.3通过link(不推荐):运行容器时;指定参数link;使得源容器与被链接的容器可以进行相互通信;并且接受的容器可以获得源容器的一些数据;比如环境变量。源容器mysql
docker run -itd --name test-mysql -e MYSQL_ROOT_PASSWORD=root mysql:5.7 #被链接容器 centos docker run -itd --name test-centos --link test-mysql:mysql centos /bin/bash #进入test-centos docker exec -it test-centos /bin/bash直接通过 link的名字或者link时候取的别名就能进入
通过link建立连接的容器被链接的容器能 ping 通源容器反过来不行。在被链接的容器上查看环境变量
被链接容器会继承源容器的环境变量信息。与/etc/hosts中的主机条目不同如果重新启动源容器则不会自动更新存储在环境变量中的IP地址。我们建议使用主机条目 /etc/hosts来解析链接容器的IP地址。除了环境变量之外Docker还将源容器的主机条目添加到/etc/hosts文件中。
如果重新启动源容器;/etc/hosts链接容器上的文件将使用源容器的新IP地址自动更新;从而允许链接通信继续。
1.4host模式:host模式,–net=host,会直接使用容器宿主机的网络命名空间。将不拥有自己独立的Network Namespace,它会使用宿主机的ip和端口。使用host模式优势就是效率高,但是缺点也很明显。
1.容器不再隔离,容器崩溃能导致宿主机崩溃。
2.容器内部不再拥有端口所有的资源,宿主机已经使用的资源容器不能再使用
1.5自定义桥接网络networks(推荐):docker network来创建一个桥接网络;在docker run的时候将容器指定到新创建的桥接网络中;这样同一桥接网络中的容器就可以通过互相访问。创建网络
docker network create t-network启动容器时;加入创建的网络docker run -it --network test-network --network-alias mysql -e MYSQL_ROOT_PASSWORD=123 mysql:5.7启动被链接的容器 docker run -it --network test-network --network-alias centos centos二、跨宿主机的容器通信:跨宿主机的容器通信就是用宿主机的ip加上宿主机端口就可以,也可以启用内网域名等等。不再进行过多的描述。
总结上面就是我对于容器之间通信的总结,希望能帮助正在接触这块业务的朋友们,如果想跟我有更多的交流,欢迎关注我的头条号和微信公众号:Java时间屋 进行交流。