使用 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 示例

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 配置详解

yaml 复制代码
version: "3.9"
services:
  app:
    build:
      context: ./app
      dockerfile: Dockerfile
    container_name: go-web-app
    ports:
      - "8080:8080"
    environment:
      MYSQL_DSN: devuser:devpass@tcp(mysql:3306)/devdb?parseTime=true
      REDIS_ADDR: redis:6379
      KAFKA_BROKERS: kafka:9092
    depends_on:
      - mysql
      - redis
      - kafka
    volumes:
      - ./app:/app   # 方便本地开发热更新

  mysql:
    image: mysql:8.0
    container_name: mysql
    restart: always
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: devdb
      MYSQL_USER: devuser
      MYSQL_PASSWORD: devpass
    volumes:
      - ./mysql-data:/var/lib/mysql

  redis:
    image: redis:7
    container_name: redis
    restart: always
    ports:
      - "6379:6379"
    volumes:
      - ./redis-data:/data

  zookeeper:
    image: bitnami/zookeeper:3.8
    container_name: zookeeper
    environment:
      - ALLOW_ANONYMOUS_LOGIN=yes
    ports:
      - "2181:2181"

  kafka:
    image: bitnami/kafka:3.5
    container_name: kafka
    depends_on:
      - zookeeper
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_CFG_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_CFG_LISTENERS: PLAINTEXT://:9092
      KAFKA_CFG_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
      ALLOW_PLAINTEXT_LISTENER: "yes"
    ports:
      - "9092:9092"

说明

  • 各服务通过服务名(如 mysql、redis、kafka)互联,Go 应用连接参数直接用服务名作为 host。
  • depends_on 保证启动顺序,实际服务可用性建议 Go 应用内实现重试机制。
  • 数据卷挂载避免数据丢失,勿将数据卷加入 git。

四、运行流程

  1. 开发环境依赖准备

    • 保证 Docker、docker-compose 已安装
  2. Go 应用依赖安装与编译

    bash 复制代码
    cd app
    go mod tidy
    cd ..
  3. 启动所有服务

    bash 复制代码
    docker compose up -d --build
  4. 查看服务状态和日志

    bash 复制代码
    docker compose ps
    docker compose logs -f app
  5. 访问应用

五、Go 应用中间件连接配置示例

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。

六、常见注意事项

  1. 端口冲突

    • 若本地已启用 MySQL/Redis/Kafka,请调整 compose 暴露端口或关闭本地服务。
  2. 服务可用性与重试

    • depends_on 只保证启动顺序,不保证服务就绪,Go 应用应有重试机制(如数据库、Kafka 连接失败自动重试)。
  3. 数据持久化

    • 数据卷挂载防止数据丢失,勿将数据卷目录加入代码仓库(加入 .gitignore)。
  4. 配置安全

    • 推荐敏感信息通过 .env 文件或环境变量注入,勿提交真实密码到仓库。
  5. Kafka 配置

    • Kafka 依赖 Zookeeper,生产环境建议加强网络隔离与鉴权。
  6. 开发热更新(可选)

    • 开发阶段可用 airfresh 实现代码热重载。

    • Dockerfile 示例(开发模式):

      dockerfile 复制代码
      FROM golang:1.22-alpine
      WORKDIR /app
      COPY . .
      RUN go install github.com/cosmtrek/air@latest
      CMD ["air"]
    • volumes 挂载 ./app:/app 以同步本地代码修改。

  7. 健康检查与监控

    • 可在 compose 中为各服务配置 healthcheck。
    • 推荐接入 Prometheus/Grafana 做资源与服务监控。

七、参考资料

相关推荐
中微子38 分钟前
React 状态管理 源码深度解析
前端·react.js
加减法原则2 小时前
Vue3 组合式函数:让你的代码复用如丝般顺滑
前端·vue.js
yanlele2 小时前
我用爬虫抓取了 25 年 6 月掘金热门面试文章
前端·javascript·面试
lichenyang4532 小时前
React移动端开发项目优化
前端·react.js·前端框架
你的人类朋友2 小时前
🍃Kubernetes(k8s)核心概念一览
前端·后端·自动化运维
web_Hsir2 小时前
vue3.2 前端动态分页算法
前端·算法
烛阴3 小时前
WebSocket实时通信入门到实践
前端·javascript
草巾冒小子3 小时前
vue3实战:.ts文件中的interface定义与抛出、其他文件的调用方式
前端·javascript·vue.js
DoraBigHead3 小时前
你写前端按钮,他们扛服务器压力:搞懂后端那些“黑话”!
前端·javascript·架构
慕木兮人可4 小时前
Docker部署MySQL镜像
spring boot·后端·mysql·docker·ecs服务器