Redis 容器底层环境分析

1. 容器基本信息

  • 容器 ID: 8809a15ac3b5f053bc21f1e0ef0d0a41144eeac96a6cf4acfad12d780681d2b9
  • 名称: /test-redis
  • 状态: running
  • 镜像: redis
  • 主进程 PID: 14441

2. 文件系统(OverlayFS)

OverlayFS 结构:

MergedDir (容器看到的根目录):

  /var/lib/docker/overlay2/84ba32b1c4b139f2f3bff53c2f383111a73a52bed03d8e92ec2c243bc3cad352/merged

UpperDir (可写层):

  /var/lib/docker/overlay2/84ba32b1c4b139f2f3bff53c2f383111a73a52bed03d8e92ec2c243bc3cad352/diff

LowerDir (只读层,共 9 层):

  - 9 个镜像层叠加

  - 使用符号链接缩短路径(l/ 目录)

容器根目录内容:

bin, boot, data, dev, etc, home, lib, lib64, media, mnt, opt, 

proc, root, run, sbin, srv, sys, tmp, usr, var

关键发现:

  • 可写层(diff)目前为空,容器未写入文件
  • 所有文件来自镜像的只读层

3. 命名空间(Namespaces)

容器创建了以下命名空间:

命名空间 ID 作用
PID 4026532295 独立进程树
Network 4026532297 独立网络栈
Mount 4026532292 独立文件系统视图
IPC 4026532294 独立 IPC
UTS 4026532293 独立主机名
User 4026531837 用户映射
Cgroup 4026532296 Cgroup 视图
Time 4026531834 时间命名空间

4. 网络环境

网络配置:

  • IP 地址: 172.18.0.2/16
  • 网关: 172.18.0.1
  • MAC 地址: 02:42:ac:12:00:02
  • 网络: bridge (默认 Docker 网络)

网络接口:

lo: 127.0.0.1/8 (回环接口)

eth0: 172.18.0.2/16 (容器网卡,连接到 docker0 bridge)

网络命名空间: net:[4026532297]

5. 挂载点

主要挂载:

  1. OverlayFS 根文件系统 (overlay)
  1. /proc (proc)
  1. /dev (tmpfs)
  1. /sys (sysfs, 只读)
  1. /dev/shm (tmpfs, 64MB)
  1. /data (volume, Redis 数据目录)
  1. /etc/resolv.conf (DNS 配置)
  1. /etc/hostname (主机名)
  1. /etc/hosts (主机映射)

6. 进程环境

容器内进程:

  • PID 1: /sbin/init (systemd)
  • 多个 systemd 服务进程
  • 进程树独立于主机

7. Cgroup 配置

Cgroup 路径:

/sys/fs/cgroup/system.slice/docker-8809a15ac3b5f053bc21f1e0ef0d0a41144eeac96a6cf4acfad12d780681d2b9.scope

资源限制:

  • 内存: 无限制 (0)
  • CPU: 无限制 (0)
  • 使用 systemd cgroup 驱动

8. 安全配置

  • Privileged: false (非特权模式)
  • SecurityOpt: null (使用默认安全配置)
  • CapAdd/CapDrop: null (使用默认能力集)

9. 容器配置目录

容器配置存储在:

/var/lib/docker/containers/8809a15ac3b5f053bc21f1e0ef0d0a41144eeac96a6cf4acfad12d780681d2b9/

├── config.v2.json  # 容器配置

├── hostname         # 主机名

├── hosts            # /etc/hosts

├── resolv.conf      # DNS 配置

└── shm/             # 共享内存

总结

Docker 为这个 Redis 容器创建了:

  1. 文件系统:OverlayFS 联合挂载(9 层只读层 + 1 层可写层)
  1. 命名空间:8 个 Linux 命名空间(PID、Network、Mount、IPC、UTS、User、Cgroup、Time)
  1. 网络:独立的网络命名空间,veth pair,IP 172.18.0.2
  1. 进程:独立的进程树,PID 1 为 systemd
  1. 资源:Cgroup 目录(systemd 驱动)
  1. 安全:非特权模式,默认能力集
  1. 存储:1 个数据卷挂载到 /data

这些环境共同构成了一个隔离的容器运行环境。

┌─────────────────────────────────────────────────────────┐
│  Docker 三大核心技术的作用                              │
│                                                          │
│  ┌──────────────────────────────────────────────────┐  │
│  │ 1. Namespace(隔离)                             │  │
│  │                                                  │  │
│  │  作用:隔离进程的视图                             │  │
│  │  • PID Namespace - 隔离进程 ID                    │  │
│  │  • Network Namespace - 隔离网络                  │  │
│  │  • Mount Namespace - 隔离文件系统挂载点           │  │
│  │  • IPC Namespace - 隔离进程间通信                 │  │
│  │  • UTS Namespace - 隔离主机名                     │  │
│  │  • User Namespace - 隔离用户 ID                  │  │
│  │  • Cgroup Namespace - 隔离 Cgroup 视图           │  │
│  │                                                  │  │
│  │  类比:给每个容器一个"独立的世界"                 │  │
│  └──────────────────────────────────────────────────┘  │
│                                                          │
│  ┌──────────────────────────────────────────────────┐  │
│  │ 2. Cgroup(资源限制)                            │  │
│  │                                                  │  │
│  │  作用:限制资源使用                               │  │
│  │  • CPU 限制 - 限制 CPU 使用率                    │  │
│  │  • 内存限制 - 限制内存使用                        │  │
│  │  • IO 限制 - 限制磁盘 IO                         │  │
│  │  • 进程数限制 - 限制进程数量                      │  │
│  │                                                  │  │
│  │  类比:给每个容器分配"资源配额"                   │  │
│  └──────────────────────────────────────────────────┘  │
│                                                          │
│  ┌──────────────────────────────────────────────────┐  │
│  │ 3. OverlayFS(文件系统)                          │  │
│  │                                                  │  │
│  │  作用:实现镜像层和容器层的联合挂载                │  │
│  │  • 镜像层 - 只读层(共享)                         │  │
│  │  • 容器层 - 可写层(每个容器独立)                 │  │
│  │  • 联合挂载 - 合并多个层为一个视图                  │  │
│  │  • Copy-on-Write - 修改时才复制                  │  │
│  │                                                  │  │
│  │  类比:给每个容器一个"独立的文件系统视图"           │  │
│  └──────────────────────────────────────────────────┘  │
│                                                          │
│  关键区别:                                               │
│  • Namespace = 隔离(让容器看不到其他容器)             │
│  • Cgroup = 限制(让容器不能无限使用资源)               │
│  • OverlayFS = 存储(让容器有独立的文件系统)            │
└─────────────────────────────────────────────────────────┘

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐