docker 主要有两种数据存储形式, 一种是storage driver(也叫做 Graph driver), 另一种是 volume driver.下面我们就来看看这二种的存储形式那些不同。
1.storage driver
容器运行的文件系统是镜像层和容器层组成的, 一层一层叠加, 只有最上面的那层是可写的, 其他层都是只读的. Docker通过Union FS技术支持文件的读写和新建, Docker 采用插件式的方式支持多种Union FS实现, 官方文档中一般使用stroage driver术语, 目前已经有多种实现的插件, 比如:
aufs/overlay/overlay2/devicemanger等等.
修改Docker存储形式
要修改docker的存储形式,实现还是蛮简单的,主要用如下二种方法:
1.创建或者修改/etc/docker/daemon.json
{ "storage-driver": "overlay2" }
2.修改
/usr/lib/systemd/system/docker.service
[root@centos7 mycentos]# vim /usr/lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd -D -s overlay2 --graph=/data/docker/images -H unix:///var/run/docker.sock --insecure-registry=10.16.15.210 在ExecStart这一行加 -s overlay2 参数。
下面给出几个查询storage driver的命令:
docker info 命令, 查询docker运行环境使用的storage-driver. docker image inspect 命令,查看镜像使用的存储driver. docker container inspect 命令,查看容器使用的存储driver.
2.volume driver
volume driver 经常用来实现数据持久化和文件共享功能, 具体有下面的存在方式, 分别是:
2.1 bind mount 方式:
是将host的目录或文件直接mount到容器中, host的目录或文件既可以容器运行之前就已存在的, 也可以是在容器运行之前不存在的.
如果在docker run 命令中采用了 -v
/host/dir_or_file:/container/dir_or_file的形式, 就是bind mount方式, 即指定了host的挂载点的绝对路径.
例子:
[root@centos7 mycentos]# docker run -d --name web -v /data/webapp :/opt/webapp busybox /bin/sh -c "while true; do echo hello world; sleep 1; done"
#使用 bind mount 方式, host上的目录为 /data
查看数据卷的具体信息:在主机里使用以下命令可以查看 web容器的信息
[root@centos7 mycentos]# docker inspect web ... "Mounts": [ { "Type": "bind", "Source": "/data/webapp", "Destination": "/opt/webapp", "Mode": "", "RW": true, "Propagation": "rprivate" } ],
挂载一个本地主机文件作为数据卷:
[root@centos7 mycentos]#docker run -d --name web -v $HOME/.bash_history:/root/.bash_history busybox /bin/sh
2.2 volume 方式:
是由 Docker 管理, 默认情况下该volume最终存储到host的 /var/lib/docker/volumes 下. volume 方式还分为 named volume 和 Anonymous volume.
数据卷是一个可供一个或多个容器使用的特殊目录,它绕过UFS,可以提供很多有用的特性:
- 数据卷 可以在容器之间共享和重用
- 对 数据卷 的修改会立马生效
- 对 数据卷 的更新,不会影响镜像
- 数据卷 默认会一直存在,即使容器被删除
named volume 有两种创建方法,
(1) docker run 命令中采用了 -v
one_volume_name:/container/dir_or_file , 这里的one_volume_name不是host中的绝对路径, 而是一个名称.
(2) 通过 docker volume create 创建的, 该命令支持更多的选项, 推荐使用.
匿名volume方式 是通过 docker run 命令中传入了 -v /container/dir 类型的参数.
bind mount 方式和volume方式的简单对比:
bind mount方式, docker容器直接访问host的目录或文件, 性能是最好的.
bind mount方式, docker容器直接访问host的目录或文件, 对于该host绝对目录可能会引入权限问题. 如果容器仅需要只读访问权限, 最好是显式设定只读方式.
对于 volume方式, 如果host中落地目录为空, docker先将容器中的对应目录复制到host下, 然后再进行挂载操作; 对于bind mount方式, 挂载之前没有复制操作.
容器要依赖host主机的一个绝对路径, 使得容器的移植性变差, docker 官方并不推荐这个方法, 而是推荐使用volume.
创建一个数据卷:
[root@centos7 mycentos]#docker volume create my-vol
查看所有的数据卷:
[root@centos7 mycentos]# docker volume ls local my-vol
在主机里使用以下命令可以查看指定数据卷的信息
[root@centos7 mycentos]# docker volume inspect my-vol [ { "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/my-vol/_data", "Name": "my-vol", "Options": {}, "Scope": "local" } ]
在容器中挂载指定数据卷
[root@centos7 mycentos]# docker run -d -P --name web -v my-vol:/wepapp \ busybox /bin/sh 挂载上来后,我们就像上面一样,用docker inspect web来查看详细的信息。
2.3 数据容器
数据容器是指那些只用来保存数据的容器。通常会在容器中创建一个或多个卷,其他的容器就可以通过--volumes-from选项来访问它们。
例如,我们先运行一个名为storage的数据容器,它包含一个卷并在后台运行:
[root@centos7 mycentos]# docker run -d -v /data --name storage centos
接下来我们运行另一个容器:
[root@centos7 mycentos]# docker run -it --volumes-from storage centos bash