使用 Docker 搭建 Go Web 应用开发环境——AI教你学Docker
使用 Docker 搭建 Go Web 应用开发环境及常用中间件配置详解
本指南介绍如何用 Docker 和 Docker Compose 构建 Go Web 应用(如 gin/gorilla/mux/echo 等)开发环境,并集成常用中间件服务(MySQL、Redis、Kafka)。适合个人开发、本地测试与团队协作。
一、目录结构建议
project-root/
├── app/ # Go 应用源码目录
│ ├── Dockerfile
│ ├── go.mod
│ ├── go.sum
│ └── main.go
├── docker-compose.yml # Compose 主配置
├── mysql-data/ # MySQL 数据卷
├── redis-data/ # Redis 数据卷
└── .env # 环境变量(如端口、密码,勿提交敏感数据)
二、Go 应用 Dockerfile 示例
# app/Dockerfile
FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -o server .FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/server .
EXPOSE 8080
CMD ["./server"]
说明:
- 多阶段构建,减小最终镜像体积,只保留可执行文件。
- 编译参数可按需优化(如开启热重载开发可参见下文扩展)。
三、docker-compose.yml 配置详解
version: "3.9"
services:app:build:context: ./appdockerfile: Dockerfilecontainer_name: go-web-appports:- "8080:8080"environment:MYSQL_DSN: devuser:devpass@tcp(mysql:3306)/devdb?parseTime=trueREDIS_ADDR: redis:6379KAFKA_BROKERS: kafka:9092depends_on:- mysql- redis- kafkavolumes:- ./app:/app # 方便本地开发热更新mysql:image: mysql:8.0container_name: mysqlrestart: alwaysports:- "3306:3306"environment:MYSQL_ROOT_PASSWORD: rootpassMYSQL_DATABASE: devdbMYSQL_USER: devuserMYSQL_PASSWORD: devpassvolumes:- ./mysql-data:/var/lib/mysqlredis:image: redis:7container_name: redisrestart: alwaysports:- "6379:6379"volumes:- ./redis-data:/datazookeeper:image: bitnami/zookeeper:3.8container_name: zookeeperenvironment:- ALLOW_ANONYMOUS_LOGIN=yesports:- "2181:2181"kafka:image: bitnami/kafka:3.5container_name: kafkadepends_on:- zookeeperenvironment:KAFKA_BROKER_ID: 1KAFKA_CFG_ZOOKEEPER_CONNECT: zookeeper:2181KAFKA_CFG_LISTENERS: PLAINTEXT://:9092KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092ALLOW_PLAINTEXT_LISTENER: "yes"ports:- "9092:9092"
说明:
- 各服务通过服务名(如 mysql、redis、kafka)互联,Go 应用连接参数直接用服务名作为 host。
depends_on
保证启动顺序,实际服务可用性建议 Go 应用内实现重试机制。- 数据卷挂载避免数据丢失,勿将数据卷加入 git。
四、运行流程
-
开发环境依赖准备
- 保证 Docker、docker-compose 已安装
-
Go 应用依赖安装与编译
cd app go mod tidy cd ..
-
启动所有服务
docker compose up -d --build
-
查看服务状态和日志
docker compose ps docker compose logs -f app
-
访问应用
- 访问 http://localhost:8080
五、Go 应用中间件连接配置示例
// MySQL
dsn := os.Getenv("MYSQL_DSN") // devuser:devpass@tcp(mysql:3306)/devdb?parseTime=true// Redis
redisAddr := os.Getenv("REDIS_ADDR") // redis:6379// Kafka (github.com/segmentio/kafka-go)
kafkaBrokers := strings.Split(os.Getenv("KAFKA_BROKERS"), ",") // []string{"kafka:9092"}
- 连接配置建议全部用环境变量,便于多环境切换和 CI/CD。
六、常见注意事项
-
端口冲突
- 若本地已启用 MySQL/Redis/Kafka,请调整 compose 暴露端口或关闭本地服务。
-
服务可用性与重试
depends_on
只保证启动顺序,不保证服务就绪,Go 应用应有重试机制(如数据库、Kafka 连接失败自动重试)。
-
数据持久化
- 数据卷挂载防止数据丢失,勿将数据卷目录加入代码仓库(加入 .gitignore)。
-
配置安全
- 推荐敏感信息通过
.env
文件或环境变量注入,勿提交真实密码到仓库。
- 推荐敏感信息通过
-
Kafka 配置
- Kafka 依赖 Zookeeper,生产环境建议加强网络隔离与鉴权。
-
开发热更新(可选)
- 开发阶段可用 air 或 fresh 实现代码热重载。
- Dockerfile 示例(开发模式):
FROM golang:1.22-alpine WORKDIR /app COPY . . RUN go install github.com/cosmtrek/air@latest CMD ["air"]
- volumes 挂载 ./app:/app 以同步本地代码修改。
-
健康检查与监控
- 可在 compose 中为各服务配置 healthcheck。
- 推荐接入 Prometheus/Grafana 做资源与服务监控。
七、参考资料
- Go 官方文档
- Docker Compose 官方文档
- GORM MySQL 连接
- Go Redis 客户端
- segmentio/kafka-go
- Bitnami Kafka 镜像说明