• 『现学现忘』Docker基础 — 32、通过DockerFile的方式挂载数据卷


    1、简单了解一下DockerFile

    我们这里先简单的概括一下DockerFile:

    • Dockerfile就是用来构建Docker镜像的构建文件,是一个命令脚本。
    • 通过这个脚本可以生成镜像,镜像是一层一层的,而脚本也是一个个的命令,每个命令都是一层。

    (理解到这里就可以了)

    2、通过DockerFile的方式挂载数据卷

    目标:在Dockerfile中使用VOLUME指令来给镜像添加一个或多个数据卷。

    (1)创建DockerFile文件

    在宿主机的/home目录中创建一个mydocker目录。

    mydocker目录中,创建一个文件dockerfile

    如下所示:

    shell
    # 进入/home目录
    [root@192 ~]# cd /home/
    [root@192 home]# ll
    总用量 0
    
    # 创建并进入mydocker目录
    [root@192 home]# mkdir mydocker
    [root@192 home]# cd mydocker/
    
    # 创建Dockerfile文件
    [root@192 mydocker]# touch dockerfile
    [root@192 mydocker]# ll
    总用量 0
    -rw-r--r--. 1 root root 0 3月  19 19:59 dockerfile

    (2)编辑Dockerfile文件

    dockerfile文件中编写如下内容。

    dockerfile
    FROM centos # 添加基础镜像
    VOLUME ["volume01", "volume02"] # 添加两个容器数据卷,属于匿名挂载
    CMD echo "--finished----success--" # 容器构建完成输出的信息
    CMD /bin/bash # 指定终端命令

    说明:

    • 创建一个Dockerfile文件,名字可以随机起,建议使用Dockerfile命名。
    • 文件中的指令都大写。
    • Dockerfile里面的每个命令,就是镜像的一层!

    提示:

    出于可移植和分享的考虑,用-v 主机目录:容器目录这种方法不能够直接在Dockerfile中实现。

    是由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录。

    (3)构建Dokcer镜像

    构建Dokcer镜像使用docker build命令。

    执行命令:docker build -f /home/mydocker/dockerfile -t wukong/centos:1.0 .

    提示:

    • -f:指明Dockerfile文件的路径。
    • -t:定义镜像的命名空间/镜像名:TAG。(命名空间可以省略)
    • 最后的. 表示是在指定镜像构建过程中上下文环境的目录。(先按固定写法记)
    shell
    # 从Dockerfile生成镜像
    [root@192 mydocker]# docker build -f /home/mydocker/dockerfile -t wukong/centos:1.0 .
    Sending build context to Docker daemon  2.048kB
    Step 1/4 : FROM centos # 可以看到一步一步的执行Dockerfile文件的每一条语句
     ---> 300e315adb2f
    Step 2/4 : VOLUME ["volume01", "volume02"]
     ---> Running in 5b470e19ab85
    Removing intermediate container 5b470e19ab85
     ---> 9f32b7e2ec23
    Step 3/4 : CMD echo "--finished----success--"
     ---> Running in 8e5e921be91d
    Removing intermediate container 8e5e921be91d
     ---> c25f409aaaa3
    Step 4/4 : CMD /bin/bash
     ---> Running in 3a09eb701bf5
    Removing intermediate container 3a09eb701bf5
     ---> 98b1b6590b78
    Successfully built 98b1b6590b78 # 最后生成的镜像ID
    Successfully tagged wukong/centos:1.0
    
    # 查看本地Docker镜像
    [root@192 mydocker]# docker images
    REPOSITORY      TAG       IMAGE ID       CREATED         SIZE
    wukong/centos   1.0       98b1b6590b78   3 minutes ago   209MB
    mysql           5.7       a70d36bc331a   8 weeks ago     449MB
    centos          latest    300e315adb2f   3 months ago    209MB

    (4)启动镜像,并操作镜像

    执行命令:docker run -it wukong/centos /bin/bash

    启动容器,并且查看wukong/centos容器的根目录。

    shell
    # 启动进入容器
    [root@192 ~]# docker run -it 98b1b6590b78 /bin/bash
    [root@b2094527a8c4 /]#
    
    # 查看wukong/centos容器的根目录
    [root@b2094527a8c4 /]# ls -l
    total 0
    lrwxrwxrwx.   1 root root   7 Nov  3 15:22 bin -> usr/bin
    drwxr-xr-x.   5 root root 360 Mar 19 12:52 dev
    drwxr-xr-x.   1 root root  66 Mar 19 12:52 etc
    drwxr-xr-x.   2 root root   6 Nov  3 15:22 home
    lrwxrwxrwx.   1 root root   7 Nov  3 15:22 lib -> usr/lib
    lrwxrwxrwx.   1 root root   9 Nov  3 15:22 lib64 -> usr/lib64
    drwx------.   2 root root   6 Dec  4 17:37 lost+found
    drwxr-xr-x.   2 root root   6 Nov  3 15:22 media
    drwxr-xr-x.   2 root root   6 Nov  3 15:22 mnt
    drwxr-xr-x.   2 root root   6 Nov  3 15:22 opt
    dr-xr-xr-x. 126 root root   0 Mar 19 12:52 proc
    dr-xr-x---.   2 root root 162 Dec  4 17:37 root
    drwxr-xr-x.  11 root root 163 Dec  4 17:37 run
    lrwxrwxrwx.   1 root root   8 Nov  3 15:22 sbin -> usr/sbin
    drwxr-xr-x.   2 root root   6 Nov  3 15:22 srv
    dr-xr-xr-x.  13 root root   0 Mar 19 04:07 sys
    drwxrwxrwt.   7 root root 145 Dec  4 17:37 tmp
    drwxr-xr-x.  12 root root 144 Dec  4 17:37 usr
    drwxr-xr-x.  20 root root 262 Dec  4 17:37 var
    drwxr-xr-x.   2 root root   6 Mar 19 12:52 volume01
    drwxr-xr-x.   2 root root   6 Mar 19 12:52 volume02

    从上面我们到,在容器的根目录多了两个文件夹volume01volume02

    其实这两个文件夹就是我们在Dockerfile文件中定义的数据卷挂载,是以匿名挂载的方式挂载数据卷的。

    在容器启动的时候,会自动挂载这两个数据卷目录。

    然后我们进入volume01目录创建一个文件container.txt

    shell
    # 创建container.txt文件
    [root@b2094527a8c4 /]# mkdir /volume01/container.txt
    
    # 查看文件是否创建成功
    [root@b2094527a8c4 /]# ls -l /volume01
    total 0
    drwxr-xr-x. 2 root root 6 Mar 19 12:58 container.txt

    (5)查看数据卷

    我们通过docker inspect命令,查看容器的详细信息。

    shell
    # 查看当前运行的容器
    [root@192 ~]# docker ps
    CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS         PORTS
    b2094527a8c4   98b1b6590b78   "/bin/bash"   8 minutes ago   Up 8 minutes
    
    # 查看容器详细信息
    [root@192 ~]# docker inspect b2094527a8c4

    下图是截取容器挂载部分的内容。

    image

    上图就证明容器启动时,自动创建了volume01volume02两个挂载数据卷目录。

    并且使用匿名挂载的方式进行挂载。

    我们进入宿主机的/var/lib/docker/volumes/2a2c26cec7ba4908a33a381aa90367a5e4123bb6e6fd9f5ef0887911a962ba19/_data目录,查看是否存在container.txt文件。

    shell
    [root@192 ~]# cd /var/lib/docker/volumes/2a2c26cec7ba4908a33a381aa90367a5e4123bb6e6fd9f5ef0887911a962ba19/_data
    [root@192 _data]# ll
    总用量 0
    drwxr-xr-x. 2 root root 6 3月  19 20:58 container.txt

    说明在容器中volume01目录下创建的container.txt,同步到宿主机中了。

    提示:

    使用DockerFile挂载数据卷的方式我们未来使用的十分多,因为我们通常会构建自己的镜像。

    假设构建镜像时候没有挂载数据卷,那我们就要手动进行数据卷的挂载了,-v 卷名:容器内路径


    __EOF__

  • 本文作者: 繁华似锦的博客
  • 本文链接: https://www.cnblogs.com/liuyuelinfighting/p/16048776.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    Python--toml配置文件
    SkyWalking 为所有的API接口增加 tag
    Kubernetes CRD 介绍
    Django简介(基本操作命令|目录结构|小白三板斧)
    精准测试的相关概念与实践
    电商平台促销管理功能解析,数商云S2B2C商城系统开启日化行业数字零售新模式
    数字信号处理-4-三角函数合成与傅里叶级数
    保研后,你们都怎么样了?
    C语言——简易版扫雷
    如何使用Postman调试HMS Core推送接口?
  • 原文地址:https://www.cnblogs.com/liuyuelinfighting/p/16048776.html