本文包含 Ubuntu 直接部署 Gin 应用程序、Docker 部署 Gin 应用程序、Jenkins 、CI/CD 部署 Gin 应用程序 等内容。
Golang 知识:Golang 环境配置。
需要了解 Docker 知识:Docker 相关知识。
需要了解 Jenkins 知识:Jenkins 相关知识。
注意:此处部署是在 Ubuntu 操作系统中进行。如果安装慢,可以修改一下镜像源。
如果使用了外部变量,一定要将外部变量文件和应用程序放在一起。编译不能将外部变量编译到程序内部。
# Ubuntu 直接部署
# 安装环境
通过命令 go version , 查看是否安装,或者是不是自己需要的版本。
通过命令 go env , 查看环境配置。
如果未安装环境,浏览 Golang 环境配置。
# 获取源码
上传到服务器的指定路径中,或者直接从仓库拉取。
# 安装依赖
通过命令 go mod download 安装依赖。
# 编译
通过命令 go build 编译。
# 运行
通过命令 ./main 运行。
# 部署
通过命令 nohup go run 应用名称 > logs.log 2>&1 & 后台运行。
# 停止
通过命令 ps -ef | grep main 和 kill -9 进程号1 …… 停止应用程序。
通过命令 ps -ef | grep main | grep -v grep | awk '{print $2}' | xargs kill -9 停止。(这个还没用过)
# Docker 部署
由于,本次使用的是远程数据库,所以没有数据库的镜像和容器配置。
# 安装环境
如果未安装环境,浏览 Golang 环境配置。
# 获取源码
上传到服务器的指定路径中,或者直接从仓库拉取。
# 配置 Dockerfile 编译和部署的镜像
# Dockerfile 用于构建镜像 | |
FROM golang:1.20-alpine AS builder | |
LABEL stage=gobuilder | |
# 配置 go 环境 | |
ENV GO111MODULE=on | |
ENV GOPROXY=https://goproxy.cn,direct | |
ENV CGO_ENABLED=0 | |
ENV GOOS=linux | |
ENV GOARCH=amd64 | |
# 指定工作目录 | |
WORKDIR /build/golang-gin | |
# 更新依赖 | |
COPY go.mod . | |
COPY go.sum . | |
RUN go mod download | |
# 拷贝项目文件到自定义镜像中 | |
COPY . . | |
RUN go build -o 自定义应用程序名称 . | |
# 基础镜像 | |
FROM alpine | |
# 更新镜像源 | |
RUN sed -i 's!http://dl-cdn.alpinelinux.org/!https://mirrors.ustc.edu.cn/!g' /etc/apk/repositories | |
# 更新包、安装包、更新时区 | |
RUN apk update --no-cache && apk add --no-cache ca-certificates tzdata | |
ENV TZ Asia/Shanghai | |
# 设置工作目录 | |
WORKDIR /folder | |
# 拷贝编译好的文件到镜像中 | |
COPY --from=builder /build/golang-gin/.env . | |
COPY --from=builder /build/golang-gin/应用程序 . | |
# 启动命令 | |
CMD ["cd","/folder"] | |
CMD ["./应用程序名称"] | |
## ERROR 提示 exec ./filecoin_backend: no such file or directory | |
## export CGO_ENABLED=0r |
# 配置 Deockerfile Redis 镜像
# Dockerfile 用于构建镜像 | |
FROM redis:alpine | |
ENV TZ Asia/Shanghai | |
WORKDIR . | |
CMD ["redis-server", "--requirepass", "RedisPassword"] |
# 配置 Docker compose.yaml
networks: # 自定义网桥 | |
testnet: | |
driver: bridge | |
services: | |
backend: # 服务名称,用于在 Docker Compose 中标识该服务。(可自定义) | |
build: # 定义了如何构建该服务的 Docker 镜像。(指定 Dockerfile.deploy 的路径) | |
context: . | |
dockerfile: Dockerfile.de | |
# build: . # 定义了如何构建该服务的 Docker 镜像。(指定 Dockerfile 的路径) | |
image: IMAGE NAME:TAG # 自定义镜像名字和标签 | |
container_name: COINTAINER NAME # 自定义容器名字 | |
ports: | |
- "9072:9072" # "主机端口号:容器端口号" | |
volumes: | |
# - .:/filecoin_wallet # 主机项目资源路径:挂载容器中项目资源路径 (自定义) 挂载文件会更具主机项目资源变化发生变化的 | |
- ./.env:/filecoin_wallet/.env # 主机项目资源文件的路径:挂载容器中项目资源文件的路径 (自定义) 挂载文件会更具主机项目资源变化发生变化的 | |
# network_mode: host # 网络通信模式 Host 主机网络,容器完全应用宿主机网络,localhost 指向宿主机;Bridge (默认) 网桥网络,容器完全应用宿主机网络,localhost 指向容器;Container:container Id/container Name 共享网络,与指定容器共享网络和端口;None, 关闭容器网络; | |
networks: #使用自定义网桥,保证容器在一个网桥下,方便数据交互 | |
- testnet | |
restart: unless-stopped # 容器自动重启 | |
redis: | |
build: # 定义了如何构建该服务的 Docker 镜像。(指定 Dockerfile.rdb 的路径) | |
context: . | |
dockerfile: Dockerfile.rdb | |
image: IMAGE NAME:TAG | |
container_name: COINTAINER NAME | |
ports: | |
- 6379:6379 | |
networks: #使用自定义网桥,保证容器在一个网桥下,方便数据交互 | |
- testnet | |
restart: unless-stopped # 容器自动重启 |
# 上传 Docker 配置文件
将 Docker 配置文件上传到项目文件夹中即可。
# 启动 Docker 服务
通过命令 docker-compose up -d 启动 Docker 服务。 具体命令请阅读博文 Docker 命令。
此时,应用程序就部署完成了。
# 宿主机、容器之间网络关系
服务端外部配置文件中 Redis 地址问题。
- 服务端容器 (A) - 宿主机 Redis:此时有 3 中方式:
- (推荐使用) 设置容器的网络模式
network_mode: host, 就可以直接使用localhost+端口号访问 Redis。数据流动:宿主机 -> 容器A -> 宿主机 -> 宿主机Redis -> 宿主机 -> 容器A; - (不推荐使用) 可以使用的代理地址有,
ifconfig查询网络信息。其中,docker0 的 inet 的值 + 端口号,此时宿主机的防火墙可以不开启对应端口注意。还需要额外的 Redis 配置。后续配置,没有继续了; - (不推荐使用) 可以使用的代理地址有,
ifconfig查询网络信息。其中,eth0 的 inet 的值 + 端口号,此时宿主机的防火墙要开启对应端口注意。还需要额外的 Redis 配置。后续配置,没有继续了;
- (推荐使用) 设置容器的网络模式
- 服务端容器 (A) - Redis 容器 (B):
- (推荐使用) 自定义一个网络,将容器添加到同一个网络下,代理地址使用
服务端容器名称/容器IP+端口号,Redis 可以不映射宿主机和容器的端口,也能访问。此时,如果 Redis 不对外,可以不开放对应端口的防火墙。数据流动:宿主机 -> 容器A -> 容器B -> 容器A;
- (推荐使用) 自定义一个网络,将容器添加到同一个网络下,代理地址使用
# Jenkins 部署
暂时没有尝试,使用后再补充。
过去无法挽回,未来可以改变,有的人成日殚精竭虑,却掀不起什么风浪,有的人却因一念之差,让世界天翻地覆,这就是命运权重。