速通Docker === 目录挂载 & 卷映射

149 阅读6分钟

速通Docker === 目录挂载 & 卷映射

目录

[TOC]

目录挂载

1. 目录挂载的基本概念

目录挂载是将宿主机上的目录或文件直接映射到容器内的指定路径,从而实现数据的共享和同步。这种方式特别适用于开发和测试环境。

Docker 容器是临时的,容器被删除后,容器内的数据也会随之丢失。通过目录挂载,可以将数据存储在宿主机上,即使容器被删除,数据仍然保留。

2. 挂载命令

这里会自动创建本机目录 语法: -v 本机目录 : 容器内目录

将宿主机的 /host/data 目录挂载到容器内的 /container/data 目录,容器内的数据会持久化到宿主机的 /host/data 目录中。

docker run -v /host/data:/container/data my_image

例如我将Docker容器的Nginx资源目录挂载到宿主机指定目录

使用 -v--mount 参数可以在启动容器时挂载宿主机目录。例如,将宿主机的 /opt/nginx/html 目录挂载到容器的 /usr/share/nginx/html 目录:

 docker run -d -p 80:80 -v /opt/nginx/html:/usr/share/nginx/html nginx:latest
3. 配置Nginx启动页

假设你已经将宿主机的 /opt/nginx/html 目录挂载到容器的 /usr/share/nginx/html 目录,你可以在宿主机的 /opt/nginx/html 目录中创建或修改 index.html 文件,这个文件将作为Nginx的启动页。

例如,创建一个简单的 index.html 文件:

# 进入文件
cd /opt/nginx/html
 
# 写入index.html
echo 1111 > index.html
4. 注意事项
  • 数据覆盖问题 :如果宿主机的挂载目录为空,容器内的对应目录内容会被清空,以宿主机为主

  • 多容器共享 :多个容器可以共享同一个挂载目录,但需要注意数据一致性和权限管理

  • 数据同步 : 容器内改变文件, 宿主机也会改变

 # 进入容器内部
 docker exec -it 8d0e0501e1ba bash
 # 进入文件
 cd /usr/share/nginx/html
 # 追加内容
 echo 3333 >> index.html
 # 退出交互
 exit
 # 插看当前工作目录
 pwd
 # 查看内容已经修改了
 cat index.html

卷映射

区分目录挂载和卷映射,可通过挂载的路径中是否包含 / 或者 ./来判断

在 Docker 中,卷映射(Volume Mounting)是将 Docker 管理的卷(Volume)挂载到容器内的某个路径

Docker会自动创建一个存储位置,即使在容器初始启动的时候就和容器内部的文件保持完全一致。

映射后的配置文件会保持同步,即修改了宿主机映射的配置文件后,容器内部的配置文件也会同步修改

即使删除容器,卷内的数据仍会保存下来。

例如要映射nginx配置文件,启动时可以使用 -v <volume_name>:/etc/nginx 命令

映射的文件统一放在 /var/lib/docker/volumes/ 目录下

# 命令查看所有卷
docker volume ls
 
# 创建一个卷
docker volume create <volume_name>
 
# 查看卷信息
docker volume inspect <volume_name>
1. 创建数据卷

首先,我们需要创建一个Docker数据卷,用于存放Nginx的配置文件。可以使用以下命令创建数据卷:

docker volume create nginx-config
2. 运行Nginx容器并挂载数据卷

接下来,运行Nginx容器,并将创建的数据卷挂载到容器的配置文件目录。使用以下命令:

docker run -d --name my-nginx -p 80:80 -v nginx-config:/etc/nginx nginx

这里, -v nginx-config:/etc/nginx 参数表示将 容器内部 /etc/nginx 目录 挂载到 数据卷 nginx-config 下

3. 查找数据卷的宿主机路径

为了修改配置文件,我们需要找到数据卷在宿主机上的路径。可以使用以下命令查看数据卷的详细信息:

docker volume inspect nginx-config

该命令会输出数据卷的详细信息,包括其在宿主机上的路径。通常,路径会类似于 /var/lib/docker/volumes/nginx-config/_data

[
    {
        "CreatedAt": "2025-01-17T23:45:51+08:00",  // 数据卷创建时间
        "Driver": "local",  // 数据卷驱动类型,这里为本地驱动
        "Labels": null,  // 数据卷的标签信息,这里为空
        "Mountpoint": "/var/lib/docker/volumes/nginx-config/_data",  // 数据卷在宿主机上的挂载点路径
        "Name": "nginx-config",  // 数据卷的名称
        "Options": null,  // 数据卷的配置选项,这里为空
        "Scope": "local"  // 数据卷的作用范围,这里为本地
    }
]

详细解释

  • CreatedAt :表示数据卷创建的时间,格式为ISO 8601标准时间。

  • Driver :表示数据卷的驱动类型。这里使用的是 local 驱动,即数据卷存储在宿主机的本地文件系统中。

  • Labels :用于给数据卷添加标签,方便管理和查询。这里为空,表示没有添加任何标签。

  • Mountpoint :表示数据卷在宿主机上的挂载点路径。你可以在这个路径下找到数据卷中的文件和目录。

  • Name :表示数据卷的名称,这里为 nginx-config

  • Options :用于指定数据卷的配置选项,如权限设置等。这里为空,表示使用默认配置。

  • Scope :表示数据卷的作用范围。这里为 local ,表示数据卷仅在本地宿主机上有效。

4. 修改配置文件

找到数据卷的宿主机路径后,可以直接在该路径下编辑Nginx的配置文件。例如,编辑 nginx.conf 文件:

vi /var/lib/docker/volumes/nginx-config/_data/nginx.conf

在配置文件中,可以进行各种配置,例如设置虚拟主机、反向代理等。编辑完成后,保存并退出。

查看容器内部文件是否同步修改

# 进入容器
docker exec -it 33fb2fd4632e  bash
# 进入文件
cd /etc/nginx
# 查看内容是否修改
cat nginx.conf
# 退出
exit
5. 重启Nginx容器

修改配置文件后,需要重启Nginx容器以使配置生效。可以使用以下命令重启容器:

docker restart my-nginx
6. 验证Nginx是否正常工作

最后,打开浏览器,访问 http://localhost ,如果配置成功,你将看到Nginx的欢迎页面或你自定义的页面。

Docker挂载总结

目录挂载
  • 概念 :将宿主机目录或文件映射到容器内指定路径,实现数据共享和同步,防止容器删除后数据丢失。

  • 命令docker run -v /host/path:/container/path image

  • 特点 :直接操作宿主机文件系统,适用于临时数据共享和开发测试。

卷映射
  • 概念 :将Docker管理的卷挂载到容器内路径,Docker自动创建存储位置,映射文件同步,容器删除后卷数据保留。

  • 命令

  • 查看卷: docker volume ls

  • 创建卷: docker volume create volume_name

  • 查看卷信息: docker volume inspect volume_name

  • 挂载卷: docker run -v volume_name:/container/path image

  • 特点 :通过Docker命令管理,数据存储在Docker管理的卷中,适用于长期数据存储和对数据管理要求较高的场景。

区别
  • 数据存储位置 :目录挂载存储在宿主机指定目录,卷映射存储在Docker管理的卷中。

  • 管理方式 :目录挂载直接操作宿主机文件,卷映射通过Docker命令管理卷。

  • 适用场景 :目录挂载适合临时数据共享和开发测试,卷映射适合长期数据存储和高数据管理要求场景。