Docker部署 #

一、Docker概述 #

1.1 什么是Docker #

Docker是一种容器化技术,可以将应用及其依赖打包成容器:

text
应用 + 依赖 + 配置 = 容器镜像

1.2 Docker优势 #

优势 说明
一致性 开发、测试、生产环境一致
隔离性 容器之间相互隔离
可移植 一次构建,到处运行
高效 轻量级,启动快

二、Dockerfile #

2.1 基本Dockerfile #

dockerfile
# 基础镜像
FROM golang:1.22-alpine

# 设置工作目录
WORKDIR /app

# 复制go.mod和go.sum
COPY go.mod go.sum ./

# 下载依赖
RUN go mod download

# 复制源代码
COPY . .

# 编译
RUN go build -o main .

# 暴露端口
EXPOSE 8080

# 运行
CMD ["./main"]

2.2 多阶段构建 #

dockerfile
# 构建阶段
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 main .

# 运行阶段
FROM alpine:latest

RUN apk --no-cache add ca-certificates tzdata

WORKDIR /root/

# 从构建阶段复制二进制文件
COPY --from=builder /app/main .
COPY --from=builder /app/config ./config

# 设置时区
ENV TZ=Asia/Shanghai

EXPOSE 8080

CMD ["./main"]

2.3 优化Dockerfile #

dockerfile
# 使用alpine减小镜像大小
FROM golang:1.22-alpine AS builder

# 安装构建依赖
RUN apk add --no-cache git

WORKDIR /app

# 利用缓存,先复制依赖文件
COPY go.mod go.sum ./
RUN go mod download

# 复制源代码
COPY . .

# 编译优化
RUN CGO_ENABLED=0 GOOS=linux go build \
    -ldflags="-w -s" \
    -o main .

# 使用scratch最小化镜像
FROM scratch

# 复制CA证书
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/

WORKDIR /app

COPY --from=builder /app/main .
COPY --from=builder /app/config ./config

EXPOSE 8080

ENTRYPOINT ["./main"]

三、Docker Compose #

3.1 基本配置 #

yaml
version: '3.8'

services:
  app:
    build: .
    ports:
      - "8080:8080"
    environment:
      - GIN_MODE=release
      - DB_HOST=db
      - DB_PORT=3306
      - DB_USER=root
      - DB_PASSWORD=root
      - DB_NAME=gin_demo
    depends_on:
      - db
      - redis

  db:
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=gin_demo
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data

volumes:
  mysql_data:
  redis_data:

3.2 开发环境配置 #

yaml
version: '3.8'

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile.dev
    ports:
      - "8080:8080"
    volumes:
      - .:/app
    environment:
      - GIN_MODE=debug
      - DB_HOST=db
    depends_on:
      - db

  db:
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=gin_demo
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql

volumes:
  mysql_data:

3.3 生产环境配置 #

yaml
version: '3.8'

services:
  app:
    image: your-registry/gin-app:latest
    restart: always
    ports:
      - "8080:8080"
    environment:
      - GIN_MODE=release
      - DB_HOST=db
      - DB_PORT=3306
      - DB_USER=${DB_USER}
      - DB_PASSWORD=${DB_PASSWORD}
      - DB_NAME=gin_demo
      - REDIS_HOST=redis
      - REDIS_PORT=6379
    depends_on:
      - db
      - redis
    networks:
      - backend
    deploy:
      resources:
        limits:
          cpus: '1'
          memory: 512M
        reservations:
          cpus: '0.5'
          memory: 256M

  db:
    image: mysql:8.0
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
      - MYSQL_DATABASE=gin_demo
    volumes:
      - mysql_data:/var/lib/mysql
    networks:
      - backend

  redis:
    image: redis:7-alpine
    restart: always
    volumes:
      - redis_data:/data
    networks:
      - backend

  nginx:
    image: nginx:alpine
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./ssl:/etc/nginx/ssl
    depends_on:
      - app
    networks:
      - backend

networks:
  backend:

volumes:
  mysql_data:
  redis_data:

四、Docker命令 #

4.1 构建镜像 #

bash
# 构建镜像
docker build -t gin-app:latest .

# 构建时传递参数
docker build --build-arg VERSION=1.0 -t gin-app:1.0 .

4.2 运行容器 #

bash
# 运行容器
docker run -d -p 8080:8080 --name gin-app gin-app:latest

# 运行时传递环境变量
docker run -d -p 8080:8080 -e GIN_MODE=release gin-app:latest

# 挂载配置文件
docker run -d -p 8080:8080 -v $(pwd)/config:/app/config gin-app:latest

4.3 Docker Compose命令 #

bash
# 启动服务
docker-compose up -d

# 停止服务
docker-compose down

# 查看日志
docker-compose logs -f app

# 重新构建
docker-compose up -d --build

# 扩展服务
docker-compose up -d --scale app=3

五、CI/CD集成 #

5.1 GitHub Actions #

yaml
name: Build and Deploy

on:
  push:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest
    
    steps:
      - uses: actions/checkout@v3
      
      - name: Set up Go
        uses: actions/setup-go@v4
        with:
          go-version: '1.22'
      
      - name: Build
        run: go build -o main .
      
      - name: Test
        run: go test -v ./...
      
      - name: Build Docker image
        run: docker build -t gin-app:${{ github.sha }} .
      
      - name: Push to Registry
        run: |
          docker login -u ${{ secrets.DOCKER_USER }} -p ${{ secrets.DOCKER_PASSWORD }}
          docker push gin-app:${{ github.sha }}

5.2 GitLab CI #

yaml
stages:
  - test
  - build
  - deploy

test:
  stage: test
  image: golang:1.22
  script:
    - go test -v ./...

build:
  stage: build
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker login -u $DOCKER_USER -p $DOCKER_PASSWORD
    - docker build -t gin-app:$CI_COMMIT_SHA .
    - docker push gin-app:$CI_COMMIT_SHA

deploy:
  stage: deploy
  image: docker:latest
  script:
    - docker-compose -f docker-compose.prod.yml up -d
  only:
    - main

六、最佳实践 #

6.1 镜像优化 #

dockerfile
# 1. 使用alpine基础镜像
FROM golang:1.22-alpine

# 2. 多阶段构建
FROM alpine:latest

# 3. 减小二进制文件大小
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-w -s" -o main .

# 4. 使用.dockerignore

6.2 .dockerignore #

text
.git
.gitignore
.env
*.md
*.log
tmp/
vendor/
tests/

6.3 健康检查 #

dockerfile
HEALTHCHECK --interval=30s --timeout=3s \
  CMD wget --no-verbose --tries=1 --spider http://localhost:8080/health || exit 1

七、总结 #

7.1 核心要点 #

要点 说明
Dockerfile 定义镜像构建过程
多阶段构建 减小镜像大小
Docker Compose 编排多个容器
CI/CD 自动化构建部署

7.2 最佳实践 #

实践 说明
使用alpine 减小镜像大小
多阶段构建 分离构建和运行环境
健康检查 配置容器健康检查
环境变量 使用环境变量配置

7.3 下一步 #

现在你已经掌握了Docker部署,接下来让我们学习 生产环境配置,了解生产环境最佳实践!

最后更新:2026-03-28