容器数据卷是用来保存容器里的数据的,用来实现数据持久化和数据共享。
这里记录一下容器内添加数据卷的方式
$ docker run -it -v /c/Users/songzeceng/dataVolume:/dataVolumeContainer centos
-v表示指定数据卷,/c/Users/songzeceng/dataVolume表示宿主机上的路径,windows下只能使用C:/Users下的目录,/dataVolumeContainer表示容器上的路径,两个路径如果不存在会自行创建,而且会保持数据同步。
我们可以在docker inspect的输出中,得到以下路径绑定信息
$ docker inspect 780b449de985
...
"HostConfig": {
"Binds": [
"/d/myDataVolume:/dataVolumeContainer"
],
...
"Mounts": [
{
"Type": "bind",
"Source": "/d/myDataVolume",
"Destination": "/dataVolumeContainer",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
...
RW为True表示可读可写,如果为False,表示容器里只能访问绑定目录,但不能写。对应命令如下
$ docker run -it -v /c/Users/songzeceng/dataVolume:/dataVolumeContainer:ro centos
先创建一个Dockerfile文件,写入以下内容
FROM centos
VOLUME ["/dataVolumeContainer1", "/dataVolumeContainer2"]
CMD echo "finished"
CMD /bin/bash
然后运行以下命令,把Dockerfile编译成一个szc/centos镜像
$ docker build -f Dockerfile -t szc/centos .
最后启动szc/centos容器即可
别的容器可以挂载到一个容器上,来实现容器间的传递共享。被挂载的容器被称为数据卷容器。
先启动一个容器dc01,在目录dataVolumeContainer2下创建文件并输入内容
$ docker run -it --name dc01 szc/centos
[root@5488bf4c2782 /]# cd dataVolumeContainer2/
[root@5488bf4c2782 dataVolumeContainer2]# touch 777 dc01.txt
[root@5488bf4c2782 dataVolumeContainer2]# vi dc01.txt
然后启动子容器dc02,挂载到dc01上
$ docker run -it --name dc02 --volumes-from dc01 szc/centos
那么dc02拥有dc01的一切,包括新建的文件
[root@dc9aa236c280 /]# ls
bin dataVolumeContainer2 etc lib lost+found mnt proc run srv tmp var
dataVolumeContainer1 dev home lib64 media opt root sbin sys usr
[root@dc9aa236c280 /]# cd dataVolumeContainer2
[root@dc9aa236c280 dataVolumeContainer2]# ls
dc01.txt
[root@dc9aa236c280 dataVolumeContainer2]# cat dc01.txt
dc01
再启动一个挂载到dc01的dc03,dc03再在dataVolumeContainer2下创建文件并输入内容,数据同样会被其他两个容器共享
C:\Users\songzeceng>docker run -it --name dc03 --volumes-from dc01 szc/centos
[root@c3041cf19df7 /]# ls -l
total 56
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x 2 root root 4096 Mar 8 07:33 dataVolumeContainer1
drwxr-xr-x 2 root root 4096 Mar 8 07:37 dataVolumeContainer2
....
[root@c3041cf19df7 /]# cd dataVolumeContainer2
[root@c3041cf19df7 dataVolumeContainer2]# ls
dc01.txt
[root@c3041cf19df7 dataVolumeContainer2]# touch dc03.txt
[root@c3041cf19df7 dataVolumeContainer2]# vi dc03.txt
[root@c3041cf19df7 dataVolumeContainer2]#
dc02里再度查询
[root@dc9aa236c280 dataVolumeContainer2]# ls -l
total 8
-rw-r--r-- 1 root root 5 Mar 8 07:34 dc01.txt
-rw-r--r-- 1 root root 5 Mar 8 07:42 dc03.txt
[root@dc9aa236c280 dataVolumeContainer2]#
容器挂载到数据卷容器后,就没有容器的从属关系了,此时如果关闭容器dc01,dc02和dc03依旧可以访问并修改数据卷中的数据。因此,数据卷的生命周期是超越容器的,只要有容器使用它,这个数据卷就一直存在。