Skip to content

容器数据卷挂载

背景:容器删除后,容器内产生的数据丢失. 数据卷就是为数据同步诞生的.【同步备份

主要命令:-v

指定路径(绑定挂载)

作用:将宿主机上的某个目录或文件直接映射到容器中的 /xx 目录. 宿主机的目录会覆盖掉创建容器时里面的目录, 使其完全映射为宿主机的指定目录

命令:docker run -it -v 宿主机目录:容器内目录 IMAGES-ID

举例:docker run -it -p 9001:80 -v /docker-volume:/usr/share/nginx/html centos

TIP

  1. 在宿主机/docker-volume目录中的文件会被同步备份到docker容器的/usr/share/nginx/html中,反之亦然.
  1. 与容器运行状态无关
  1. 占用双倍存储空间

具名挂载(Docker卷)

创建卷:docker volume create 卷名

命令:docker run -it -v 卷名:容器内目录 IMAGES-ID

bash
# 除非卷已经有数据,否则初次挂载时容器内的 /usr/share/nginx/html 目录会自动复制到卷中
# 一旦卷包含数据,后续容器挂载该卷时将看到卷中的数据,而非容器镜像中原始的 /usr/share/nginx/html 目录内容,创建的容器中的目录将会被移除而使用数据卷中的数据
docker run -it -p 9001:80 -v volume-name:/usr/share/nginx/html centos

匿名挂载

  • 不指定宿主机目录, 在/var/lib/docker/volumes目录下创建一个目录来绑定匿名卷.

命令:docker run -it -v 容器内目录 IMAGES-ID 【不推荐使用

举例:docker run -it -p 9002:80 -v /usr/share/nginx/html centos

查看挂载目录信息

docker inspect CONTAINER-ID

js
// 指定路径挂载的
"Mounts": [
  {
    "Type": "bind",
    "Source": "/docker-volume",  // 宿主机目录
    "Destination": "/usr/share/nginx/html", // 容器内目录
    "Mode": "",
    "RW": true,
    "Propagation": "rprivate"
  }
]
// 具名挂载的
"Mounts": [
  {
    "Type": "volume",
    "Name": "volume-name",
    "Source": "/var/lib/docker/volumes/volume-name/_data",
    "Destination": "/usr/share/nginx/html",
    "Driver": "local",
    "Mode": "z",
    "RW": true,
    "Propagation": ""
  }
]
// 匿名挂载的
"Mounts": [
  {
    "Type": "volume",
    "Name": "4715fd6bf4897b9fa95ff69777fc74393ddc8d4fc946fe7a5ca9b7fae46824ca",
    "Source": "/var/lib/docker/volumes/4715fd6bf4897b9fa95ff69777fc74393ddc8d4fc946fe7a5ca9b7fae46824ca/_data", // 默认目录
    "Destination": "/usr/share/nginx/html",
    "Driver": "local",
    "Mode": "",
    "RW": true,
    "Propagation": ""
  }
]

Dockerfile指定卷

只能指定匿名挂载

docker
# 匿名挂载两个目录
VOLUME ["/etc/nginx/nginx.conf", "/usr/share/nginx/html"]