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