3. Dokcer Data Volumes

92 阅读4分钟

Dokcer 容器数据卷

docker的过程中,往往需要能够查看容器内应用产生的数据,或者需要把容器内的数据进行备份,甚至多个容器之间进行数据共享,这必然涉及到容器的数据管理操作。

容器中管理数据主要有两种方式:

  • 数据卷(Data Volumes)
  • 数据卷容器 (Data Volumes Containers)

数据卷

数据卷是一个可供容器使用的特殊目录,他绕过文件系统,可以提供很多有用的特性:

  • 数据卷可以在容器之间共享与重用。
  • 对数据卷的修改会立马生效。
  • 对数据卷的更新不会影响容器。
  • 卷会一直存在,直到没有容器使用。

数据卷的使用类似于Linux下对目录或文件进行 mount 操作。

在容器内创建一个数据卷

[root@localhost /]# docker run -it --name alias_v1.0 -v /src/valumes_dir qiuhaijun/demo

root@770fe5227643:/# cd /src/valumes_dir/
root@770fe5227643:/src/valumes_dir# pwd

/src/valumes_dir

[root@localhost /]# docker run -d -P --name alias_v1.0 -v /src/valumes_dir qiuhaijun/demo

注意: -P 允许外部访问容器需要暴露的端口。

在 qiuhaijun/demo 镜像中创建一个 alias_v1.0 容器,并在容器中创建一个数据卷 valumes_dir。 多次使用 -v 标记可以在容器内创建多个数据卷。

挂载一个主机目录作为数据卷

[root@localhost /]# docker run -it --name domain_dir -v /src/dri:/opt/dri qiuhaijun/demo

root@0942484042bb:/# cd /opt/dri/
root@0942484042bb:/opt/dri# pwd

/opt/dri

上面的命令加载主机的 /src/dri 目录到容器的 /opt/dri 目录:

这个功能在进行测试的时候十分的方便,比如用户可以放置一些程序或数据到本地目录中,然后在容器内运行和使用。另外,本地目录的路径必须是绝对路径,如果目录不存在,Dokcer 会自动创建。

Docker 挂在数据卷的默认权限是读写(rw),用户可以通过 ro 指定为只读:

[root@localhost /]# docker run -d -P -name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py

加入 :ro 之后,容器内挂载的数据卷的数据就无法修改了.

挂在一个本地主机文件作为数据卷

[root@localhost /]# docker run --rm -it -v ~/.bash_history:/.bash_history ubuntu /bin/bash

end...


容器数据卷

需要在容器之间共享一些持续更新的数据,最简单的方式 是使用数据卷容器。
数据卷容器就是一个普通的容器,专门用它提供数据卷供其他容器挂载使用,方法如下:

[root@localhost /]# docker run -ti -v /data_dir --name data_dir ubuntu
[root@localhost /]# docker run -it --volumes-from data_dir --name data1 ubuntu
[root@localhost /]# docker run -it --volumes-from data_dir --name data2 ubu

首先创建一个数据卷容器 data_dir ,并在其中创建一个数据卷挂在到 /data_dir 目录。
然后其他容器中使用 --volumes-from 来挂载 /data_dir 容器中的数据卷。创建 data1 / data2 两个容器,并从 data_dir 容器中挂载数据卷。
可以多次使用 --valumes-from 参数来从多个容器挂载多个数据卷。还可以从其他已经挂载了容器卷的容器来挂载数据卷。

root@localhost /]# docker run -ti --name data4 --volumes-from data1 training/webapp

利用数据卷容器迁移数据

备份

[root@localhost /]# docker run -ti --volumes-from data_dir -v $(pwd):/backup --privileged=true 
--name worker ubuntu tar cvf /backup/backup.tar /data_dir

首先使用Ubuntu镜像创建了一个容器。使用 --volumes-from data_dir 参数来让worker 容器挂载data_dir 容器的数据卷(既data_dir数据卷);使用 -v $(pwd):/backup 参数来挂载本地的当前目录到worker 容器的 /backup 目录。

worker 容器启动后,使用 tar cvf /backup/backup.tar /data_dir 目录来将/data_dir的内容备份为容器内的 /backup/backup.tar(通俗说就是把 /data_dir 目录文件tar包到 /backup/backup.tar),即宿主主机当前目录下的backup.tar。

恢复

首先创建一个带有数据卷的容器 data_dir5 ,挂载到 /data_dir 数据卷(目录)。

[root@localhost /]# docker run -v /data_dir --name data_dir5 ubuntu /bin/bash

然后创建一个新的容器,挂载data_dir5 的容器,并使用untar 解压备份文件到所挂载的容器卷中即可。tar xvf /backup/backup.tar 解开一个tar

[root@localhost /]# docker run -it --volumes-from data_dir5 -v $(pwd):/backup --privileged=true busybox tar xvf /backup/backup.tar

为了查看/验证恢复的数据,可以再启动一个容器挂载同样的容器卷来查看

[root@localhost /]# docker run --volumes-from data_dir5 busybox /bin/ls /data_dir

test.txt