4. Docker 与容器化基础:Docker 安装、Dockerfile 编写、Docker Compose 编排入门

在微服务架构中,容器化是保障环境一致性与快速交付的核心技术。本章将围绕 Docker 的安装、镜像构建与多服务编排展开,为后续搭建 Go 微服务中间件链路(如 Redis、Kafka、Jaeger)提供标准化的运行环境。

4.1 Docker 安装与验证

Docker 支持主流操作系统,以下为 Ubuntu 22.04 LTS 与 macOS 的安装方式。安装完成后需验证守护进程与客户端版本。

操作系统 安装方式 验证命令
Ubuntu 22.04 使用官方 apt 仓库安装 docker-ce docker version 与 docker info
macOS 下载 Docker Desktop for Mac 菜单栏 Docker 图标 + docker ps
Windows WSL2 安装 Docker Desktop 并启用 WSL2 后端 wsl docker run hello-world
生产建议: 在 Linux 服务器上安装后,务必执行 sudo usermod -aG docker $USER 将当前用户加入 docker 组,避免每次执行 docker 命令都需要 sudo。

4.1.1 快速安装脚本(Ubuntu)

# 卸载旧版本
sudo apt remove docker docker-engine docker.io containerd runc

# 安装依赖
sudo apt update
sudo apt install ca-certificates curl gnupg lsb-release

# 添加 Docker 官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 设置稳定版仓库
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装 Docker Engine
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 验证安装
sudo docker run hello-world

4.2 Dockerfile 编写规范

Dockerfile 是构建镜像的蓝图。对于 Go 微服务,推荐使用多阶段构建(Multi-stage Build)来减小镜像体积,同时保留编译环境。

4.2.1 多阶段构建示例

# ===== 第一阶段:编译 =====
FROM golang:1.22-alpine AS builder

WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download

COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o /app/service ./cmd/server

# ===== 第二阶段:运行 =====
FROM alpine:3.19

RUN apk --no-cache add ca-certificates tzdata
WORKDIR /root/
COPY --from=builder /app/service .

EXPOSE 8080
CMD ["./service"]
指令 作用 最佳实践
FROM 指定基础镜像 优先使用官方 alpine 或 slim 变体
COPY --from 从上一阶段复制产物 只复制编译后的二进制,不复制源码
RUN 执行构建命令 合并多条 RUN 以减少层数
EXPOSE 声明容器监听端口 仅作文档用途,实际映射需在运行时指定
CMD 设置默认启动命令 推荐使用 exec 格式 ["binary", "arg"]
常见陷阱: 不要在 Dockerfile 中硬编码敏感信息(如数据库密码、API Key)。应通过构建参数(--build-arg)或运行时环境变量注入。

4.3 Docker Compose 编排入门

Docker Compose 通过 YAML 文件定义多容器应用,实现一键启动、网络互通与依赖管理。在 Go 微服务链路中,通常需要同时启动服务自身、消息队列、缓存与链路追踪后端。

4.3.1 基础 Compose 文件结构

version: "3.9"

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    environment:
      - REDIS_ADDR=redis:6379
      - KAFKA_BROKERS=kafka:9092
    depends_on:
      redis:
        condition: service_healthy
      kafka:
        condition: service_started

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 5s
      timeout: 3s
      retries: 3

  kafka:
    image: confluentinc/cp-kafka:7.5.0
    environment:
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
    ports:
      - "9092:9092"

4.3.2 常用 Compose 指令速查

指令 用途 示例
build 指定构建上下文与 Dockerfile build: ./app
ports 宿主机与容器端口映射 "8080:8080"
environment 设置环境变量 REDIS_ADDR=redis:6379
depends_on 控制服务启动顺序 redis: condition: service_healthy
volumes 挂载数据卷或配置文件 ./data:/data
networks 自定义网络隔离 networks: - backend
启动与调试命令:
docker compose up -d — 后台启动所有服务
docker compose logs -f app — 实时查看 app 服务日志
docker compose exec app sh — 进入运行中的容器
docker compose down — 停止并移除所有容器与网络

4.4 容器化架构总览

下图展示了使用 Docker Compose 编排的 Go 微服务中间件链路环境。每个中间件组件运行在独立容器中,通过 Compose 内部 DNS 名称互相通信。

Go 微服务中间件链路容器化架构 Go 微服务中间件链路容器化架构 应用层 Go 微服务 中间件层 Redis 缓存 Kafka 消息 Jaeger 链路 MySQL 编排层 Docker Compose (docker-compose.yml) 说明:所有中间件通过 Compose 内部 DNS 名称(如 redis、kafka)互通,无需硬编码 IP。

4.5 本章小结

  • Docker 安装:推荐使用官方仓库或 Docker Desktop,安装后验证 docker version 与 docker run hello-world。
  • Dockerfile 编写:采用多阶段构建,第一阶段编译 Go 二进制,第二阶段使用 alpine 最小镜像运行,最终镜像体积可控制在 20MB 以内。
  • Docker Compose 编排:通过 YAML 定义服务、网络与依赖关系,使用 depends_on 配合 healthcheck 确保启动顺序,实现一键部署中间件链路。
  • 架构总览:Go 微服务作为应用层,依赖 Redis、Kafka、Jaeger、MySQL 等中间件,全部由 Compose 统一管理,形成可复用的本地开发环境。