Go Web 编程快速入门 13 - 部署与运维:Docker容器化、Kubernetes编排与CI/CD

服务写完只是第一步,稳定、自动化地部署与运维才是走向生产的关键。本章沿用第 04.1 的结构与"可运行模板",提供 Docker 多阶段构建、Compose 本地编排、Kubernetes 核心资源与 GitHub Actions CI/CD 的最小实践。

1 Docker容器化

1.1 多阶段 Dockerfile(最佳实践)

dockerfile 复制代码
# 构建阶段
FROM golang:1.22-alpine AS builder
WORKDIR /app
RUN apk add --no-cache tzdata ca-certificates
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o server ./cmd/server

# 运行阶段
FROM alpine:3.20
RUN apk add --no-cache tzdata ca-certificates
WORKDIR /root
COPY --from=builder /app/server ./server
COPY --from=builder /app/configs ./configs
EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD wget -qO- http://localhost:8080/health || exit 1
ENTRYPOINT ["./server"]

1.2 Docker Compose(本地多服务编排)

yaml 复制代码
version: "3.8"
services:
  gateway:
    build: { context: ., dockerfile: Dockerfile }
    ports: ["8080:8080"]
    environment:
      - ENV=production
      - USER_SERVICE_URL=http://user-service:8081
    depends_on: [user-service]

  user-service:
    build: { context: ., dockerfile: Dockerfile }
    ports: ["8081:8081"]
    environment:
      - ENV=production

2 Kubernetes编排

2.1 Deployment + Service(最小模板)

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: gateway
spec:
  replicas: 2
  selector:
    matchLabels: { app: gateway }
  template:
    metadata:
      labels: { app: gateway }
    spec:
      containers:
      - name: gateway
        image: yourrepo/gateway:latest
        ports: [{ containerPort: 8080 }]
        env:
        - name: ENV
          value: production
        resources:
          requests: { cpu: "250m", memory: "256Mi" }
          limits: { cpu: "500m", memory: "512Mi" }
        livenessProbe:
          httpGet: { path: /health, port: 8080 }
          initialDelaySeconds: 30
        readinessProbe:
          httpGet: { path: /health, port: 8080 }
          initialDelaySeconds: 5
---
apiVersion: v1
kind: Service
metadata:
  name: gateway
spec:
  type: ClusterIP
  selector: { app: gateway }
  ports:
  - name: http
    port: 80
    targetPort: 8080

2.2 配置与机密(ConfigMap/Secret)

yaml 复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  LOG_LEVEL: "info"
---
apiVersion: v1
kind: Secret
metadata:
  name: app-secret
type: Opaque
data:
  DB_PASSWORD: cGFzc3dvcmQ= # base64("password")

3 CI/CD(GitHub Actions 示例)

3.1 构建并推送镜像

yaml 复制代码
name: ci
on: { push: { branches: [ main ] } }
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-go@v5
        with: { go-version: "1.22" }
      - name: Build
        run: go build -v ./cmd/server
      - name: Login to Registry
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - name: Build and Push
        uses: docker/build-push-action@v6
        with:
          context: .
          push: true
          tags: ghcr.io/yourorg/gateway:latest

3.2 部署到 Kubernetes(可选)

yaml 复制代码
name: cd
on: { workflow_run: { workflows: ["ci"], types: ["completed"], branches: ["main"] } }
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Setup Kubectl
        uses: azure/setup-kubectl@v4
        with: { version: "v1.29.0" }
      - name: Kubeconfig
        run: echo "${{ secrets.KUBECONFIG }}" > kubeconfig && chmod 600 kubeconfig
      - name: Deploy
        run: KUBECONFIG=./kubeconfig kubectl apply -f k8s/

4 完整示例:一键启动到生产路径

  • 本地开发:docker compose up -d 启动多服务并联调。
  • 构建镜像:docker build -t yourrepo/gateway:latest .
  • 推送镜像:docker push yourrepo/gateway:latest
  • 部署集群:准备 k8s/ 资源清单并通过 CI/CD 自动 kubectl apply

通过本章的模板,你能快速建立"从代码到生产"的基础路径。建议逐步引入:灰度发布、滚动升级、观测(Prometheus/Grafana)、日志汇总与告警、金丝雀与回滚策略,以持续提升系统的可运维性与可靠性。

相关推荐
共享家95272 小时前
搭建 AI 聊天机器人:”我的人生我做主“
前端·javascript·css·python·pycharm·html·状态模式
可可嘻嘻大老虎3 小时前
nginx无法访问后端服务问题
运维·nginx
Halo_tjn4 小时前
基于封装的专项 知识点
java·前端·python·算法
阳光九叶草LXGZXJ4 小时前
达梦数据库-学习-47-DmDrs控制台命令(LSN、启停、装载)
linux·运维·数据库·sql·学习
无忧智库4 小时前
某市“十五五“地下综合管廊智能化运维管理平台建设全案解析:从数字孪生到信创适配的深度实践(WORD)
运维·智慧城市
珠海西格4 小时前
“主动预防” vs “事后补救”:分布式光伏防逆流技术的代际革命,西格电力给出标准答案
大数据·运维·服务器·分布式·云计算·能源
有来技术5 小时前
Spring Boot 4 + Vue3 企业级多租户 SaaS:从共享 Schema 架构到商业化套餐设计
java·vue.js·spring boot·后端
阿波罗尼亚5 小时前
Kubectl 命令记录
linux·运维·服务器
IDC02_FEIYA5 小时前
Linux文件搜索命令有哪些?Linux常用命令之文件搜索命令find详解
linux·运维·服务器
犀思云5 小时前
如何通过网络即服务平台实现企业数字化转型?
运维·网络·人工智能·系统架构·机器人