使用Dockerfile创建数据卷

本文将介绍在Docker中怎样使用Dockerfile创建数据卷。

在当前目录下面创建Dockerfile文件,然后在VOLUME指令来给镜像添加一个或多个数据卷。VOLUME语法如下:

VOLUME[“/dataVolumeContainer1”,  “/dataVolumeContainer2”,  “/dataVolumeContainer3”]

说明:出于可移植和分享的考虑,用“-v主机目录:容器目录”这种方法不能够直接在Dockerfile中显示。由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。

实例:根据定义的Dockerfile去创建镜像。

(1) 在当前秒目录下面创建Dockerfile,内容如下:

# volume test
FROM centos
VOLUME ["/dataVolumeContainer1", "/dataVolumeContainer2"]
CMD echo "finished......success"
CMD /bin/bash

如下图:

[root@localhost ~]# vim Dockerfile
[root@localhost ~]# cat Dockerfile
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1", "/dataVolumeContainer2"]
CMD echo "finished......success"
CMD /bin/bash

(2) 根据上面创建好的Dockerfile文件构建一个新的镜像。执行“docker build -f ./Dockerfile -t mycentos .”命令去创建镜像。如下:

[root@localhost ~]# docker build -f ./Dockerfile -t mycentos .
Sending build context to Docker daemon  28.67kB
Step 1/4 : FROM centos
 ---> 9f38484d220f
Step 2/4 : VOLUME ["/dataVolumeContainer1", "/dataVolumeContainer2"]
 ---> Using cache
 ---> 7d440f43e039
Step 3/4 : CMD echo "finished......success"
 ---> Using cache
 ---> 4814b80b83b4
Step 4/4 : CMD /bin/bash
 ---> Using cache
 ---> 1b896063f266
Successfully built 1b896063f266
Successfully tagged mycentos:latest

我们可以使用“docker images”命令查看我们刚刚创建的镜像(镜像ID为1b896063f266):

[root@localhost ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mycentos            latest              1b896063f266        3 days ago          202MB
tomcat              latest              5377fd8533c3        2 weeks ago         506MB
centos              latest              9f38484d220f        3 months ago        202MB
hello-world         latest              fce289e99eb9        6 months ago        1.84kB

(3) 使用“docker run -it 镜像”启动镜像。如下:

[root@localhost ~]# docker run -it mycentos
[root@7fe9af3b60b9 /]# ll
total 12
-rw-r--r--.   1 root root 12082 Mar  5 17:36 anaconda-post.log
lrwxrwxrwx.   1 root root     7 Mar  5 17:34 bin -> usr/bin
drwxr-xr-x.   2 root root     6 Jun 30 14:10 dataVolumeContainer1
drwxr-xr-x.   2 root root     6 Jun 30 14:10 dataVolumeContainer2
drwxr-xr-x.   5 root root   360 Jun 30 14:10 dev
drwxr-xr-x.   1 root root    66 Jun 30 14:10 etc
drwxr-xr-x.   2 root root     6 Apr 11  2018 home
lrwxrwxrwx.   1 root root     7 Mar  5 17:34 lib -> usr/lib
lrwxrwxrwx.   1 root root     9 Mar  5 17:34 lib64 -> usr/lib64
drwxr-xr-x.   2 root root     6 Apr 11  2018 media
drwxr-xr-x.   2 root root     6 Apr 11  2018 mnt
drwxr-xr-x.   2 root root     6 Apr 11  2018 opt
dr-xr-xr-x. 125 root root     0 Jun 30 14:10 proc
dr-xr-x---.   2 root root   114 Mar  5 17:36 root
drwxr-xr-x.  11 root root   148 Mar  5 17:36 run
lrwxrwxrwx.   1 root root     8 Mar  5 17:34 sbin -> usr/sbin
drwxr-xr-x.   2 root root     6 Apr 11  2018 srv
dr-xr-xr-x.  13 root root     0 Jun 24 13:42 sys
drwxrwxrwt.   7 root root   132 Mar  5 17:36 tmp
drwxr-xr-x.  13 root root   155 Mar  5 17:34 usr
drwxr-xr-x.  18 root root   238 Mar  5 17:34 var

上图中,我们可以看见“dataVolumeContainer1”和“dataVolumeContainer2”目录,这就是Dockerfile创建数据卷。

 

问题:我们怎样查看上面“dataVolumeContainer1”和“dataVolumeContainer2”两个目录,对应宿主机对应的目录呢?

[root@localhost ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
7fe9af3b60b9        mycentos            "/bin/sh -c /bin/bash"   58 seconds ago      Up 57 seconds                           mystifying_villani
[root@localhost ~]# docker inspect 7fe9af3b60b9
[
{
    ...
        "Mounts": [
            {
                "Type": "volume",
                "Name": "0b92644824def28ba0d88ef0b8ed169631305a4a91502b64cda70153e116cac6",
                "Source": "/var/lib/docker/volumes/0b92644824def28ba0d88ef0b8ed169631305a4a91502b64cda70153e116cac6/_data",
                "Destination": "/dataVolumeContainer2",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "931c1d7a053f23b3292893b35d46a6fe9fae789451fa1ff84e3aad1f255b1cc5",
                "Source": "/var/lib/docker/volumes/931c1d7a053f23b3292893b35d46a6fe9fae789451fa1ff84e3aad1f255b1cc5/_data",
                "Destination": "/dataVolumeContainer1",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
        ...
    }
]
[root@localhost ~]#

上面描述了“dataVolumeContainer1”和“dataVolumeContainer2”目录映射到宿主主机的目录。

 

注意:如果向数据卷写入数据抛出“cannot open directory .: Permission denied”错误。解决办法:在挂载的目录后多加一个“--privileged=true”参数即可。

 

privileged
/'prɪvəlɪdʒd/
adj. 享有特权的;有特别恩典的
v. 给予…特权;免除(privilege的过去分词)

人生就像赛跑,不在乎你是否第一个到达终点,而在乎你有没有跑完全程。
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号