一、容器化运维的时代
2026年的运维工程师如果还不会容器化,就像2016年的运维不会用虚拟化一样。容器化已经成为生产环境的标配,从简单的Docker Compose到完整的Kubernetes集群,容器技术覆盖了从开发到生产的全流程。
二、Docker基础与安全
2.1 Dockerfile最佳实践
# 选择精简基础镜像(减少攻击面) FROM alpine:3.19 AS builder # 多阶段构建 RUN apk add --no-cache gcc musl-dev COPY . . RUN make FROM alpine:3.19 COPY --from=builder /app/bin /app # 使用非root用户运行 RUN addgroup -S appgroup && adduser -S appuser -G appgroup USER appuser EXPOSE 8080 CMD ["/app/server"]
2.2 Docker安全配置
# 禁止特权容器 docker run --security-opt=no-new-privileges --cap-drop=ALL --cap-add=NET_BIND_SERVICE # 容器资源限制 docker run --memory=512m --cpus=0.5 # 文件系统只读 docker run --read-only --tmpfs /tmp:rw,noexec,nosuid,size=64m # 使用非root用户运行 docker run -u 1000:1000
三、Docker Compose编排
# docker-compose.yml version: '3.8' services: app: build: . restart: always depends_on: - db - redis environment: - DB_URL=postgres://user:pass@db:5432/app deploy: resources: limits: cpus: '0.5' memory: 512M logging: driver: json-file options: max-size: "10m" max-file: "3" db: image: postgres:16-alpine volumes: - pgdata:/var/lib/postgresql/data environment: POSTGRES_PASSWORD_FILE: /run/secrets/db_password secrets: - db_password nginx: image: nginx:alpine ports: - "443:443" volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro - ./ssl:/etc/nginx/ssl:ro volumes: pgdata: secrets: db_password: file: ./secrets/db_password.txt
四、Kubernetes入门
4.1 K8s集群部署(kubeadm)
# 初始化控制平面节点 kubeadm init --pod-network-cidr=10.244.0.0/16 # 安装Flannel网络插件 kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml # 添加工作节点 kubeadm join 192.168.1.10:6443 --token xxx --discovery-token-ca-cert-hash sha256:xxx
4.2 部署应用
# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: myapp spec: replicas: 3 selector: matchLabels: app: myapp template: metadata: labels: app: myapp spec: containers: - name: myapp image: myapp:latest ports: - containerPort: 8080 resources: requests: memory: "256Mi" cpu: "250m" limits: memory: "512Mi" cpu: "500m" livenessProbe: httpGet: path: /health port: 8080 initialDelaySeconds: 30 periodSeconds: 10
# service.yaml apiVersion: v1 kind: Service metadata: name: myapp-service spec: type: ClusterIP selector: app: myapp ports: - port: 80 targetPort: 8080
五、Kubernetes运维实战
5.1 日志收集
# 使用Loki + Promtail收集日志 helm upgrade --install loki grafana/loki-stack --set grafana.enabled=true --set prometheus.enabled=true
5.2 监控告警
# 部署Prometheus Operator kubectl create -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/main/bundle.yaml # 查看Pod资源使用 kubectl top pods kubectl top nodes
5.3 集群备份
# 备份etcd ETCDCTL_API=3 etcdctl snapshot save /backup/etcd-snapshot-$(date +%Y%m%d).db --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key
六、容器化迁移实战案例
背景:某互联网金融平台从传统裸机部署向Kubernetes迁移,涉及20+微服务、5个环境。
迁移策略:
-
业务梳理:确认各服务的依赖关系和资源需求
-
容器化单体应用:先做Docker化改造,验证功能正常
-
K8s部署:使用Helm Chart统一管理部署配置
-
灰度切换:使用流量权重逐步切换生产流量
-
监控对比:对比迁移前后的延迟、错误率、资源利用率
效果:部署时间从30分钟缩短到3分钟,资源利用率提升40%,故障恢复时间从小时级降至分钟级。
七、总结
容器化不是终点,而是一个持续演进的过程。建议从小规模试点开始,逐步积累经验。学习容器化的最佳路径是:Docker基础 → Compose编排 → 单节点K8s → 生产集群 → GitOps自动化。
原文链接:https://shibaolong.com/117/
更多安全技术文章请访问 月梦沉冰的安全博客
