在生产环境中使用 Docker ,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作。

方式一、Docker cp命令

docker cp :用于容器与主机之间的数据拷贝。
语法
# 容器内文件 copy to 宿主机
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
# 宿主机文件 copy to 容器内
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

OPTIONS说明:
-L :保持源目标中的链接

操作示例:

宿主机到容器

docker容器与宿主机的数据交互-LMLPHP

 容器到宿主机

docker容器与宿主机的数据交互-LMLPHP

注:此方式虽然他也可以管理但是数据不交融,基本不会使用,仅做了解

 方式二、Docker数据卷

1. 什么是volume

  想要了解Docker Volume,首先我们需要知道Docker的文件系统是如何工作的。Docker镜像是由多个文件系统(只读层)叠加而成。当我们启动一个容器的时候,Docker会加载镜像层并在其上添加一个读写层。如果运行中的容器修改了现有的一个已存在的文件,那该文件将会从读写层下的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏。当删除Docker容器,并通过该镜像重新启动时,之前的更改将会丢失。在Docker中,只读层以及在顶部的读写层的组合被称为Union FIle System(联合文件系统)。
  为了能够保存(持久化)数据以及共享容器间的数据,Docker提出了Volume的概念。简单来说,Volume就是目录或者文件,它可以绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。

2. 数据卷的特性

• 数据卷 可以在容器之间共享和重用
• 对数据卷的修改会立马生效
• 对数据卷的更新,不会影响镜像
• 数据卷 默认会一直存在,即使容器被删除

3. 数据卷相关操作

Usage:  docker volume COMMAND
Manage volumes
Commands:
  create      Create a volume
  inspect     Display detailed information on one or more volumes
  ls          List volumes
  prune       Remove all unused local volumes
  rm          Remove one or more volumes

创建数据卷

Usage:  docker volume create [OPTIONS] [VOLUME]
Create a volume
Options:
  -d, --driver string   Specify volume driver name (default "local")
      --label list      Set metadata for a volume
  -o, --opt map         Set driver specific options (default map[])

查看所有数据卷

Usage:  docker volume ls [OPTIONS]
List volumes
Aliases:
  ls, list
Options:
  -f, --filter filter   Provide filter values (e.g. 'dangling=true')
      --format string   Pretty-print volumes using a Go template
  -q, --quiet           Only display volume names

查看单一或多个数据卷详情

Usage:  docker volume inspect [OPTIONS] VOLUME [VOLUME...]
Display detailed information on one or more volumes
Options:
  -f, --format string   Format the output using the given Go template

删除单一数据卷

Usage:  docker volume rm [OPTIONS] VOLUME [VOLUME...]
Remove one or more volumes. You cannot remove a volume that is in use by a container.
Aliases:
  rm, remove
Options:
  -f, --force   Force the removal of one or more volumes

删除所有闲置数据卷

Usage:  docker volume prune [OPTIONS]
Remove all unused local volumes
Options:
      --filter filter   Provide filter values (e.g. 'label=<label>')
  -f, --force           Do not prompt for confirmation

操作示例:

 docker容器与宿主机的数据交互-LMLPHP

4. 数据卷使用

数据卷的使用,类似于 Linux 下对目录或文件进行 mount。

用户可以通过docker run的--volume/-v或--mount选项来创建带有数据卷的容器

Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
Run a command in a new container
Options:
    --volume list                    Bind mount a volume
    --volume-driver string           Optional volume driver for the container
    --volumes-from list              Mount volumes from the specified container(s)
    --mount mount                    Attach a filesystem mount to the container 

官方文档说明连接:docker run使用说明   --volume使用说明

4.1 --volume使用详述

  参数--volume(或简写为-v)只能创建bind mount。

命令格式:
 -v [[HOST-OPTIONS:]CONTAINER-DIR[:OPTIONS]]]
 HOST-OPTIONS:
    VOLUME_NAME(数据卷名称)
    ABSOLUTE-HOST-DIR(宿主机文件目录绝对路径)
    ABSOLUTE-HOST-FILE(宿主机文件绝对路径)
  (为空的情况下将挂载匿名数据卷) Options: rw 读写(默认值) ro 只读

4.1.1 根据数据卷名称进行挂载

docker run -itd -v VOLUME_NAME:CONTAINER-DIR IMAGE [COMMAND] [ARG...]

示例:

将数据卷 my_vol 挂载到容器的 /data/docker/volume/my_vol 目录

docker run -itd --name=vol1_ubuntu -v my_vol:/data/docker/volume/my_vol ubuntu /bin/bash

注:如果数据卷 my_vol 存在将直接进行挂载,如果不存在 docker 将先自动创建数据卷再进行挂载。

4.1.2 根据宿主机文件目录绝对路径进行挂载

docker run -it -v ABSOLUTE-HOST-DIR:CONTAINER-DIR IMAGE [COMMAND] [ARG...]

示例: 

将宿主机文件目录 /opt/common/docker/volumes/my_vol2 挂载到容器的 /data/docker/volume/my_vol 目录

docker run -itd --name=vol2_ubuntu -v /opt/common/docker/volumes/my_vol2:/data/docker/volume/my_vol ubuntu /bin/bash

注:宿主机的文件目录必须为绝对路径。

4.1.3 根据宿主机文件绝对路径进行挂载

docker run -itd -v VOLUME_NAME:CONTAINER-DIR IMAGE [COMMAND] [ARG...]

示例:

将宿主机文件 ~/.bash_history 挂载到容器的 /.bash_history

docker run -itd --name=vol3_ubuntu -v ~/.bash_history:/.bash_history ubuntu /bin/bash

4.1.4 挂载匿名卷

-v 参数如果不加任何宿主机相关卷信息docker将创建一个匿名卷进行挂载

docker run -itd -v CONTAINER-DIR IMAGE [COMMAND] [ARG...]

示例:

挂载匿名卷到容器的 /data/docker/volume/my_vol 目录

docker run -itd --name=vol4_ubuntu -v /data/docker/volume/my_vol ubuntu /bin/bash

4.1.5 -v综合运行示例如下:

docker run -itd --name=vol_ubuntu \
-v my_vol:/data/docker/volume/my_vol1:ro \
-v /opt/common/docker/volumes/my_vol2:/data/docker/volume/my_vol2:rw \
-v /opt/common/docker/volumes/my_vol3.txt:/data/docker/volume/my_vol3.txt \
-v /data/docker/volume/my_vol4 \
ubuntu /bin/bash

docker容器与宿主机的数据交互-LMLPHP

4.2 --mount 使用详述

对于--moun选项,目前Docker提供了三种不同类型的数据卷从宿主机挂载到容器中:

(1)volume:普通数据卷(默认即这种类型),Docker管理宿主机文件系统的一部分,默认位于 /var/lib/docker/volumes 目录中;

(2)bind mount:绑定数据卷,意为着可以存储在宿主机系统的任意位置;

*注意:Dockerfile 中不支持这种用法,这是因为 Dockerfile 是为了移植和分享用的。然而,不同操作系统的路径格式不一样,所以目前还不能支持。

(3)tmpfs:临时数据卷,挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统;

三种方式的示意图如下所示:

 docker容器与宿主机的数据交互-LMLPHP

4.3 -v与-mount的区别

  -mount可以支持创建集群服务的数据卷,而-v不行。

4.4 补充说明

(1)Docker 挂载数据卷的默认权限是读写,用户也可以通过 :ro 指定为只读。

(2)(--mount基本包含了--volume的可选属性内容)官方建议使用--mount的方式,原文如下:

   Even though there is no plan to deprecate --volume, usage of --mount is recommended.

 方式三、Docker数据卷容器

  数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载,如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。

数据卷数据备份

 

 声明:博文内容纯属个人理解,有异议请点评

11-08 17:11