查看宿主局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