devops基础---docker容器数据持久化和数据共享

docker 主要有两种数据存储形式, 一种是storage driver(也叫做 Graph driver), 另一种是 volume driver.下面我们就来看看这二种的存储形式那些不同。

devops基础---docker容器数据持久化和数据共享

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.

devops基础---docker容器数据持久化和数据共享

数据卷是一个可供一个或多个容器使用的特殊目录,它绕过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选项来访问它们。

devops基础---docker容器数据持久化和数据共享

例如,我们先运行一个名为storage的数据容器,它包含一个卷并在后台运行:

[root@centos7 mycentos]# docker run -d -v /data --name storage centos

接下来我们运行另一个容器:

[root@centos7 mycentos]# docker run -it --volumes-from storage centos bash


分享到:


相關文章: