Docker Kubernetes容器化

一、容器化运维的时代

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个环境。

迁移策略:

  1. 业务梳理:确认各服务的依赖关系和资源需求

  2. 容器化单体应用:先做Docker化改造,验证功能正常

  3. K8s部署:使用Helm Chart统一管理部署配置

  4. 灰度切换:使用流量权重逐步切换生产流量

  5. 监控对比:对比迁移前后的延迟、错误率、资源利用率

效果:部署时间从30分钟缩短到3分钟,资源利用率提升40%,故障恢复时间从小时级降至分钟级。

七、总结

容器化不是终点,而是一个持续演进的过程。建议从小规模试点开始,逐步积累经验。学习容器化的最佳路径是:Docker基础 → Compose编排 → 单节点K8s → 生产集群 → GitOps自动化。

By admin

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

This website uses cookies to analyze site traffic and improve your experience. By continuing to use this site, you consent to our use of cookies.