存储
docker存储使用分层架构,如图所示,容器由最上面的可写层和容器层构成,每个容器启动后会产生不同的文件,这些文件全部在可写层上,各个容器之间各不相干,当容器被删除,文件也会被删除。启动的多个容器之间会使用相同的镜像,并各自产生不同的数据存在各自的可写层。所以镜像层可以共享打包进镜像的数据。
copy-on-write
写复制也是docker文件系统中重要的组成部分, 比如当容器需要访问目录1时 读取文件1 对于文件1中的就是最新的则直接读取之前层中的文件1 当需要写操作时 比如要修改文件2 则先将文件2复制到可写层,对文件进行写操作之后,后续读取则取最新的文件2。
挂载存储的方式共分为3中
1.bind 绑定宿主机任意位置挂载点
2.Volumes 由docker管理的宿主机上的文件系统路径为/var/lib/docker/volumes/非docker进程不应修改该部分文件
3.tmpfs 使用系统内存进行存储临时文件系统 不会写入宿主机文件系统。
存储卷Volumes
# -v参数
# optional 可以多个逗号分割 例如 ro,rw
-v [本地地址/存储卷]:[容器地址]:[optional]
eg:
docker container run -v myvo2:/home:rw nginx:latest
# --mount参数
# type volume
# source/src 指定本地目录/网络位置/存储卷名
# destination/dst/target 指定容器内目标位置
# readonly/ro 指定容器对该文件只读
# volume-opt 指定更多设置
eg:
docker container run --mount 'type=volume,src=myvo2,target=/home,readonly' nginx:latest
# 创建一个存储卷
docker volume create --label author=zzt myvo2
# 查看
docker volume inspect myvo2
[
{
"CreatedAt": "2023-01-10T10:31:50+08:00",
"Driver": "local",
"Labels": {
"author": "zzt"
},
"Mountpoint": "/var/lib/docker/volumes/myvo2/_data",
"Name": "myvo2",
"Options": {},
"Scope": "local"
}
]
docker volume rm myvo1
# 可指定具体的标签
#干掉 标签有 author
docker volume prune --filter "label=author"
#干掉 标签有 author 且等于zzt的
docker volume prune --filter "label=author=zzt"
bind绑定
# -v参数
# optional 可以多个逗号分割 例如 ro,rw
-v [本地地址/存储卷]:[容器地址]:[optional]
eg:
docker container run -v /home/docker:/home:rw nginx:latest
# --mount参数
# type bind
# source/src 指定本地目录/网络位置/存储卷名
# destination/dst/target 指定容器内目标位置
# readonly/ro 指定容器对该文件只读
# bind-propagation rprivate, private, rshared, shared, rslave, slave
eg:
docker container run --mount 'type=bind,src=/home/docker,target=/home,readonly' nginx:latest
bind propagation 绑定传递
Propagation setting | 描述 |
---|---|
rprivate | 默认值 和 private 相同 |
shared | 原挂载点上的所有子挂载点对于副本挂载点可见 副本挂载点中的所有子挂载点对于原挂载点也可见 |
slave | 原挂载点中的所有子挂载点对于副本挂载点可见 反之不行。 |
private | 原挂载点和副本挂载点的子挂载点只对自己可见 |
rshared | 在shared的基础上也支持嵌套的挂载点 |
rslave | 在slave基础上也支持嵌套的挂载点 |
tmpfs
# --tmpfs参数
eg:
docker container run --tmpfs /tmp1 nginx:latest
# --mount参数
# type tmpfs
# destination/dst/target 指定容器内目标位置
# tmpfs-size 临时文件大小限制,默认无限制
# tmpfs-mode 临时文件模式 700 可读写运行 or 0770. Defaults 1777可写
eg:
docker container run --mount 'type=tmpfs,target=/target' nginx:latest
区别:-v指定的宿主机地址总是会自动创建
–mount指定的宿主机地址如果不存在则会发生错误
eg:
docker container run –rm –mount ‘type=bind,src=/home/docker1,target=/home,readonly’ nginx:latest
docker: Error response from daemon: invalid mount config for type “bind”: bind source path does not exist: /home/docker1.