一、问题现象

现网最近又有一批主机需要部署有容云,需要在主机上安装docker并load image 。不过这批虚拟机,由于存储空间的限制,把数据目录放在了EMC VNX提供的NAS存储上。前面大部分的修改都没有问题,但在执行images load时提示operation not supported 。

operation-not-supported
operation-not-supported

更改/lib/systemd/system/docker.service 文件中的ExecStart -g指定的路径为本地文件系统后,再重启docker服务,再load images文件发现可以正常启动。

二、解决问题

先测试了下往NAS存储上读取文件,发现可以正常读写文件。这就基本排除了NAS本身的问题。重启部署docker并重启主机,再次启动docker服务,发现无法正常启动。具体报错信息为:initializing graphdriver: invalid argument。见下图:

graphdriver

放狗查询了可能出现该问题的可能性。后来发现有–storage-driver=devicemapper 参数。修改docker的启动服务中ExecStart参数为如下内容:‘

1ExecStart=/usr/bin/dockerd -g /data/docker --storage-driver=devicemapper --mtu 1400 --insecure-registry 0.0.0.0/0

其中/data为本身NAS挂载点。再次重启主机OS,发现docker服务可以自动拉起,再次docker load image文件也不再出现不支持的提示。发现问题解决,在其他主机在部署时增加同样的参数,发现可以下接部署通过。

三、总结

通过man dockerd 发现其有如下部分和文件系统相关的选项:

1-s, --storage-driver=""
2 Force the Docker runtime to use a specific storage driver.
3--storage-opt=[]
4 Set storage driver options. See STORAGE DRIVER OPTIONS.

后面也有如下的说明:Specify options to the storage backend with –storage-opt flags. The backends that currently take options are devicemapper, zfs and btrfs. Options for devicemapper are prefixed with dm, options for zfs start with zfs and options for btrfs start with btrfs. Docker在Debian,Ubuntu系的系统中默认使用aufs,在RedHat系中使用device mapper。device mapper在Linux2.6内核中被并入内核,它很稳定,也有很好的社区支持。OverlayFS与AUFS相似,被加入Linux3.18版本内核,也是一种联合文件系统(union filesystem),与AUFS相比,OverlayFS: 设计更简单; 可能更快。查看了下之前使用本地文件系统的主机,发现有容云默认使用的overfs

 1[root@ZJHZ-CMREAD-RQYUNDATA07-VINT-SQ yum.repos.d]# docker info
 2Containers: 0
 3 Running: 0
 4 Paused: 0
 5 Stopped: 0
 6Images: 0
 7Server Version: 1.13.1
 8Storage Driver: overlay
 9 Backing Filesystem: extfs
10 Supports d_type: true
11Logging Driver: json-file
12Cgroup Driver: cgroupfs
13Plugins:
14 Volume: local
15 Network: bridge host macvlan null overlay
16Swarm: inactive
17Runtimes: runc
18Default Runtime: runc
19Init Binary: docker-init
20containerd version: aa8187dbd3b7ad67d8e5e3a15115d3eef43a7ed1
21runc version: 9df8b306d01f59d3a8029be411de015b7304dd8f
22init version: 949e6fa
23Security Options:
24 seccomp
25  Profile: default
26Kernel Version: 3.10.0-514.el7.x86_64
27Operating System: Red Hat Enterprise Linux Server 7.3 (Maipo)

既然原理通了,同样也可以不修改docker启动服务,通过修改/etc/default/docker(如果没有,可以直接创建)中增加DOCKER_OPTS参数解决,具体内容如下:

1DOCKER_OPTS="--storage-driver=devicemapper"

OS启动时,会自动读取/etc/default目录中的选项并加载。更多信息也可以参考docker官方storagedriver文档