查看宿主局Docker的配置信息。
docker info Server: ... Storage Driver: overlay2 Backing Filesystem: xfs Supports d_type: true ...
这三个关键参数如上所示,那么就是目前的最佳搭配。
在新的服务器上安装docker并运行的时候,遇到如下报错:
sugoi@sugoi:~/Documents/Golang-Guide$ systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: inactive (dead) since Mon 2020-03-16 10:37:14 CST; 23h ago Docs: https://docs.docker.com 3月 16 19:36:42 sugoi dockerd[21992]: time="2020-03-16T19:36:42.508676716+08:00" level=error msg="docker error creating overlay mount to xxx invalid argument" ...
journalctl -u docker
看不出什么问题sudo dockerd --debug
发现问题... DEBU[2020-03-16T19:36:42.508676716+08:00] falied to start daemon : error initializing graphdriver: /var/lib/docker ... storage driver (-s <DRIVER>) ...
定位到问题,也就是docker的存储驱动和文件系统不匹配,那就只要把磁盘分区重新格式化一下就好了。
定位到问题了,那么问题来了,磁盘分区需要格式化为哪一种文件系统,各种文件系统有啥优劣,后面简单分析一下。
首先,配置一下Docker,执行如下命令,也就是在/etc/docker/daemon.json
中配置storage-driver
为overlay2
。
if [[ ! -f /etc/docker/daemon.json ]]; then mkdir -p /etc/docker cat > /etc/docker/daemon.json <<EOF { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "graph":"/media/kevin/storage2/docker/images_data", "storage-driver": "overlay2", "storage-opts": [ "overlay2.override_kernel_check=true" ] } EOF fi
在daemon.json
配置文件中graph
在非默认目录(/var/lib/docker
)时需要配置。
Docker官网上说,overlay
和overlay2
只支持xfs
后端文件系统,并且d_type=true
。
overlay2
是overlay
和devicemapper
的升级版,能有更高的效率且更加节约磁盘inode
。
docker info Server: ... Storage Driver: overlay2 Backing Filesystem: <unknow> Supports d_type: true ...
在查看问题节点发现,后端文件系统是unknown
。
上一步已经修改了Docker的配置,第二步就是重新格式化Docker运行的磁盘分区为xfs
(退一步ext4
也行),且d_type=true
。
# 创建docker默认目录 mkdir -p /var/lib/docker # 格式化磁盘分区 mkfs.xfs -f -n ftype=1 /dev/<p_name> # 挂载分区到目录上 mount /dev/<p_name> /var/lib/docker # 查看磁盘文件系统信息确认一下 xfs_info /dev/<p_name> | grep ftype=1 # 配置/etc/fstab实现开机自动挂载磁盘分区 blkid /dev/<p_name> UUID= <UUID> /var/lib/docker xfs defaults,uquota,pquota 0 0
最后,重启Docker守护进程,在检查info信息,都正常了。
sudo systemctl daemon-reload sudo systemctl restart docker