Docker系列-8.容器数据存储

Docker系列-8.容器数据存储

宿主机上的一些数据,如果想在容器中能访问到那么这时候就需要用到docker的数据存储。

常见的两种数据存储方式:数据卷( Data volumes)和数据卷容器( Data volume containers)

数据卷Data volumes

数据卷( Data volumes)的概念类似于Linux中mount的文件系统、Aix中mount的逻辑分区LogicVolume。用法也类似,在运行 docker run 命令时,通过设置 -v或者--volume甚至--mount选项将宿主机的卷挂载到容器中。

这里以容器形式的Docker registry为例添加自定义的数据卷作为镜像仓库的存储媒介。

[root@registry-docker-distribution ~]#mkdir -p /var/lib/volume4registry
[root@registry-docker-distribution ~]#touch testvolume
[root@registry-docker-distribution ~]# docker run -it -v /var/lib/volume4registry:/mnt registry /bin/sh        
/ # ls /mnt/
testvolume

Docker默认会以读写模式挂载数据卷,如果想以只读方式挂载数据卷,可以在名称后通过冒号设置相应的权限。比如读取宿主机上的配置文件,可以使用 -v /var/lib/volume4registry:/mnt :ro

宿主机上可以通过docker inspect 命令来查看数据卷的挂载映射情况。

[root@registry-docker-distribution ~]# docker inspect -f {{.Mounts}} 682ccdc258b6
[{bind  /var/lib/volume4registry /mnt   true rprivate} {volume be1a3f1ba3b88af8def3c341bd82dacb9ea76b30858d0a6573c7e21a05de8d39 /var/lib/docker/volumes/be1a3f1ba3b88af8def3c341bd82dacb9ea76b30858d0a6573c7e21a05de8d39/_data /var/lib/registry local  true }]

数据卷容器Data volume containers

数据卷容器是一个专门用来提供数据卷供其它容器挂载的容器,适用于容器间共享数据,这样就可以让Docker去负责管理卷,这样做遵循了单一职责这一原则。

使用docker run -v选项指定宿主机中的卷,以及该卷在容器中要挂载的路径。如果省略了宿主机中的路径,那么你就创建了一个数据卷容器。

[root@registry-docker-distribution ~]# docker run -it -v /registryVol registry /bin/sh
# touch -p /registryVol/testdir
# ls /registryVol/
testdir

退出这个容器之后,可以通过 docker inspect 命令来查看这个数据卷被保存到了宿主机的什么位置。 Docker 会在 /var/lib/docker/volumes/ 下为这个卷创建对应的文件夹。

[root@registry-docker-distribution ~]# docker inspect -f {{.Mounts}} b46cd30c04b6
[{volume b5f2f34d55a767a2d4e041e1dbc7f2de67efec435391ae341afb56e884573453 /var/lib/docker/volumes/b5f2f34d55a767a2d4e041e1dbc7f2de67efec435391ae341afb56e884573453/_data /registryVol local  true }]

[root@registry-docker-distribution ~]# ls  /var/lib/docker/volumes/b5f2f34d55a767a2d4e041e1dbc7f2de67efec435391ae341afb56e884573453/_data/
testdir

共享数据卷

为了使容器中的卷共享给其他容器,可以使用 --volumes-from 选项。

#创建一个数据容器data
[root@registry-docker-distribution ~]#  docker run -v /data --name data ubuntu:latest

[root@registry-docker-distribution ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
4cba4d6f93da        ubuntu:latest       "/bin/bash"         11 seconds ago      Exited (0) 11 seconds ago    

[root@registry-docker-distribution ~]# docker inspect -f {{.Mounts}} data
[{volume a79e7e24a481c22151f110892091c4ea16eb45501a0dab6b85f69189683847d2 /var/lib/docker/volumes/a79e7e24a481c22151f110892091c4ea16eb45501a0dab6b85f69189683847d2/_data /data local  true }]

data容器并没有处于运行状态,但是它的卷映射关系已经存在,并且卷被持久化到/var/lib/docker/volumes下。通过 docker rm -v data 命令来删除容器和它的卷

创建另一个容器通过 --volumes-from 来挂载容器卷

[root@registry-docker-distribution ~]# docker run -it --volumes-from data centos:latest /bin/bash
[root@b0420a27a5a7 /]# ls /d
data/ dev/  
[root@b0420a27a5a7 /]# touch /data/centosfile
[root@b0420a27a5a7 /]# exit
exit
[root@registry-docker-distribution ~]# ls /var/lib/docker/volumes/a79e7e24a481c22151f110892091c4ea16eb45501a0dab6b85f69189683847d2/_data/
centosfile

参考

Use volumes

Data-only container madness

Docker In-depth: Volumes

posted @ 2020-09-21 19:56  ElfCafe  阅读(408)  评论(0编辑  收藏  举报