网站首页 > 精选教程 正文
概览
一篇带你了解Docker数据存储管理,讲解了docker的几种存储类型,今天来详细了解下Volume与Bind mounts使用。docker 是优先使用volume作为持久化数据的机制,和 bind mounts不同的,volume是完全由 docker管理的,和bind mounts相比有以下的几个好处:
- 比 bind mounts 更容易备份、迁移
- 可以通过 Docker CLI 与 Docker API管理volume
- volume 可以在 linux 与 windows上运行
- 多容器间共享数据,volume 可以更安全
- volume 驱动可以支持远程主机或是云提供,如nfs , NAS
除了上面的内容,volume也不与docker容器的生命周期挂钩,是独立存在的。
Volume 默认是使用 vprivate 的传播方式,即递归目录所有的
挂载
-v 与 --mount
--mount相对来说会比较繁琐(docker 1.17开始支持)。-v 与 --mount最大的不同点就是,-v 语法将所有的选项都集中一个字段,而 --mount 是将它们分开了。
如果需要指定 volume driver 选项,是必须使用 --mount
- -v 或是 --volume 包含3个字段,顺序要完全正确,通过冒号(:) 分开
- 对于有命名的volume,第一个是volume的名称,这个名称在当前docker主机上是唯一的,如果是匿名的volume,这个字段可以省略,如果是bind mount类型的,这个字段是主机的目录或文件的路径
- 第二个字段是容器里的文件或是目录路径
- 第三个字段是可选,是对挂载的目录或文件的权限,如ro
- --mount 语法相对于 -v 会比较复杂,当在docker service 使用volume时,只能使用 --mount,由多个 key-value键值对组成,以逗号(,)隔开,键值的顺序没有关系
- type 可以指定 bind,volume,tmpfs
- source 对于命名的volume , 值是 volume的名称,如果是匿名的volume,这个字段可以忽略。可以简写为 src
- destination 指定为容器里的文件或是目录,可以指定别名为 dst 或是 target
- readonly 可选,如果指定了,则会使挂载的权限为 只读,可以简写为 ro
- volume-opt 可选,可以指定多次,如 volume-opt=a=xxx
创建与管理volume
- 创建volume
[root@localhost ~]# docker volume create my-vol
- 查看volume
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local my-vol
- 查看元数据
[root@localhost volumes]# docker volume inspect my-vol
[
{
"Driver": "local",
"Labels": {},
// 挂载的目录
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]
- 删除volume
[root@localhost volumes]# docker volume rm my-vol
容器挂载volume
重新创建 volume ,命名为 my-vol
- -v 形式
[root@localhost volumes]# docker run -d --name nginx -v my-vol:/app nginx
- --mount 形式
[root@localhost volumes]# docker run -d --name nginx --mount source=my-vol,target=/app nginx
- 在对应的 my-vol 里增加一个文件 1.html (/var/lib/docker/volumes/my-vol/_data) ,在容器里也可以看到这个文件
[root@localhost _data]# touch 1.html
[root@localhost _data]# docker exec -it nginx /bin/bash
root@3fcb3b3d8707:/# cd /app/
root@3fcb3b3d8707:/app# ls
1.html
- docker-compose 使用 volume,会创建一个vol2的volume
version: "3"
services:
nginx:
image: nginx
volumes:
- vol2:/app
volumes:
vol2:
- 使用一个已经创建的volume
version: "3"
services:
nginx:
image: nginx
volumes:
- vol2:/opt/app
volumes:
vol2:
external: true
- 挂载一个容器里的目录,本身已经存储文件,则会将文件复制到对应的volume中,在删除对应的容器后,这个文件依旧存在
docker run -d --name nginxtest --mount source=nginx-vol,target=/usr/share/nginx/html nginx
- 设置只读volume
docker run -d --name nginxtest --mount source=nginx-vol,target=/usr/share/nginx/html,readonly nginx
"Mounts": [
{
"Type": "volume",
"Name": "nginx-vol",
"Source": "/var/lib/docker/volumes/nginx-vol/_data",
"Destination": "/usr/share/nginx/html",
"Driver": "local",
"Mode": "z",
"RW": false, # 读写为false
"Propagation": ""
}
],
容器挂载目录或是文件
- 挂载目录
# --mount的方式,/opt/app1的目录一定要存在,否则会报错
docker run -d --mount type=bind,src=/opt/app1,target=/usr/share/nginx/html --name nginxtest nginx
# /opt/app1不存在,会在本地创建,不会报错,观察目前下的内容,也不会复制到主机目录下,在容器里也不能看到原来的文件,会被掩盖,这一点是和volume不同的
docker run -d -v /opt/app1:/usr/share/nginx/html --name nginxtest nginx
- docker-compose 挂载目录或是文件
version: "3"
services:
nginx2:
image: nginx
# /opt/app2 也会自动创建,但不会从容器复制出来,容器已存在的文件会被隐藏
volumes:
- /opt/app2:/usr/share/nginx/html
volumes:
nginx_vol2:
总结
- --mount 操作是在 docker 1.17 之后才有参数。
- --mount 参数指定的目录要提前创建。
- -v 指定的目录如果不存在,会创建,同时如果挂载的是容器非空的目录,容器里的内容会被隐藏。
- 通过创建 volume的方式,如果是挂载的非空的容器目录,容器里的文件会被复制到创建的volume中。
猜你喜欢
- 2024-10-21 php宝塔搭建实战laravel源码OneDrive多网盘挂载程序
- 2024-10-21 Docker下安装超常用的nginx容器(alpine版)
- 2024-10-21 Docker提交镜像-数据卷-可视化 docker镜像的导入和导出
- 2024-10-21 Nginx 集群负载均衡器 nginx负载均衡策略配置 实例
- 2024-10-21 Nginx-Docker镜像配置详解 docker中的nginx镜像运行后的主要功能是什么
- 2024-10-21 玩转 Linux 之:磁盘分区、挂载知多少?
- 2024-10-21 如何优化一个秒杀项目? 秒杀的实现方案
- 2024-10-21 Docker 学习笔记4 Nginx Php Tomcat Redis Mysql等常用工具
- 2024-10-21 Linux 下挂载新硬盘方法 linux 如何挂载硬盘
- 2024-10-21 轻松掌握Docker数据卷、直接挂载目录到容器镜像
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)