Docker 原理与生产实践全解析(从安装到内核机制)②
·
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 | 用户映射 |
| CGROUP | cgroup 隔离 |
容器的隔离就是这些 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 技术的整合。
更多推荐
所有评论(0)