容器数据卷:可以实现宿主机与容器进行共享、容器数据持久化,容器与容器共享数据。可以在run镜像时使用-v参数指定宿主机与容器进行挂载的目录,也可以使用dockerfile的volume指定容器中容器数据卷,使用dockerfile构建镜像后,通过该镜像创建容器,那么会在宿主机中自动生成一个与之挂载的目录。使用这个dockerfile构建的镜像在run时使用参数volumes-from指定另外一个该镜像的容器,可以实现容器与容器进行数据盘挂载。

一 使用-v实现宿主机与容器数据共享

使用centos镜像,进行演示,进行镜像拉取:

[root@localhost ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
7a0437f04f83: Pull complete
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
centos       latest    300e315adb2f   4 months ago   209MB

创建并启动容器,使用-v参数实现宿主机与容器数据盘挂载

docker run -it -v /myhost:/mycontainer 300e315adb2f

使用docker inspcet 查看容器信息,可以看到数据已挂载,并且在宿主机创建了myhost目录,在容器创建了mycontainer目录,经写入文件可以看到数据会同步。

docker inspect centos
"Mounts": [
            {
                "Type": "bind",
                "Source": "/myhost",
                "Destination": "/mycontainer",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

可以看到RW是读写都支持,如果想让容器只读,可以如下设置

docker run -it -v /myhost:/mycontainer:ro 300e315adb2f

使用docker inspect查看 发现是只读模式

"Mounts": [
            {
                "Type": "bind",
                "Source": "/myhost",
                "Destination": "/mycontainer",
                "Mode": "ro",
                "RW": false,
                "Propagation": "rprivate"
            }
        ],

二 创建dockerfile进行挂载

首先创建一个dockerfile文件,在该文件使用volume指定容器挂载的目录(不能指定宿主机目录,宿主机目录自动生成,使用inspect查看宿主机目录),对该文件进行build会得到一个新的镜像,使用这个镜像创建容器,将会实现容器与宿主机数据挂载。

创建dockerfile:在/myDocker目录下创建一个文件,名称为Dockerfile

FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]

CMD echo "finished,--------success1"

CMD /bin/bash

对dockerfile进行build生成自定义的镜像 mycentos (注意结尾处有一个 .)

docker build -f /mydocker/Dockerfile -t mycentos .

-f 指定dockerfile的目录,当不指定时在当前目录下找Dockerfile文件,-t 指定镜像名称 命名空间/镜像名称:标签,命名空间可以不写,标签不写默认是latest

Sending build context to Docker daemon  3.072kB
Step 1/4 : FROM centos
latest: Pulling from library/centos
7a0437f04f83: Pull complete
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
Status: Downloaded newer image for centos:latest
 ---> 300e315adb2f
Step 2/4 : VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
 ---> Running in c08751afe82b
Removing intermediate container c08751afe82b
 ---> d7ab4215ac34
Step 3/4 : CMD echo "finished,--------success1"
 ---> Running in 04941c2e5c86
Removing intermediate container 04941c2e5c86
 ---> c204038019a5
Step 4/4 : CMD /bin/bash
 ---> Running in 7db403016320
Removing intermediate container 7db403016320
 ---> 2a327c3561b0
Successfully built 2a327c3561b0
Successfully tagged mycentos:latest

镜像mycentos创建成功,看到镜像中指定了容器数据卷  VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]

使用镜像mycentos创建容器,容器名称指定为r1

[root@localhost mydocker]# docker run -it --name="r1" mycentos
[root@d8fe749fd7fe /]#

按ctr+p+q退出而不停止容器。

使用docker inspcet查看容器数据卷挂载信息

{
                "Type": "volume",
                "Name": "e7e59e7b26198b61f067260e6595dd622f94608819f6fd3377e7fd80265e10b1",
                "Source": "/var/lib/docker/volumes/e7e59e7b26198b61f067260e6595dd622f94608819f6fd3377e7fd80265e10b1/_data",
                "Destination": "/dataVolumeContainer2",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }

source就是自动生成的宿主机挂载目录

三 容器与容器通过容器数据卷进行数据挂载

容器使用相同的镜像创建(上一步构建的镜像mycentos),一个容器在创建并启动时,使用--volumes-from 指定另外一个容器的id,则实现了两个容器数据卷的数据挂载。

在上一步创建了容器r1

[root@localhost mydocker]# docker ps
CONTAINER ID   IMAGE      COMMAND                  CREATED         STATUS         PORTS     NAMES
d8fe749fd7fe   mycentos   "/bin/sh -c /bin/bash"   7 minutes ago   Up 7 minutes             r1

再次创建两个容器r2 r3,这两个容器的volumes-from指向r1

[root@localhost mydocker]# docker run -it --volumes-from d8fe749fd7fe --name r2 mycentos
[root@e5992892fd8b /]#
[root@localhost mydocker]# docker run -it --volumes-from d8fe749fd7fe --name r3 mycentos
[root@c01d90b3c1f0 /]#
[root@localhost mydocker]# docker ps
CONTAINER ID   IMAGE      COMMAND                  CREATED              STATUS              PORTS     NAMES
c01d90b3c1f0   mycentos   "/bin/sh -c /bin/bash"   24 seconds ago       Up 23 seconds                 r3
e5992892fd8b   mycentos   "/bin/sh -c /bin/bash"   About a minute ago   Up About a minute             r2
d8fe749fd7fe   mycentos   "/bin/sh -c /bin/bash"   14 minutes ago       Up 14 minutes                 r1

进入 r3 在容器数据卷挂载的目录下创建文件,发现r1 r2也出现了该文件,挂载成功。

[root@localhost mydocker]# docker attach r3
[root@c01d90b3c1f0 /]# ls
bin                   dataVolumeContainer2  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
dataVolumeContainer1  dev                   home  lib64  media       opt  root  sbin  sys  usr
[root@c01d90b3c1f0 /]# cd dataVolumeContainer1
[root@c01d90b3c1f0 dataVolumeContainer1]# touch r3.txt
[root@c01d90b3c1f0 dataVolumeContainer1]# read escape sequence
[root@localhost mydocker]# docker attach r2
[root@e5992892fd8b /]# cd dataVolumeContainer1
[root@e5992892fd8b dataVolumeContainer1]# ls
r3.txt
[root@e5992892fd8b dataVolumeContainer1]# read escape sequence
[root@localhost mydocker]# docker attach r1
[root@d8fe749fd7fe /]# cd dataVolumeContainer1
[root@d8fe749fd7fe dataVolumeContainer1]# ls
r3.txt
[root@d8fe749fd7fe dataVolumeContainer1]#