从零开始学docker(二)

  1. 存储
    1. copy-on-write
    2. 存储卷Volumes
    3. bind绑定
      1. bind propagation 绑定传递
    4. tmpfs
    5. 常用命令

存储

docker存储使用分层架构,如图所示,容器由最上面的可写层和容器层构成,每个容器启动后会产生不同的文件,这些文件全部在可写层上,各个容器之间各不相干,当容器被删除,文件也会被删除。启动的多个容器之间会使用相同的镜像,并各自产生不同的数据存在各自的可写层。所以镜像层可以共享打包进镜像的数据。

sharing-layers.png

copy-on-write

写复制也是docker文件系统中重要的组成部分, 比如当容器需要访问目录1时 读取文件1 对于文件1中的就是最新的则直接读取之前层中的文件1 当需要写操作时 比如要修改文件2 则先将文件2复制到可写层,对文件进行写操作之后,后续读取则取最新的文件2。

copy-on-write.png

挂载存储的方式共分为3中
1.bind 绑定宿主机任意位置挂载点
2.Volumes 由docker管理的宿主机上的文件系统路径为/var/lib/docker/volumes/非docker进程不应修改该部分文件
3.tmpfs 使用系统内存进行存储临时文件系统 不会写入宿主机文件系统。

types-of-mounts-volume.png

存储卷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.

常用命令