Docker自身提供的overlay网络是基于 VxLAN的,VxLAN可将二层数据封装到 UDP进行传输。
这里我使用两台主机
- docker1 192.168.194.137
- docker2 192.168.194.138
在docker1上启动consul
docker run -i -t -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
这样我们就得到了一个 consul
在两台机器上都修改 /usr/lib/systemd/system/docker.service
# ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --cluster-store=consul://192.168.194.137:8500 --cluster-advertise=ens33:2375
然后重新加载配置文件,重启 docker
sudo systemctl daemon-reload
sudo systemctl restart docker
在systemd内部运行docker时使用 -H fd:// 语法。
Systemd本身将在docker.socket单元文件中创建一个套接字并进行监听,并且该套接字使用 fd:// docker.service单元文件中的语法连接到docker 守护程序。
当您启动Docker守护程序时,-H fd:// 将告诉Docker该服务正在由Systemd启动,并将使用套接字激活,然后,systemd将创建目标套接字,并将其传递给Docker守护程序使用。
当您使用时-H fd://,docker将期望套接字通过其父进程传递,而不是自己创建。由Systemd启动时,Systemd会执行此工作,但是在终端上手动启动时,您不会执行此工作,因此docker守护进程失败并中止。
在consul中,我们可以看到有两个docker向key value 存储注册了自己
docker1 服务器上
docker network create -d overlay ov_net1
此处注意我们创建的 ov_net1 的scope是 global
在docker2 上 也可以找到它
docker1 上启动ubuntu u1
docker run -i -t --name u1 --network ov_net1 ubuntu /bin/bash
docker2 上启动ubuntu u2
docker run -i -t --name u2 --network ov_net1 ubuntu /bin/bash