Docker原生overlay网络

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

Send a Message