JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

细解Docker存储之存储卷与挂载 dockerfile数据卷挂载

wys521 2024-10-21 11:16:24 精选教程 34 ℃ 0 评论

概览

一篇带你了解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个字段,顺序要完全正确,通过冒号(:) 分开
    1. 对于有命名的volume,第一个是volume的名称,这个名称在当前docker主机上是唯一的,如果是匿名的volume,这个字段可以省略,如果是bind mount类型的,这个字段是主机的目录或文件的路径
    2. 第二个字段是容器里的文件或是目录路径
    3. 第三个字段是可选,是对挂载的目录或文件的权限,如ro
  • --mount 语法相对于 -v 会比较复杂,当在docker service 使用volume时,只能使用 --mount,由多个 key-value键值对组成,以逗号(,)隔开,键值的顺序没有关系
    1. type 可以指定 bind,volume,tmpfs
    2. source 对于命名的volume , 值是 volume的名称,如果是匿名的volume,这个字段可以忽略。可以简写为 src
    3. destination 指定为容器里的文件或是目录,可以指定别名为 dst 或是 target
    4. readonly 可选,如果指定了,则会使挂载的权限为 只读,可以简写为 ro
    5. 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:

总结

  1. --mount 操作是在 docker 1.17 之后才有参数。
  2. --mount 参数指定的目录要提前创建。
  3. -v 指定的目录如果不存在,会创建,同时如果挂载的是容器非空的目录,容器里的内容会被隐藏。
  4. 通过创建 volume的方式,如果是挂载的非空的容器目录,容器里的文件会被复制到创建的volume中。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表