数据卷

默认情况下,容器被删除,容器中数据也会随着一起删除。这对于某些重要的数据是绝对不允许的。此时就需要对数据进行持久化。
数据卷是一个可以提供给一个或者多个容器使用的特殊目录,它绕过 UFS,能提供以下特性:

  • 多个容器可以共享和重用。
  • 对数据卷的修改会马上生效。
  • 对数据卷的更新不会影响镜像。
  • 数据卷会一直存在,即使删除容器。

常用的数据卷操作命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建一个数据卷
docker volume create demo_volume

# 查看数据卷
docker volume ls

# 查看数据卷详情
docker volume inspect demo_volume

# 删除数据卷
docker volume rm demo_volume

# 删除没用的数据卷
docker volume prune

如图所示:

启动一个挂载了数据卷的容器:

1
docker container run -d --mount source=demo02_volume,target=/usr/share/nginx/html --name demo02 nginx

如图所示 :

配置说明:

  • --mount:用于标记挂载数据卷到容器中,可以有多个。
  • source:指定数据卷,如果数据卷不存在,则会自动创建。
  • target:指定容器内挂载的目录。

查看容器相关信息:

1
docker container inspect demo02

其中挂载部分内容如下

数据卷是用来持久化容器数据的,它的生命周期独立于容器之外。

如果在删除容器的时候想要一并删除存储卷的话,只需要docker container rm -v即可。

挂载主机目录和文件

使用--mount参数除了能够挂载数据卷,还能挂载本机的目录到容器中。

1
docker run -d --mount type=bind,source=/tmp,target=/usr/share/nginx/html,readonly --name demo03 nginx

需要注意:

  • 默认情况下,--mount挂载的数据卷volume,如果需要挂载目录,需要指定type=bind
  • source 在 bind 挂载中必须事先存在。
  • 在挂载最后可以加上readonly,标识容器对该目录只读。

此时进入容器测试:

1
docker container exec -it demo03 /bin/bash

可以发现,文件是宿主机的 /tmp 下面的文件,并且只读无法创建文件。

当然,也可以单独只挂载某个文件,但是前提是这个文件事先得存在:

1
docker container run -d --mount type=bind,source=/tmp/1.txt,target=/root/.bash_history --name demo04 nginx

历史命令就能被记录到本地。

其它挂载方式

除了--mount以外,还有-v--volume的方式挂载数据卷,使用方法类似。示例:

1
2
3
4
5
6
7
8
9
10
11
# 挂载目录并只读
docker container run -d -v /tmp:/usr/share/nginx/html:ro --name demo05 nginx

# 挂载文件
docker container run -d -v /tmp/1.txt:/root/.bash_history --name demo08 nginx

# 挂载一个随机生成的数据卷到指定目录
docker container run -d -v /usr/share/nginx/html --name demo06 nginx

# 挂载一个已经存在的数据卷到指定目录
docker container run -d -v demo02_volume:/usr/share/nginx/html --name demo07 nginx

使用方法类似,而且在Dockerfile中的VOLUME指令就能定义。