我正试图在WSL2上设置一个docker群以进行测试。我想知道,是否有可能拥有一个具有多个";伪";单个机器上的节点。
以下是我trid的两种方式:
- 按照此处的建议运行多个WSL实例
PS C:Usersjdu> wsl -l
Windows-Subsystem für Linux-Distributionen:
Ubuntu3
Ubuntu
Ubuntu2
Docker安装并运行在每个WSL实例中。因此,我设法在Ubuntu
上初始化了一个群,并让Ubuntu2
和Ubuntu3
作为工作者加入。
关于Ubuntu
$ docker swarm init
Swarm initialized: current node (hude19jo7t9dqpe0akg55ipmy) is now a manager.
关于Ubuntu2
$ docker swarm join --token SWMTKN-1-xxxxxxxxx-xxxxxxxxx 192.168.189.5:2377 --listen-addr 0.0.0.0:12377
This node joined a swarm as a manager.
然后如果我检查Ubuntu
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
hude19jo7t9dqpe0akg55ipmy * laptop-ebc155 Ready Active Leader 20.10.21
ozeq43yukgfbltjnfya0tlx08 laptop-ebc155 Ready Active Reachable 20.10.20
- 受这里想法的启发,我尝试在docker容器中使用docker,例如,我在一个WSL上部署了多个docker实例
# Init Swarm master
docker swarm init
# Get join token:
SWARM_TOKEN=$(docker swarm join-token -q worker)
echo $SWARM_TOKEN
# Get Swarm master IP (Docker for Mac xhyve VM IP)
SWARM_MASTER_IP=$(docker info | grep -w 'Node Address' | awk '{print $3}')
echo $SWARM_MASTER_IP
DOCKER_VERSION=dind
# setup deploy Docker-in-Docker containers and join them to a swarm
docker run -d --privileged --name worker-1 --hostname=worker-1 -p 12377:2377 docker:${DOCKER_VERSION}
docker exec worker-1 docker swarm join --token ${SWARM_TOKEN} ${SWARM_MASTER_IP}:2377
docker run -d --privileged --name worker-2 --hostname=worker-2 -p 22377:2377 docker:${DOCKER_VERSION}
docker exec worker-2 docker swarm join --token ${SWARM_TOKEN} ${SWARM_MASTER_IP}:2377
docker run -d --privileged --name worker-3 --hostname=worker-3 -p 32377:2377 docker:${DOCKER_VERSION}
docker exec worker-3 docker swarm join --token ${SWARM_TOKEN} ${SWARM_MASTER_IP}:2377
在之后
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
s371tmygu9h640xfosn6kyca4 * laptop-ebc155 Ready Active Leader 20.10.21
w1ina9ttvje4hn6r13p3gzbge worker-1 Ready Active 20.10.20
m8mqky6jchjao01nz8t5e392a worker-2 Ready Active 20.10.20
n29afhbb090tlyn9p0byga9au worker-3 Ready Active 20.10.20
为了测试上面的两个swarm设置,我使用了一个非常简单的compose文件,正如官方文档所建议的那样。正如你所料,这两个蜂群设置并没有那么好地工作:/
如果MongoDB和MongoExpress部署在不同的节点上,两个集群设置都显示相同的错误MongoNetworkError: failed to connect to server [mongo:27017] on first connect
。我对这个错误的理解是,MongoExpress无法在mongo:27017
下访问MongoDB,这似乎是docker内部DNS的问题。有人能帮我吗?或者随时告诉我,不要再尝试这种单一的多节点想法:D我非常感谢任何帮助!
我刚刚尝试了同样的两个练习:(
方法1-WSL实例中的群节点
我认为这是目前不可能的,因为WSL2的设计https://github.com/microsoft/WSL/issues/4304.事实上,WSL2实例共享网络设置-ip、接口、网络名称空间等。其中一个实例中的每一个更改都可以立即在其他实例中看到,这与docker群节点启动时创建的虚拟接口和名称空间相冲突。
我尝试在eth0接口上配置多个ip地址,这样每个节点都可以拥有自己的ip地址(就像这里一样(,然后在docker swarm init
和docker swarm join
命令中使用--advertise-addr
--listen-addr
选项。尽管如此,我还是在dockerd日志中得到了这个错误:
moving interface ov-001000-yis5e to host ns failed, invalid argument, after config error error setting interface "ov-001000-yis5e" IP to 10.0.0.1/24: cannot program address 10.0.0.1/24 in sandbox interface because it conflicts with existing route {Ifindex: 4 Dst: 10.0.0.0/24 Src: 10.0.0.1 Gw: <nil> Flags: [] Table: 254}"
我相信docker swarm遇到了一个问题,因为当它试图为工人建立路由网状网络时,它已经看到了master的接口。这一切都是因为主机和节点共享网络配置。
方法2-将节点群作为docker容器(docker中的docker(
但我没有2号。只需对swarm init命令进行一个小的更改:
# advertise swarm on default bridge network
docker swarm init --advertise-addr 172.17.0.1
对我来说,标准docker swarm init
默认选择eth0地址,该地址仅用于从dind->wsl,但不是反过来。
另一个可能无关的问题是,我无法从Windows主机访问以这种方式执行的服务/堆栈。这似乎是一个wls错误,幸运的是有一个变通方法。
关于这个mongo堆栈的最后一个提示是。。。耐心该堆栈由两个服务组成:mongo(数据库(和mongo express(客户端(。Mongo镜像要大得多,大约600MB,而Mongo express只有大约135MB。mongo express镜像的下载速度会更快,甚至在mongo启动之前,它就会被swarm多次重新创建。还要注意的是,在此设置中,每个工人都会独立下载docker映像,因此重新平衡可能需要一些时间。
我发现这些命令对了解实际情况很有用:
# overview of services
docker service ls
# containers in each swarm service
docker service ps $(docker service ls --format {{.Name}})
# images in each dind worker
for i in $(seq "${NUM_WORKERS}"); do
docker exec worker-${i} docker images
done
#containers in each dind worker
for i in $(seq "${NUM_WORKERS}"); do
docker exec worker-${i} docker ps -a
done
使用dind:获得工作docker群所需的命令的完整列表
docker swarm init --advertise-addr docker0
SWARM_TOKEN=$( docker swarm join-token -q worker)
echo $SWARM_TOKEN
SWARM_MASTER_IP=$( docker info 2>&1 | grep -w 'Node Address' | awk '{print $3}')
echo $SWARM_MASTER_IP
DOCKER_VERSION=20.10.12-dind
NUM_WORKERS=3
# Run NUM_WORKERS workers with SWARM_TOKEN
for i in $(seq "${NUM_WORKERS}"); do
docker run -d --privileged --name worker-${i} --hostname=worker-${i} docker:${DOCKER_VERSION}
sleep 5
docker exec worker-${i} docker swarm join --token ${SWARM_TOKEN} ${SWARM_MASTER_IP}:2377
done
# Setup the visualizer
docker service create
--detach=true
--name=viz
--publish=8000:8080/tcp
--constraint=node.role==manager
--mount=type=bind,src=/var/run/docker.sock,dst=/var/run/docker.sock
dockersamples/visualizer
####### play with mongo
mkdir mongodemo && cd mongodemo
wget https://raw.githubusercontent.com/docker-library/docs/f6c9b596064e2eed9c3b6ac75bea606cb6d94099/mongo/stack.yml
docker stack deploy -c stack.yml mongo
# from windows:
# mongo will be available under <eth0>:8081
# visualizer under <eth0>:8000
ip -4 addr | grep eth0