Dcoker跨宿主机容器通信之overlay
http://www.cnblogs.com/CloudMan6/p/7270551.html
环境准备,三台机器,主机名为docker01(192.168.111.11)、docker02(192.168.111.12)、docker03(192.168.111.13)
voerlay将所有docker环境的主机(IP)地址进行集中管理IP分配情况(通过consul分配管理,consul会知道哪个IP地址被分配了,下一次在起新容器的时候就会从consul这里分配,所以IP地址就不会冲突;consul类似于nosql,以键值对存在,当作非关系型数据库使用)
docker01和docker02都要配置daemon.json文件添加cluster信息连接docker03(consul服务)。
还要配置发送clinet信息标识,便于区分docker主机,连接consul服务的时候也要带上主机的信息IP:PORT
1)准备工作
docker03上:
#镜像不存在,可以在线下载即可
docker pull progrium/consul
docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
注释:–name表示给容器起一个名字
-h 表示给容器的主机名起一个名字,也就是容器里面的hostname设置容器的主机名
consul:kv类型的存储数据库(key:value)
浏览器访问http://192.168.111.13:8500/出现web界面
docker01、02上:(配置里面起一个2376监听端口,在起一个通讯sock;)
vim /etc/docker/daemon.json
{"hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],"cluster-store": "consul://192.168.111.13:8500","cluster-advertise": "192.168.111.11:2376"
}
docker01和docker02机器配置文件添加
daemon.json配置文件修改重启docker服务发现报错
查看报错日志/var/log/messages;发现根据我要报错的内容发生冲突了,我报错的内容是tcp:等,但是他检测的是fd://
通过查看docker状态,来查看docker.service的文件进行修改
vim /usr/lib/systemd/system/docker.service
将docker01和docker02主机都将-H fd://内容直接删除掉即可
docker01和docker02两台机器重启服务
systemctl daemon-reload
systemctl restart docker
在访问浏览器点击nodes发现两个docker节点
2)创建overlay网络
#docker01和docker02任意一台主机执行即可
docker network create -d overlay --subnet 172.16.1.0/24 --gateway 172.16.1.254 ol1
发现两台机器的网络类型都已经存在global,而且网络ID都是一样的
3)启动容器测试
docker run -it --network ol1 --name test01 busybox /bin/sh
根据容器的名字进行区分创建容器,ping容器的名字可以知道IP地址,而且不通宿主机的容器之间都可以互通。
每个容器有两块网卡,eth0实现容器间的通讯,eth1实现容器访问外网
容器中的eth1对应宿主机的docker_awbridae进行上网
网络通信的流程,容器的eth1通过宿主机的bw_gateway网卡然后nat转换内核转发到eth0,上外网