最早之前我是通过本地开发,交叉编译,上传可执行文件,然后服务器上通过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