0%

Docker卷

《docker 容器与容器云第二版》& 官方文档读书笔记

Docker卷

Created: Nov 30, 2019 8:44 PM

一 创建卷

  • docker volume create --name test 用来创建一个卷

  • 用户在 docker rundocker create 创建容器时,也可以使用 -v 为容器添加卷

    • 以下命令随机创建一个卷

      docker run -d -v /data busybox /bin/bash

    • 以下命令创建一个指定名字的卷

      docker run -d -v test:/data busybox /bin/bash

      docker 会在宿主机的 /var/lib/docker/volume/ 中创建一个以 volume ID (上面的 test )为名的目录,并将内容存储在 _data 中。

在docker run使用 -v 的时候,必须给出绝对路劲,否则会在 /bar/lib/docker/volumes/ 下创建

而在 docker-compose.yml 中使用,可以使用相对路径

二 挂载卷

用户在 docker rundocker create 创建容器时,也可以使用 -v 为容器添加卷,用户可以将自行创建或者由docker创建的volume挂载到容器中,也可以将宿主机上的目录或者文件作为volume挂载到容器中。

2.1 方法一

  • 先创建,再挂载

    docker volume create --name test (可省略)

    docker run -d -v test:/data busybox /bin/bash

  • 用户可以使用如下命令创建一个随机ID的volume。

    docker run -d -v /data busybox /bin/bash

2.2 方法二

docker 也允许我们挂载宿主机的目录到容器中

  • 必须使用绝对路径。
  • 如果宿主机不存在,则创建空
  • 如果镜像中原有文件夹存在,则原有的内容被隐藏,保持和宿主机相同
  • 可以挂载单个文件,如果宿主机中文件不存在,则创建一个目录,如果容器一开始存在这个文件,会被隐藏。
  • 将主机或者文件夹作为volume挂载时
    • 可以使用 :ro 来设置只读
    • :Z 标记为私有,不可共享,默认为 :z 可共享
  • 使用多个 -v 挂载多个

三 Dockerfile VOLUME

使用Dockerfile的 VOLUME

VOLUME /data

在使用 docker build时生成镜像,并启动容器时,会挂载一个 volume 到 /data如果镜像中存在 /data 这个文件夹,这个文件夹的内容将全部被复制到宿主机对应的文件夹中。

VOLUME ["/data1","/data2"]

-v 不同的是,VOLUME指令不能挂载 主机中指定的文件夹。这是为了保证docker的可移植性。

需注意,在Dockerfile中使用VOLUME,Dockerfile后的操作这个volume的代码不会生效。这是因为docker每一层的 commit机制,后面的commit后没有保存。

四 共享卷

docker run --rm -it --name vol_use --volumes-from vol_simple ubuntu /bin/bash

  • 新创建的容器,与之前创建的容器 vol_simple 会共享卷,如果被共享的容器有多个卷,那新容器也又多个,并且挂载的目的目录页相同。
  • 可以使用多个 --volumes-from 共享多个容器的卷。
  • 一个容器挂载了一个volume,即使它停止运行了,该volume仍然存在,其他容器也可以使用 --volume-fom 与这个容器共享volume。如果有一些数据,如配置文件、数据文件,要在多个荣期间共享,一张常见的作法是创建一个数据容器,其他的容器与之共享volume。

五 删除卷

rm 容器时,不会删除卷对应的目录,有以下删除方法:

  • docker volume rm <volume_name>
    • 只会删除没有在使用的
  • docker rm -v <container_name>
    • 只删除未命名的
  • docker run --rm ...
    • 只删除未命名的

六 备份、恢复与迁移

通过复制粘贴可行,但是不推荐。推荐如下:

docker cun --rm --volumes-from vol_simple -v $(pwd):/backup ubuntu tar cvf /backup/data.tar /data

七 卷的原理

卷的本质属于挂载

docker run -v /data busybox /bin/bash 相当于如下代码:

mount("/var/lib/docker/volumes/volume_id/_data","rootfs/root","none",...)

八 docker-compose中的卷

在docker-compose中,卷的设置规则和docker run相同.

8.1 services下的volumes

短语法

Relative paths should always begin with . or ..

volumes:
  # Just specify a path and let the Engine create a volume 
    # 类似于 Dockerfile 中的 VOLUME
  - /var/lib/mysql

  # Specify an absolute path mapping
  # 指定一个绝对路径
  - /opt/data:/var/lib/mysql

  # Path on the host, relative to the Compose file
    # 可以使用相对路径挂载文件,这点与docker run不同。
  - ./cache:/tmp/cache

  # User-relative path
  - ~/configs:/etc/configs/:ro

  # Named volume
    # 挂载一个命名卷
  - datavolume:/var/lib/mysql

长语法

  • type: 挂载的类型 volume, bind, tmpfs or npipe
  • source: the source of the mount, a path on the host for a bind mount, or the name of a volume defined in the top-level volumes key. Not applicable for a tmpfs mount.
    • 挂载的源,如果type是bind,则提供一个路径
    • 如果type是volume则提供卷名
    • 如果是tmpfs则不提供
  • target: the path in the container where the volume is mounted
    • 容器中的位置
  • read_only: flag to set the volume as read-only
    • 只读
  • bind: configure additional bind options
    • propagation: the propagation mode used for the bind
  • volume: configure additional volume options
    • nocopy: flag to disable copying of data from a container when a volume is created
  • tmpfs: configure additional tmpfs options
    • size: the size for the tmpfs mount in bytes
  • consistency: the consistency requirements of the mount, one of consistent (host and container have identical view), cached (read cache, host view is authoritative) or delegated (read-write cache, container’s view is authoritative)
    • 和卷的更新有关

8.2 top-level的卷

在docker-compose中声明一个卷

version: "3.7"

services:
  db:
    image: db
    volumes:
      - data-volume:/var/lib/db
  backup:
    image: backup-service
    volumes:
      - data-volume:/var/lib/backup/data

volumes:
  data-volume:

当声明的卷参数为空时,使用默认参数

https://docs.docker.com/compose/compose-file/#volume-configuration-reference

参数

driver

卷的驱动

driver_opts

传入到驱动的变量

external

通过name指定外部卷的名称

volumes:
  data:
    external:
      name: actual-name-of-volume

如果设置为true,则指定此卷是在Compose之外创建的。 docker-compose up不会尝试创建它,如果不存在,则会引发错误。

version: "3.7"

services:
  db:
    image: postgres
    volumes:
      - data:/var/lib/postgresql/data

volumes:
  data:
    external: true

在下面的示例中,Compose不会尝试创建名为[projectname] _data的卷,而是查找一个简单的名为data的现有卷,并将其装入db服务的容器中。

name (3.4以上)

卷的名称

version: "3.7"
volumes:
  data:
    name: my-app-data

lables

元数据