mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
730 字
2 分钟
什么是容器?
2024-01-08

某互联网公司的运维团队曾经历过这样的噩梦:新版本上线,开发说”在我机器上能跑”,测试环境也通过了,可一部署到生产环境就崩溃——缺少系统依赖、路径不一致、端口冲突……每次发布都像拆盲盒。直到团队引入容器技术,用 Docker 把应用和运行环境一起打包成镜像,从开发、测试到生产环境完全一致,部署才终于从”惊险操作”变成了”例行公事”。

容器(Container)是一种轻量级的操作系统级虚拟化技术,提供比虚拟机更快的启动速度和更低的资源开销。本文深入解析容器的本质、架构原理与工程实践。

一、容器概念#

1.1 容器 vs 虚拟机#

graph TB subgraph 虚拟机 VM1[VM1] --> HV1[Hypervisor] VM2[VM2] --> HV1 HV1 --> HW[硬件] end subgraph 容器 C1[容器1] --> C2[容器2] --> C3[容器3] C1 --> C4[容器运行时] C2 --> C4 C3 --> C4 C4 --> OS[操作系统] OS --> HW2[硬件] end
维度容器虚拟机
启动时间秒级分钟级
资源开销<5%20-30%
密度高(百容器/主机)低(十VM/主机)
隔离级别进程级硬件级
迁移简单打包完整镜像
安全性共享内核完全隔离

1.2 容器核心概念#

graph TB A[应用程序] --> B[容器镜像] B --> C[容器实例] C --> D[容器编排] D --> E[Kubernetes] E --> F[服务网格]

核心要素

概念说明
镜像应用的只读模板
容器镜像的运行实例
仓库镜像存储分发
编排多容器协同管理

二、容器镜像#

2.1 镜像结构#

graph TB subgraph 镜像层 A1[应用层] A2[依赖层] A3[系统层] end subgraph 容器层 B[容器读写层] end A1 --> B A2 --> A1 A3 --> A2 B --> A1

分层存储

# Dockerfile 示例
FROM ubuntu:22.04 # 基础镜像
RUN apt-get update # 系统层
COPY app /opt/app # 依赖层
CMD ["python", "app.py"] # 应用层

2.2 镜像优化原则#

原则做法效果
减少层数合并 RUN 指令减小体积
利用缓存按顺序安排指令加快构建
多阶段构建builder + runtime最终镜像更小
.dockerignore排除无关文件减小构建上下文
# 多阶段构建示例
FROM golang:1.21 AS builder
WORKDIR /build
COPY . .
RUN go build -o app
FROM alpine:3.18
COPY --from=builder /build/app /usr/local/bin/
CMD ["app"]

三、容器网络#

3.1 网络模式#

flowchart LR subgraph bridge C1[容器1] C2[容器2] C1 --> N[docker0] C2 --> N end
模式说明适用场景
bridge默认模式,NAT 通信开发测试
host共享主机网络网络性能敏感
overlay跨主机容器通信Swarm/K8s
macvlan分配 MAC 地址需直接暴露
none禁用网络特殊场景

3.2 容器通信#

# 容器间通信示例
docker network create mynet
docker run --network mynet --name app app:latest
docker run --network mynet --link app db:latest

四、容器存储#

4.1 存储驱动#

驱动原理特点
overlay2层层叠加生产推荐
devicemapper块设备映射性能好
btrfs文件系统 COW功能丰富
zfs高级特性内存占用大

4.2 数据卷#

# 数据卷类型
volumes:
- name: data
type: persistentVolumeClaim
- name: config
type: configMap
- name: secret
type: secret

五、容器安全#

5.1 安全原则#

flowchart TB A[容器安全] --> B[镜像安全] A --> C[运行时安全] A --> D[编排安全] B --> B1[最小镜像] B --> B2[漏洞扫描] B3[签名验证] C --> C1[资源限制] C --> C2[非 root] C3[只读根文件系统] D --> D1[网络策略] D --> D2[RBAC] D3[审计日志]

5.2 安全实践#

实践说明
最小镜像alpine/distroless
非 root 运行USER 指令
只读根文件系统readOnlyRootFilesystem
资源限制memory/cpu limits
漏洞扫描Trivy/Grype
# 安全 Dockerfile 示例
FROM node:18-alpine
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
WORKDIR /app
COPY --chown=appuser:appgroup . .
USER appuser
readOnly: true
healthcheck:
test: ["CMD", "wget", "-q", "http://localhost:8080/health"]

六、容器编排#

6.1 Kubernetes 核心概念#

graph TB subgraph K8s 架构 A[API Server] --> B[Scheduler] A --> C[Controller Manager] A --> D[etcd] B --> E[Kubelet] C --> E E --> F[Pod] F --> G[Container] end

6.2 Pod 概念#

apiVersion: v1
kind: Pod
metadata:
name: app
spec:
containers:
- name: app
image: app:latest
resources:
limits:
memory: "128Mi"
cpu: "500m"

七、容器网络存储#

7.1 CNI 网络模型#

flowchart LR C1[Pod] --> CNI[CNI Plugin] CNI --> H[主机网络] H --> S[交换/路由]

7.2 CSI 存储#

graph TB P[Pod] --> PVC[PVC] PVC --> SC[StorageClass] SC --> PV[PersistentVolume] PV --> CPD[CSI Driver]

八、最佳实践#

8.1 开发流程#

flowchart LR A[代码] --> B[构建] B --> C[镜像扫描] C --> D[镜像仓库] D --> E[部署] E --> F[监控] F --> G[日志] G --> A

8.2 镜像管理#

实践说明
语义版本v1.2.3-rc1
多架构linux/amd64, arm64
定期重建更新基础镜像
镜像签名Cosign/notary

参考资料#

支持与分享

如果这篇文章对你有帮助,欢迎支持作者或分享给更多人

什么是容器?
https://blog.souloss.com/posts/whatis/what-is-container/
作者
Souloss
发布于
2024-01-08
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时