fastGin脚手架——项目部署
最早之前我是通过本地开发,交叉编译,上传可执行文件,然后服务器上通过supervisor进行进程管理 现在很多情况下都是直接使用docker进行go的项目部署 需要先掌握docker能随心所欲的拉

fastGin脚手架——项目部署

发布时间:2025-02-27 (2025-02-27)
AI 文章总结
用 AI 快速提炼本文核心内容和阅读重点。

最早之前我是通过本地开发,交叉编译,上传可执行文件,然后服务器上通过supervisor进行进程管理

现在很多情况下都是直接使用docker进行go的项目部署

需要先掌握docker能随心所欲的拉镜像,可以看看我的docker安装视频

https://www.bilibili.com/video/BV1RsCVYLEf6

Dockerfile

我们需要使用分阶段构建方法,在第一阶段使用go的镜像,然后完成编译,并将可执行文件拷贝到第二个标准容器中,这样镜像的体积就会大大减小

FROM golang:alpine AS builder

# 构建可执行文件
ENV CGO_ENABLED 0
ENV GOPROXY https://goproxy.cn,direct
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories

WORKDIR /build
ADD . .
RUN go build -o main


FROM alpine
WORKDIR /app
COPY --from=builder /build/main /app
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk add tzdata
CMD ["./main"]

我们将单个镜像做好之后,下一步就是跑容器了

如果你的这个项目要用到mysql,redis这些,那么你还得分别跑mysql和redis服务

所以docker compose诞生了

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它通过一个 YAML 文件(通常命名为 docker-compose.yml)来配置应用程序的服务、网络和卷等资源,从而简化了多容器应用的部署和管理。

docker compose

配置

version: '3.2'
services:
  mysql:
    image: "mysql:5.7"
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123456 
      TZ: Asia/Shanghai
      MYSQL_DATABASE: db
    command:
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --max_allowed_packet=128M;
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/blogx.sql:/docker-entrypoint-initdb.d/blogx.sql
    networks:
      blogx_network:
        ipv4_address: 10.2.0.2
  redis:
    restart: always
    image: redis:5.0.5
    networks:
      blogx_network:
        ipv4_address: 10.2.0.6
  server:
    restart: always
    image: server:v1
    networks:
      blogx_network:
        ipv4_address: 10.2.0.7
    environment:
      TZ: Asia/Shanghai
    depends_on:
      - mysql-master
      - es
      - redis
    volumes:
      - ./server/settings.yaml:/app/settings.yaml
      - ./server/uploads:/app/uploads
      - ./server/logs:/app/logs
      - ./web/dist:/app/web
    command: "/app/main"
  web:
    image: nginx:latest
    restart: always
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/logs:/var/log/nginx/
      - ./blogx_web/dist:/usr/share/nginx/fai_web
      - ./nginx/cert/:/usr/share/nginx/cert
    networks:
      blogx_network:
        ipv4_address: 10.2.0.8
    ports:
      - "80:80"
      - "443:443"
networks:  #定义容器连接网络
  blogx_network:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 10.2.0.0/24