docker swarm踩坑记
2024-11-22 15:40先说下我的需求,想用docker swarm做个简单的双机热备功能,比如mysql,redis, emqx,minio。这样的例子网上基本没有,自己踩坑过来,最后没成功,但是应该很有希望了,先做下记录。
部署环境
操作系统 win11 home一台win11 pro一台
docker:docker desktop 4.36.0
1. 第一步创建swarm就失败,命令大概是这样的
docker swarm init --advertise-addr 我的本机ip
我记得报错信息大概如下,因为没想整理,所以这些出错信息是我网页历史记录中翻出来的。
must specify a listening address because the address to advertise is not recognized as a system address, and a system's IP address to use could not be uniquely identified
最后发现有个文章说desktop比如设置成windows模式并且设置成 "experimental": true才行。用吴孟达的话说,不是一个完整的男人。
然后发现我用的win11home电脑没法把docker desktop切换成windows模式。
又一顿查,发现win11 pro可以。试了一下确实可以,但是windows模式的docker desktop最高版本只有4.35.1了。真不知说啥好了,没有明确的文档告诉我们desktop wsl2的模式是不支持swarm的,并且报错信息还答非所问,浪费了一天时间。
2. docker swarm 添加节点。在swarm管理节点上执行如下命令就可以看到加入的命令,命令行中的token是随机生成的。
docker swarm join-token manager docker swarm join-token worker
上面两个命令分别获取作为manager节点加入和worker节点加入的命令行
这个地方也无语,最后发现win11home作为manager节点加入就是报错,但是作为worker可以,好吧,先有的用吧。谁让不是个完整的男人呢
3. 创建docker stack的配置文件
version: '3' services: emqx1: image: emqx:5.8.2 container_name: emqx1 environment: - "EMQX_NODE_NAME=emqx@node1.emqx" - "EMQX_CLUSTER__DISCOVERY_STRATEGY=static" - "EMQX_CLUSTER__STATIC__SEEDS=[emqx@node1.emqx,emqx@node2.emqx]" healthcheck: test: ["CMD", "/opt/emqx/bin/emqx", "ctl", "status"] interval: 5s timeout: 25s retries: 5 networks: emqx-bridge: aliases: - node1.emqx ports: - 1883:1883 - 8083:8083 - 8084:8084 - 8883:8883 - 18083:18083 # volumes: # - $PWD/emqx1_data:/opt/emqx/data deploy: placement: constraints: - node.hostname==l2-master-01 emqx2: image: emqx:5.8.2 container_name: emqx2 environment: - "EMQX_NODE_NAME=emqx@node2.emqx" - "EMQX_CLUSTER__DISCOVERY_STRATEGY=static" - "EMQX_CLUSTER__STATIC__SEEDS=[emqx@node1.emqx,emqx@node2.emqx]" healthcheck: test: ["CMD", "/opt/emqx/bin/emqx", "ctl", "status"] interval: 5s timeout: 25s retries: 5 networks: emqx-bridge: aliases: - node2.emqx # volumes: # - $PWD/emqx2_data:/opt/emqx/data deploy: placement: constraints: - node.hostname==l2-master-02 networks: emqx-bridge: driver: overlay
这里要注意的地方一个是networks,这块在windows desktop下应该是overlay,在linux下才是bridge。可以通过docker network ls命令查看,要与你电脑的network一致
还有就是 deploy,我这里是想让一个节点部署一个容器
还有必须是version 3
节点的hostname可以通过docker node ls查看
执行了之后发现win11pro电脑就是不成功,然后win11home还不停的生成新的容器。查了一下win11pro不成功的可能是因为pull不下来镜像。然后加了代理 "registry-mirrors": [
"https://docker.1panel.live"
]也不起作用,使用docker pull 就是失败。但是win11home可以。这就很恶心。然后我把win11home的镜像导出 docker save -o emqx.tar emqx,拷贝到win11pro电脑上导入 docker load -i emqx.tar 结果失败,提示的意思大概是linux的导出无法导入到windows。现在就是这样的绝境了,明天我再加一台win11home试试,说不定就成功了