目录
2. 使用 docker volume ls 命令查看卷信息
3. 使用 docker volume inspect 命令查看卷挂载信息
4. 使用 docker inspect 命令查看容器中的 Mounts 信息
6. 在宿主机上更新 volume 内容,发现容器上也同时更新了
7. 销毁容器后,volume 依旧存在,其数据可持久化保存
1. bind mount 是将宿主机上已有的目录或文件mount 到容器中
2. 将 /root/htdocs 目录下的 index.html 文件挂载给一个 httpd 容器
3. 分别查看宿主机和容器中的 index.html 文件,发现两者的内容是一样的
1. 启动两个 httpd 容器,分别命名为 h1 和 h2,并同时挂载 /root/htdocs 目录
3. 在宿主机上更新 index.html 内容后,再次查看容器 index.html 文件内容,已同步更新
3. 使用 docker inspect 命令查看 vc、h3、h4 容器的挂载信息,三者的卷的挂载是一致的
4. 更新 bind mount 中的数据,并访问 h3 和 h4 验证数据共享
1. Storage driver:管理镜像层和容器层
① Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图
② 所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略
③ docker info 命令可查看当系统上的 storage driver
Storage Driver 类型 功能 overlay2 所有当前 Linux 发行版,都支持的首选存储驱动程序 AUFS 仅在 ubuntu 和 Debian 上支持 Device Mapper CentOS 和 RHEL 的推荐存储驱动程序。但当前版本的 CentOS 和 RHEL 现在都支持overlay2 Btrfs 仅在S LES 上支持 ZFS 仅支持ubuntu 14.04 或更高版本 VFS 主要用于测试目的,不建议用于生成环境
参考资料: Docker storage drivers | Docker Documentation
1. 使用 docker info 可查看当前系统使用的 Storage driver
1. Docker 容器中持久化数据一般采用两种存储方式:
1. volume 由 Docker 管理,是将特定目录挂载给容器
① docker 会在指定路径下为每个 volume 生成一个目录,作为 mount 源
· 路径: /var/lib/docker/volumes (若路径不存在会自动创建)
② 可通过 -v 将 volume 挂载给一个容器(只要有-v就是持久存储)
· -v格式:
:path> : ( 若路径不存在会自动创建)
注:若不使用-v选项,数据是在内存中,数据不会持久保存
- # docker run -d -p 8080:80 -v /usr/local/apache2/htdocs httpd #使用容器中的目录作为卷
- '容器中的目录 /usr/local/apache2/htdocs 挂载到本地
- 方法1:目录可以通过https://hub.docker.com/ 查看对应镜像查看详细信息
- 方法2:可以先运行起来,进入容器通过查看配置文件,过滤^DocumentRoot就是需要的目录'
- # docker volume ls
- DRIVER VOLUME NAME
- local cac2081115360ff43ce5c2c8db0ca1666acb707182dd81d77e0dfd9ffae3b523
自动生成了一个带有volume name 的文件夹作为 mount 源
- # docker volume ls
- DRIVER VOLUME NAME
- local cac2081115360ff43ce5c2c8db0ca1666acb707182dd81d77e0dfd9ffae3b523
- root@k8s-master:~# docker volume inspect cac2081115360ff43ce5c2c8db0ca1666acb707182dd81d77e0dfd9ffae3b523
- [
- {
- "CreatedAt": "2022-10-27T00:40:34Z",
- "Driver": "local",
- "Labels": null,
- "Mountpoint": "/var/lib/docker/volumes/cac2081115360ff43ce5c2c8db0ca1666acb707182dd81d77e0dfd9ffae3b523/_data", #此目录为宿主机实际目录
- "Name": "cac2081115360ff43ce5c2c8db0ca1666acb707182dd81d77e0dfd9ffae3b523",
- "Options": null,
- "Scope": "local"
- }
- ]
注意 Type 字段的值是 volume
# docker inspect 11603a249d4a| grep -wA 11 "Mounts" "Mounts": [ { "Type": "volume", "Name": "cac2081115360ff43ce5c2c8db0ca1666acb707182dd81d77e0dfd9ffae3b523", "Source": "/var/lib/docker/volumes/cac2081115360ff43ce5c2c8db0ca1666acb707182dd81d77e0dfd9ffae3b523/_data", "Destination": "/usr/local/apache2/htdocs", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ],
容器中的数据被 copy 到了 volume 中
'查看容器中的内容' # docker exec -it 11603a249d4a cat /usr/local/apache2/htdocs/index.htmlIt works!
'查看volume中的内容' # cat /var/lib/docker/volumes/cac2081115360ff43ce5c2c8db0ca1666acb707182dd81d77e0dfd9ffae3b523/_data/index.htmlIt works!
- # echo hello-world > /var/lib/docker/volumes/cac2081115360ff43ce5c2c8db0ca1666acb707182dd81d77e0dfd9ffae3b523/_data/index.html
-
- # docker exec -it 11603a249d4a cat /usr/local/apache2/htdocs/index.html
- hello-world
- ~# docker stop 11603a249d4a #停止容器
- 11603a249d4a
- root@k8s-master:~# docker rm 11603a249d4a #删除容器
- 11603a249d4a
-
- # docker volume ls #volume依然存在
- DRIVER VOLUME NAME
- local cac2081115360ff43ce5c2c8db0ca1666acb707182dd81d77e0dfd9ffae3b523
-
- # cat /var/lib/docker/volumes/cac2081115360ff43ce5c2c8db0ca1666acb707182dd81d77e0dfd9ffae3b523/_data/index.html
- hello-world
# docker volume rm 卷名 #若确定volume不在需要,可以手动删除
区别:bind mount: 是在自定义目录挂载
volume: 是在指定路径挂载
- # docker run -d -p 8081:80 -v /root/htdocs:/usr/local/apache2/htdocs/ httpd
- f789db02964cdbbb8848ee7473b5c56e117d5f778fece0d4e5aca242c5a7f2ef
-
- '发现是空的,因为原本没有这个目录,是创建容器时创建出来的'
- # ls /root/htdocs/
- # curl localhost:8081
- "-//W3C//DTD HTML 3.2 Final//EN">
- <head>
-
Index of / -
-
Index of /