容器数据卷:可以实现宿主机与容器进行共享、容器数据持久化,容器与容器共享数据。可以在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]#