跳转至

Docker

Docker 学习资料推荐


Docker 镜像基础概念整理

  • bootfs
  • 包含 bootloader(引导加载程序)和 kernel(内核)。
  • bootfs 主要负责系统的引导过程。
  • 不同 Linux 发行版的 bootfs 基本相同,通常直接使用宿主机的 bootfs。

  • rootfs

  • root 文件系统,包含典型 Linux 系统中的标准目录和文件,如 /dev/proc/bin/etc 等。
  • 不同 Linux 发行版的 rootfs 内容不同,例如 Ubuntu、CentOS 的 rootfs 各自定制化。
  • 所以每个镜像都有独立的linux文件结构

Docker 镜像结构特点

  • Docker 镜像采用分层文件系统(Layered Filesystem)架构。
  • 镜像最底层是 bootfs(通常直接复用宿主机的 bootfs)。
  • 第二层是 rootfs(作为基础镜像 Base Image),包含了操作系统的文件系统。
  • 在 rootfs 之上,可以叠加更多层,用于添加新的软件、配置和应用程序。
  • 镜像复用机制
  • 多个镜像可以共享相同的基础层(比如同一个 rootfs),避免数据冗余。
  • 每一层都是只读的,只有容器运行时才叠加一个可写层(write layer)。

🧱 只读镜像(Read-only Image)

定义:Docker 镜像本身是由多个“只读层”叠加组成的,每一层不可修改。

作用:包含操作系统、软件、依赖、应用代码等内容。

关键点:

多个容器可以基于同一个镜像创建,镜像不会变。

镜像是构建应用的基础模板。

📌 类比:就像一张只读的光盘或备份文件,谁都可以拿来用,但不能修改它本身。

✍️ 可写层(Writable Layer)

  • 定义:当你用镜像启动容器时,Docker 会在镜像顶层加一层可写层。

  • 作用:记录容器运行时的所有文件修改、新建和删除。

  • 生命周期:这个层属于容器本身,容器一删除,这层就没了。

📌 类比:你从“只读光盘”拷一份文件到桌面,然后你可以在桌面随意修改、写入、删除,但不会影响光盘原始内容,这样也保证不同容器不会冲突;容器就像镜像加载到内存的运行态,不同容器又是内存隔离的,但是磁盘上镜像是共用的。

🔁 两者的关系

类型 是否可写 生命周期 举例说明
镜像层 ❌ 不可写 永久(镜像存在就在) 系统文件、App 依赖、基础环境
容器可写层 ✅ 可写 容器销毁即消失 日志、缓存、上传的文件等

🧠 实际操作示例:镜像只读 + 容器可写层

你从 nginx:latest 镜像运行一个容器:

docker run -d --name web nginx:latest

nginx:latest 是只读的镜像;

容器层是可写层

Alt text

📦 Docker 中的数据卷挂载与直接目录挂载

1. 数据卷挂载(Volume Mount)

通过 docker run -v 命令或在 Dockerfile 中使用 VOLUME 指令挂载的数据卷,内容不会被包含在新的镜像中。

  • 数据卷(Volume) 是 Docker 提供的一种持久化存储机制。
  • 特点
  • 用于在容器之间共享数据。
  • 不属于容器镜像的一部分。
  • 当使用 docker commit 创建新镜像时,数据卷中的内容不会被包含。
  • 数据卷默认存储位置
  • /var/lib/docker/volumes/(在 Docker 虚拟机内部)。
  • /var/lib 是 Linux 系统中用于存放系统服务数据的标准路径。

📌 示例

# 创建一个 Nginx 容器并挂载数据卷到容器内的 HTML 目录
docker run --name mn -v html:/usr/share/nginx/html -p 80:80 -d nginx
  • 格式:[数据卷名称]:[容器内部路径]
  • 示例中,将名为 html 的数据卷挂载到了 /usr/share/nginx/html

2. 直接目录挂载(Bind Mount)

通过 docker run -v /host/path:/container/path 方式,将宿主机的目录或文件直接挂载到容器内。

  • 特点
  • 容器访问的是宿主机实际存在的目录或文件,内容实时同步。
  • 如果使用 docker commit 创建新镜像,绑定挂载的内容可能被包含到新镜像中(前提是容器层中有内容修改)。
  • 绑定挂载依赖宿主机路径,不如数据卷灵活。

📌 示例

# 绑定宿主机目录到容器内目录
docker run --name mn -v /path/on/host:/path/in/container

# 绑定宿主机文件到容器内文件
docker run --name mn -v /path/to/host/file:/path/to/container/file
  • 格式:[宿主机绝对路径]:[容器内部路径]
  • 注意:路径必须是宿主机上的绝对路径。

3. 可视化示意图

数据卷挂载(推荐)和直接目录挂载
橙色部分表示数据卷挂载;绿色部分表示直接目录挂载(Bind Mount)

4. 补充示意图

数据卷与挂载


5. 总结对比表

特性 数据卷挂载(Volume Mount) 直接目录挂载(Bind Mount)
持久化位置 Docker 管理的 /var/lib/docker/volumes/ 指定的宿主机绝对路径
容器间共享 ✅ 支持 ✅ 支持
是否包含在镜像中 ❌ 不包含(docker commit 不保存) ✅ 可能包含(如有修改)
可移植性 ✅ 高 ❌ 低(依赖宿主机路径)
适合场景 生产环境、持久化存储 开发环境、实时同步调试

回到页面顶部