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,上外网

在这里插入图片描述