容器化部署从入门到实践
什么是容器化部署
容器化部署是将应用程序及其依赖打包到一个轻量级、可移植的容器中,然后在任何支持容器运行时的环境中部署运行。与传统的虚拟机相比,容器共享宿主机的操作系统内核,启动速度更快,资源占用更少。
容器 vs 虚拟机
| 特性 | 容器 | 虚拟机 |
|---|---|---|
| 启动时间 | 毫秒级 | 分钟级 |
| 镜像大小 | MB 级 | GB 级 |
| 资源密度 | 高 | 低 |
| 隔离级别 | 进程级 | 完全虚拟化 |
Docker 基础
核心概念
- 镜像 (Image)
- 一个只读模板,包含运行应用程序所需的文件系统、库和配置。
- 容器 (Container)
- 镜像的运行实例,是一个隔离的进程。
- 仓库 (Registry)
- 存储和分发镜像的服务,如 Docker Hub、Harbor。
常用命令
# 构建镜像
docker build -t myapp:latest .
# 运行容器
docker run -d -p 8080:80 --name myapp myapp:latest
# 查看运行中的容器
docker ps
# 查看日志
docker logs -f myapp
# 进入容器
docker exec -it myapp /bin/sh
Docker Compose 编排
Docker Compose 通过 YAML 文件定义和运行多容器应用,适合开发环境和单机部署。
# docker-compose.yml
version: '3.8'
services:
app:
build: .
ports:
- "8080:8080"
environment:
- DB_HOST=db
depends_on:
- db
db:
image: postgres:15
volumes:
- pgdata:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: secret
volumes:
pgdata:
Kubernetes 编排
Kubernetes 是生产环境容器编排的事实标准,提供自动部署、扩缩容和服务管理能力。
核心架构
- Control Plane:API Server、Scheduler、Controller Manager、etcd
- Worker Node:kubelet、kube-proxy、容器运行时
工作负载资源
- Deployment:声明式更新 Pod 和 ReplicaSet
- StatefulSet:有状态应用的部署管理
- DaemonSet:在每个节点上运行一个 Pod
- Job/CronJob:批处理任务和定时任务
服务发现与入站流量
- Service:ClusterIP、NodePort、LoadBalancer 三种类型
- Ingress:七层负载均衡,支持域名和路径路由
部署最佳实践
镜像构建
- 使用多阶段构建减小镜像体积
- 使用 Alpine 等精简基础镜像
- 避免以 root 用户运行容器
- 合理利用构建缓存
部署配置
- 使用 ConfigMap 和 Secret 分离配置
- 设置资源请求和限制 (requests/limits)
- 配置存活探针和就绪探针 (liveness/readiness probe)
- 使用 PodDisruptionBudget 保证可用性
安全最佳实践
- 定期扫描镜像漏洞
- 使用私有镜像仓库
- 启用 RBAC 权限控制
- 配置网络策略 (NetworkPolicy)
总结
容器化部署已从新兴技术发展为主流实践。从 Docker 的简单容器化,到 Compose 的多服务编排,再到 Kubernetes 的生产级集群管理,每一步都降低了运维复杂度,提升了交付效率。建议团队从容器化单个应用开始,逐步向完整的容器编排平台演进。