docker $PWD路径_Docker读书笔记-3.7卷

读书笔记:《Docker 容器与容器云 第二版》

0x00 创建卷

  • 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 中使用,可以使用相对路径

0x01 挂载卷

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

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)方法二

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

0x02 Dockerfile VOLUME

使用Dockerfile的 VOLUME

VOLUME /data

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

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

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

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

0x03 共享卷

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

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

0x04 删除卷

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

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

0x05 备份、恢复与迁移

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

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

0x06 卷的原理

卷的本质属于挂载

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

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

0x07 docker-compose中的卷

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

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)
    • 和卷的更新有关

0x00 创建卷

  • 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 中使用,可以使用相对路径

0x01 挂载卷

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

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)方法二

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

0x02 Dockerfile VOLUME

使用Dockerfile的 VOLUME

VOLUME /data

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

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

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

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

0x03 共享卷

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

0x04 删除卷

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

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

0x05 备份、恢复与迁移

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

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

0x06 卷的原理

卷的本质属于挂载

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

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

0x07 docker-compose中的卷

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

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)

  • 和卷的更新有关

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
  • 如果设置为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指定外部卷的名称volumes: data: external: name: actual-name-of-volume
  • name (3.4以上)
  • 卷的名称version: "3.7" volumes: data: name: my-app-data
  • lables 元数据
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值