7. 我最熟悉的一种构建 Docker 镜像方法

Dockerfile 是最常见方式。

示例:

FROM rockylinux:9

RUN dnf install -y nginx

COPY index.html /usr/share/nginx/html/

CMD ["nginx","-g","daemon off;"]

构建:

docker build -t mynginx:1.0 .

原理:

每条指令生成一个 Layer。

最佳实践:

  • 合并 RUN 指令

  • 减少层数

  • 使用多阶段构建

  • 使用小基础镜像(alpine)


8. 容器隔离用到哪些 Namespace?

Linux Namespace 提供隔离。

常见类型:

Namespace作用
PID进程隔离
NET网络隔离
IPC信号量、共享内存
MNT文件系统
UTS主机名
USER用户映射
CGROUPcgroup 隔离

容器的隔离就是这些 Namespace 的组合。


9. 手工创建类容器对象的操作

可以使用 unshare 模拟容器。

示例:

unshare --fork --pid --mount --net --uts --ipc bash

再执行:

mount -t proc proc /proc

你就创建了一个:

  • 独立 PID 空间

  • 独立挂载点

  • 独立网络

再配合:

chroot
cgroups

就接近一个完整容器。

Docker 本质就是自动完成这些步骤。


10. Cgroups 的重要作用

Namespace 负责“看不见别人”。

Cgroups 负责“不能无限用资源”。

它限制:

  • CPU

  • Memory

  • IO

  • 网络带宽

  • 进程数量

没有 Cgroups,容器就是危险进程。


11. Cgroups 如何控制资源

限制 CPU

docker run --cpus=1 nginx

原理:

cpu.cfs_quota_us
cpu.cfs_period_us

限制内存

docker run -m 512m nginx

对应:

memory.limit_in_bytes

限制进程数

pids.max

示例:

docker run --pids-limit=100 nginx


12. Docker 网络模式

模式说明适用场景
bridge默认模式单机容器
host共享主机网络高性能
none无网络安全隔离
container共享网络栈sidecar
macvlan分配独立IP物理网络接入

13. Bridge 模式流量转发过程

假设容器 IP:

172.17.0.2

流程如下:

① 容器启动

Docker 创建:

veth pair

  • veth0 在容器内

  • veth1 在宿主机

② 连接 docker0 网桥

veth1 被挂载到:

docker0

③ 出站流量

容器 → veth → docker0 → 宿主机网卡 → 外网

通过 iptables 做 NAT:

POSTROUTING MASQUERADE

④ 入站流量(端口映射)

外网:80 → 宿主机:8080

iptables 做 DNAT:

PREROUTING

转发到:

172.17.0.2:80

⑤ 总结

Bridge 模式本质是:

  • Linux Bridge

  • veth pair

  • iptables NAT

它不是 Docker 发明的,是 Linux 网络机制的封装。


总结

Docker 本质不是虚拟机。

它是:

Linux 内核特性的工程化组合

核心机制包括:

  • Namespace(隔离)

  • Cgroups(限制)

  • UnionFS(分层文件系统)

  • Overlay2(存储驱动)

  • veth + bridge + iptables(网络)

理解 Docker 的关键是:

它不是一个产品,而是一组 Linux 技术的整合。

更多推荐