温馨提示×

golang ubuntu容器化部署方案

小樊
43
2025-11-22 23:10:47
栏目: 编程语言

适用于 Ubuntu 的 Golang 容器化部署方案

一 环境准备

  • Ubuntu 20.04/22.04/24.04 上安装 Docker(任选其一):
    • 快速安装:sudo apt-get update && sudo apt-get install -y docker.io && sudo systemctl enable --now docker
    • 官方仓库安装:sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg && echo “deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable” | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null && sudo apt-get update && sudo apt-get install -y docker-ce docker-ce-cli containerd.io
  • 可选:安装 docker-compose(便于多服务编排):sudo apt-get install -y docker-compose-plugin
  • 验证:docker version、docker run --rm hello-world。

二 方案一 多阶段构建 推荐

  • 特点:构建阶段使用 golang 镜像,运行阶段使用 alpineubuntu 极简镜像,镜像小、攻击面小、启动快。
  • 目录结构:
    • myapp/
      • main.go
      • go.mod / go.sum
      • Dockerfile
      • docker-compose.yml(可选)
  • Dockerfile(多阶段,静态编译,默认监听 8080
    # 构建阶段
    FROM golang:1.22 AS builder
    WORKDIR /app
    COPY go.mod go.sum ./
    RUN go mod download
    COPY . .
    RUN CGO_ENABLED=0 GOOS=linux go build -ldflags "-s -w" -o myapp .
    
    # 运行阶段(Alpine,体积更小)
    # FROM alpine:3.20
    # 运行阶段(Ubuntu,便于需要glibc/系统库的调试场景)
    FROM ubuntu:22.04
    RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates && rm -rf /var/lib/apt/lists/*
    WORKDIR /app
    COPY --from=builder /app/myapp .
    EXPOSE 8080
    CMD ["./myapp"]
    
  • 构建与运行
    • 构建:docker build -t myapp:latest .
    • 运行:docker run -d --name myapp -p 8080:8080 myapp:latest
    • 验证:curl http://localhost:8080 或 docker logs -f myapp
  • 说明
    • 使用 CGO_ENABLED=0 生成静态二进制,避免运行时依赖 glibc 以外的库,便于在 alpine/ubuntu 运行。
    • 多阶段构建可显著减小最终镜像体积,仅保留运行所需内容。

三 方案二 使用 Ubuntu 作为基础镜像

  • 适用场景:需要 glibc、调试工具链、或特定系统库的 Go 程序。
  • Dockerfile(Ubuntu 基础镜像)
    FROM ubuntu:22.04
    ENV LANG=C.UTF-8
    ENV GO_VERSION=1.22.5
    RUN apt-get update && apt-get install -y --no-install-recommends \
        wget ca-certificates build-essential && \
        rm -rf /var/lib/apt/lists/*
    RUN wget -qO- https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz | tar -C /usr/local -xzf - && \
        ln -s /usr/local/go/bin/go /usr/bin/go
    WORKDIR /app
    COPY go.mod go.sum ./
    RUN go mod download
    COPY . .
    RUN CGO_ENABLED=0 GOOS=linux go build -ldflags "-s -w" -o myapp .
    EXPOSE 8080
    CMD ["./myapp"]
    
  • 构建与运行
    • 构建:docker build -t myapp:ubuntu .
    • 运行:docker run -d --name myapp-ubuntu -p 8080:8080 myapp:ubuntu
  • 说明
    • 在镜像内直接安装 Go 可统一构建/运行环境,适合受限环境或需要系统库的场景。

四 编排与运维 可选

  • docker-compose.yml(示例)
    version: "3.8"
    services:
      app:
        image: myapp:latest
        container_name: myapp
        restart: unless-stopped
        ports:
          - "8080:8080"
        environment:
          - TZ=Asia/Shanghai
        healthcheck:
          test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/health"]
          interval: 10s
          timeout: 5s
          retries: 3
    
  • 常用命令
    • 启动:docker-compose up -d
    • 停止:docker-compose down
    • 查看日志:docker-compose logs -f app
    • 进入容器:docker-compose exec app sh
  • 建议
    • 将应用配置通过 环境变量 注入,镜像保持无状态;日志输出到 stdout/stderr 便于采集。

五 最佳实践与常见问题

  • 减小镜像体积与安全面
    • 优先使用 多阶段构建;运行阶段选择 alpine 或精简 ubuntu;使用 CGO_ENABLED=0 静态编译;构建时加入 -ldflags “-s -w” 去除符号与调试信息。
  • 构建稳定性
    • 使用 Go Modules 管理依赖;在 CI 中固定 Go 版本 与依赖版本;必要时在构建阶段显式下载依赖(go mod download)。
  • 时区与本地化
    • 容器内设置 TZ=Asia/Shanghai 或写入 /etc/timezone 并重新配置 tzdata,确保日志时间与业务一致。
  • 端口与网络
    • 应用监听 0.0.0.0:8080;宿主机映射 -p 8080:8080;在云服务器需放行安全组/防火墙端口。
  • 健康检查与可观测性
    • docker-compose 中配置 healthcheck;结构化日志输出;必要时接入 Prometheus client 暴露指标。

0