05-存储驱动与磁盘文件系统

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

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官网上说,overlayoverlay2只支持xfs后端文件系统,并且d_type=true

overlay2overlaydevicemapper的升级版,能有更高的效率且更加节约磁盘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
上次修改: 17 April 2020