Skip to content

Docker 数据挂载模式

Docker 提供了三种方式将数据从宿主机挂载到 Docker 容器中:volumes、bind mounts、tmpfs。

Volumes 是在宿主机文件系统的一个路径,默认情况下统一的父路径是 /var/lib/docker/volumes/,非 Docker 进程不能修改这个路径下面的文件,所以说 Volumes 是容器数据持久存储数据最安全的一种方式。

Bind mounts 可以将文件存储在**宿主机文件系统的任何路径**,所以非 Docker 进程也可以对其进行修改,存在潜在的安全风险。

Tmpfs 只存储在宿主机的内存中,不会写入到宿主机文件系统中,不会持久化存储。

一. Tmpfs

Tmpfs 挂载是临时的,只存留在容器宿主机的内存中,当容器停止时,Tmpfs 挂载文件路径将被删除,写入的文件不会被持久化。

1
2
3
4
$ docker run -d \
 -p 8888:8888 \
 --tmpfs /tmp \
 --name spboot docker-test:v1

PS:SpringBoot 项目启动之后会在 /tmp 目录下面解压出 tomcat 容器,提供 web 服务,所以将 /tmp 目录使用 tmpfs 方式挂载到宿主机的内存中,也会提升 SpringBoot 项目的运行效率

二. Bind mounts

Bind Mounts 挂载数据卷的方式也是最常见的一种方式,比如使用 -v 参数绑定数据卷,例如:其中 /root/nginx/html 是我们任意指定的一个宿主机磁盘文件目录,这种情况就是 Bind Mounts 方式挂载数据卷

-v /root/nginx/html:/usr/share/nginx/html

除了使用 -v 参数绑定的方式,还可以使用 --mount 参数绑定的方式实现 Bind mounts 数据卷挂载。

$ docker run -d --name bind-mount-nginx \
 -p 80:80 \
 --mount type=bind,source=/root/nginx/html,target=/usr/share/nginx,readonly \
 nginx:latest

# 另docker-compose.yml示例参考
version: '3.3'
services:
  komga:
    image: gotson/komga
    container_name: komga
    volumes:
      - type: bind
        source: /etc/timezone #alternatively you can use a TZ environment variable, like TZ=Europe/London
        target: /etc/timezone
        read_only: true

--mount 以键值对的方式传参,比 -v 提供了更多的选项

  • type=bind 表示以 Bind Mounts 方式挂载数据卷
  • source=/root/nginx/html 表示宿主机的文件路径
  • target=/usr/share/nginx/html 表示容器的文件路径,宿主机 source 文件路径挂载到容器的 target 路径
  • readonly 配置参数,表示文件路径采用只读的方式挂载