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 名称互相通信。
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 统一管理,形成可复用的本地开发环境。