背景
今天在Ubuntu 运行docker-cAdvisor时候遇到问题
命令:
docker run --name=cadvisor --volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=8080:8080 \
--detach=true \
--privileged \
--volume=/var/lib/docker/:/var/lib/docker:ro \
google/cadvisor
处罚报错,导致cadvisor容器启动失败。
docker: Error response from daemon: error while creating mount source path '/var/lib/docker': mkdir /var/lib/docker: read-only file system.
问题分析:
网上查找资料, 在github的issue上面,也有一个Ubuntu 18 的技术员遇到类似问题:Error running cadvisor docker package on Ubuntu 18.04.4 LTS
问题要从--volume=/var/lib/docker/:/var/lib/docker:ro这个参数说起,cadvisor 容器之所以要挂载操作系统的/var/lib/docker目录, 是因为很多系统(例如CentOS)安装docker, 就会使用/var/lib/docker这个目录作为“data-root”。cadvisor容器就是从/var/lib/docker文件夹中获取docker信息。
但是为什么CentOS可以, Ubuntu却不行呢?那是因为Ubuntu常用的dpk包安装的Docker并不是使用/var/lib/docker这个目录作为“data-root”的,所以就导致了问题。Ubuntu的Docker的“data-root”可以用下面命令查找:
docker info | grep "Docker Root Dir:"
结果是:
Docker Root Dir: /var/snap/docker/common/var-lib-docker
“Docker Root Dir”这个值,也可以在/etc/docker/daemon.json 中修改 “data-root”并重启docker实现。
故障处理:
修改一下命令, 用 docker info 的“Docker Root Dir” 代替 /var/lib/docker 即可:
DOCKER_ROOT_DIR=$( sudo docker info | grep "Docker Root Dir:" | sed 's/.*:\s*//' )
sudo docker run --name=cadvisor --volume=/:/rootfs:ro --volume=/var/run:/var/run:ro --volume=/sys:/sys:ro --volume=/dev/disk/:/dev/disk:ro --publish=8080:8080 --detach=true --privileged --volume=${DOCKER_ROOT_DIR}:/var/lib/docker:ro google/cadvisor