背景
我家的服务器是弄了一台工控机,装esxi,虚拟出软路由、nas和Ubuntu,最后在Ubuntu上部署了docker集群。
但这样就会有个问题:docker的storage-driver好像对于esxi的支持并不好。具体表现为:几乎每次重启或升级,docker-engine总是会无法启动:
1
| docker.service: Scheduled restart job, restart counter is at 3.
|
定位
常见查看原因方法
一般用systemctl status docker.service或另一个,来查看报错。
或者直接systemctl start docker.service来看看启动会报什么错。
命令行启动docker-engine
但是这次的报错里没有任何有价值的信息,所以我们使用终极方法————直接命令行启动docker-engine:
1
2
3
4
5
6
7
| (base) zsd@server:~$ sudo /usr/bin/dockerd
INFO[2023-07-17T00:09:12.684718002+08:00] Starting up
INFO[2023-07-17T00:09:12.688119015+08:00] detected 127.0.0.53 nameserver, assuming systemd-resolved, so using resolv.conf: /run/systemd/resolve/resolv.conf
INFO[2023-07-17T00:09:12.742826565+08:00] [graphdriver] trying configured driver: devicemapper
WARN[2023-07-17T00:09:12.742866753+08:00] [graphdriver] WARNING: the devicemapper storage-driver is deprecated and will be removed in a future release; visit https://docs.docker.com/go/storage-driver/ for more information
WARN[2023-07-17T00:09:12.883829105+08:00] Usage of loopback devices is strongly discouraged for production use. Please use `--storage-opt dm.thinpooldev` or use `man dockerd` to refer to dm.thinpooldev section. storage-driver=devicemapper
failed to start daemon: error initializing graphdriver: devmapper: Base Device UUID and Filesystem verification failed: devmapper: Current Base Device UUID:b04917d5-7376-4598-8292-3bcca66fdef8 does not match with stored UUID:535cbaab-d64c-45cd-ad7e-0060a121f2cb. Possibly using a different thin pool than last invocation: devicemapper
|
这回就能很清楚的看到,是docker的graphdriver,也就是storage-driver,设置的不对。
具体原因是esxi的磁盘的uuid变了。但我不可能每次都去改uuid,所以在把所有storage-driver选项都给试过后,唯一能用的就只有vfs了。
修改docker配置
1
| sudo vim /etc/docker/daemon.json
|
1
2
3
4
5
6
7
8
9
| {
"storage-driver": "vfs",
"ipv6": true,
"fixed-cidr-v6": "2001:db8:1::/64",
"log-driver":"json-file",
"log-opts": {"max-size":"10m", "max-file":"1"},
"data-root": "/mnt/nfs/zsd_server/docker",
"registry-mirrors": ["https://1elptswk.mirror.aliyuncs.com"]
}
|
这里可以发现,我把data-root给设置到了我挂在的nfs上,这样可以不占用系统盘。
用portainer管理集群
部署portainer
1
2
3
4
5
6
7
8
9
| docker stop portainer
docker rm portainer
docker pull portainer/portainer-ce:latest
docker run -d -p 8000:8000 -p 9000:9000 -p 9443:9443 \
--name=portainer --restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
--log-opt max-size=10m \
portainer/portainer-ce
|
用docker compose部署容器
我们把docker compose文件保存在github上,然后在portainer里使用github里的compose文件路径(需要指定新分支:refs/heads/main),来部署和更新容器。
但是这样有个问题,就是部署的时间太长,容器被创建了但没启动。
所以我们在portainer的stack页面里,添加环境变量:
1
2
| DOCKER_CLIENT_TIMEOUT=9999
COMPOSE_HTTP_TIMEOUT=9999
|
即可缓解超时。
还有个方法:自己先用命令行,把涉及到的镜像都docker pull下来,即可加快部署速度。