《docker 容器与容器云第二版》& 官方文档读书笔记
Docker卷
Created: Nov 30, 2019 8:44 PM
一 创建卷
docker volume create --name test
用来创建一个卷用户在
docker run
或docker 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 run
或 docker 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
ornpipe
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-levelvolumes
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 optionspropagation
: the propagation mode used for the bind
volume
: configure additional volume optionsnocopy
: flag to disable copying of data from a container when a volume is created
tmpfs
: configure additional tmpfs optionssize
: the size for the tmpfs mount in bytes
consistency
: the consistency requirements of the mount, one ofconsistent
(host and container have identical view),cached
(read cache, host view is authoritative) ordelegated
(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
元数据