docker容器数据卷

1、概述

  • docker容器数据卷:当我们在使用docker容器的时候,会产生一系列的数据文件,这些数据文件在我们关闭docker容器时是会消失的,但是其中产生的部分内容我们是希望能够把它给保存起来另作用途的,Docker将应用与运行环境打包成容器发布,我们希望在运行过程钟产生的部分数据是可以持久化的的,而且容器之间我们希望能够实现数据共享。
    • 数据卷可以在容器之间共享或重用数据。
    • 数据卷中的更改可以直接生效。
    • 数据卷中的更改不会包含在镜像的更新中。
    • 数据卷的生命周期一直持续到没有容器使用它为止。

2、挂载数据卷方式

添加数据卷的方式有两种,第一种是直接通过命令行挂载,第二种是通过DockerFile添加。

  • ①通过命令行挂载。

    1
    2
    3
    docker run -it -v 宿主机绝对路径目录:容器内目录:ro(只读,该路径内容只能通过宿主机改变)/rw(可读可写) 镜像名
    # 测试
    docker run -it -v /home/mycentos:/home centos

    运行成功后可通过”docker inspect <容器id>”查看挂载信息。

    安装MySQL

    1
    2
    3
    4
    5
    6
    # -d 后台运行
    # -p 端口映射
    # -v 卷挂载
    # -e 环境配置
    # --name 容器名字
    docker run -d -p 13306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

    匿名挂载(挂载时只指定容器内的路径)

    1
    2
    3
    4
    5
    docker run -d -P --name nginx01 -v /etc/nginx nginx
    # 查看所有volume的情况
    docker volume ls
    # 查看volume帮助命令
    docker volume --help

    具名挂载(挂载时指定了卷名和容器内的路径)**

    1
    2
    3
    docker run -d -P --name nginx02 -v mynginx:/etc/nginx nginx
    # 查看指定卷名所在目录(没有指定目录的情况下默认在/var/lib/docker/volumes/卷名/_data目录下)
    docker volume inspect <卷名>
  • ②通过DockerFile挂载。Dockerfile是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

    • DockerFile指令说明:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
        FROM # 基础镜像
      MAINTAINER # 维护者信息,姓名+邮箱
      ENV # 设置环境变量
      RUN # 构建镜像时需要运行的命令
      ADD # 添加内容,当为压缩包时会自动解压
      WORKDIR # 工作目录
      VOLUME # 挂载目录
      EXPOSE # 暴露端口
      CMD # 指定容器启动时要运行的命令,只有最后一个会生效,可被docker run后跟的CMD命令替代
      ENTRYPOINT # 指定容器启动时要运行的命令,可以追加docker run后跟的CMD命令
      ONBUILD # 它后面跟着的是其他指令,比如COPY、RUN等,而这些命令在当前镜像被构建时,并不会被执行。只有以当前镜像为基础镜像去构建下一级镜像时,才会被执行
      COPY # 将从上下文目录中的指定路径下的文件或文件夹复制到新的一层的镜像内的指定路径之下,当为压缩包时不会自动解压
    • 编写DockerFile文件,内容如下,接着使用docker build -f dockerfile -t mycentos .(最后的”.”是指上下文路径,docker在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包,如果未说明,那么默认上下文路径就是Dockerfile所在的位置)命令构建镜像:

      1
      2
      3
      4
      FROM centos
      VOLUME ["volume01","volume02"] # 匿名挂载
      CMD echo "success build"
      CMD /bin/bash

      使用docker run -d 9dc61beef1bd命令创建容器后再用inspect命令可查到容器的挂载信息。

3、数据卷容器

  • 已经存在一个挂载了数据卷的容器,由于数据卷在容器之前是可以共享的,所以此时如果存在其他容器通过docker run --volumes-from [容器别名]命令挂载到该容器上,则该容器可以被称之为数据卷容器。其主要功能是提供数据卷供其他容器挂载。当数据卷容器宕机后,并不会造成数据卷的回收卸载,数据卷会继续挂载在其他容器中。当全部挂载该数据卷的容器全部宕机后,该数据卷才会卸载。

  • 容器之间配置信息的传递,数据卷的生命周期会一致持续到没有容器使用它为止,换言之,只要有一个容器仍在使用该数据卷,该数据卷一直都可以进行数据共享,通俗地来说,如果此时我们把父容器关闭掉,两个字容器之间依旧可以进行数据共享,而且通过继承子容器生成的新容器,一样可以与子容器进行数据共享。这就是docker容器间的数据传递共享。