Docker学习笔记之容器数据卷

背景

容器数据卷是用来保存容器里的数据的,用来实现数据持久化和数据共享。

这里记录一下容器内添加数据卷的方式

添加数据卷的方式

直接命令添加

$ 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添加

先创建一个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依旧可以访问并修改数据卷中的数据。因此,数据卷的生命周期是超越容器的,只要有容器使用它,这个数据卷就一直存在。

你可能感兴趣的:(docker)