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