Write by lyc at 2019-8-20

docker 数据卷与挂载的三种方式

docker 提供三种方式将数据从宿主机挂载到容器中:

  1. volumes volumes数据卷,管理宿主机文件系统的一部分/var/lib/docker/volumes
  2. bind mounts 绑定挂载,将宿主机上的任意位置的文件或者目录挂载到容器中。
  3. tmpfs 挂载存储在主机系统的内存中,而不会写入主机的文件系统。如果不希望将数据持久存储在任何位置,可以使用tmpfs,同时避免写入容器可写层提高性能。

1.volumes 数据卷

  • 数据卷是被设计用来持久化数据的,它的生命周期独立于容器,Docker不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷。
  • 如果需要在删除容器的同时移除数据卷。 可以在删除容器的时候使用 docker rm -v 这个命令

管理数据卷

创建的数据卷默认存储在宿主机 /var/lib/docker/volumes/[volume_name]

1
2
3
4
5
6
7
$ docker volume create nginx-vol      # 创建数据卷
$ docker volume ls # 查看所有数据卷
$ docker volume inspect nginx-vol # 查看某个数据卷的详细信息

$ docker container stop 49283d6c8416 # 先停止容器
$ docker volume rm nginx-vol # 删除某个数据卷
$ docker volume prune # 删除所有数据卷

创建容器 挂载数据卷

  • 如果没有指定数据卷,会自动创建
  • 建议使用 --mount
1
2
3
4
5
# --mount src=数据卷,dst=容器内目录
$ docker container run -itd --name web01 -p 8081:80 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx

# -v 数据卷:容器内目录
$ docker container run -itd --name web02 -p 8082:80 -v nginx-vol:/usr/share/nginx/html nginx

2.bind mounts 挂载设备(常用)

  • 如果源文件/目录不存在,不会自动创建,会抛出一个错误
  • 如果挂载目标在容器中非空目录,则该目录现有内容将被隐藏

bind mounts 创建容器

以前使用 -v 参数时如果本地目录不存在 Docker 会自动为你创建一个文件夹, 现在使用 --mount 参数时如果本地目录不存在,Docker 会报错。

1
2
3
4
5
6
7
8
9
10
# --mount type=bind,src=宿主机目录,dst=容器目录
$ docker container run -d \
-it \
--name=web01 \
-p 8081:80 \
--mount type=bind,src=/data/wwwroot/www.test.com/webroot,dst=/usr/share/nginx/html \
nginx

# -v 宿主机目录:容器目录
$ docker container run -d -it --name=web02 -p 8082:80 -v /data/wwwroot/www.test.com/webroot:/usr/share/nginx/html nginx

验证绑定挂载

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查看容器的详细信息
$ docker container inspect web01
....
"Mounts": [
{
"Type": "bind",
"Source": "/data/wwwroot/www.test.com/webroot",
"Destination": "/usr/share/nginx/html",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
....