本文包含 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 mainkill -9 进程号1 …… 停止应用程序。
通过命令 ps -ef | grep main | grep -v grep | awk '{print $2}' | xargs kill -9 停止。(这个还没用过)

# Docker 部署

由于,本次使用的是远程数据库,所以没有数据库的镜像和容器配置。

# 安装环境

如果未安装环境,浏览 Golang 环境配置

# 获取源码

上传到服务器的指定路径中,或者直接从仓库拉取。

# 配置 Dockerfile 编译和部署的镜像

Deckerfile.de
# 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.rdb
# Dockerfile 用于构建镜像
FROM redis:alpine
ENV TZ Asia/Shanghai
WORKDIR .
CMD ["redis-server", "--requirepass", "RedisPassword"]

# 配置 Docker compose.yaml

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 地址问题。

  1. 服务端容器 (A) - 宿主机 Redis:此时有 3 中方式:
    • (推荐使用) 设置容器的网络模式 network_mode: host , 就可以直接使用 localhost+端口号 访问 Redis。 数据流动:宿主机 -> 容器A -> 宿主机 -> 宿主机Redis -> 宿主机 -> 容器A ;
    • (不推荐使用) 可以使用的代理地址有, ifconfig 查询网络信息。其中,docker0 的 inet 的值 + 端口号,此时宿主机的防火墙可以不开启对应端口注意。还需要额外的 Redis 配置。后续配置,没有继续了;
    • (不推荐使用) 可以使用的代理地址有, ifconfig 查询网络信息。其中,eth0 的 inet 的值 + 端口号,此时宿主机的防火墙要开启对应端口注意。还需要额外的 Redis 配置。后续配置,没有继续了;
  2. 服务端容器 (A) - Redis 容器 (B):
    • (推荐使用) 自定义一个网络,将容器添加到同一个网络下,代理地址使用 服务端容器名称/容器IP+端口号 ,Redis 可以不映射宿主机和容器的端口,也能访问。此时,如果 Redis 不对外,可以不开放对应端口的防火墙。 数据流动:宿主机 -> 容器A -> 容器B -> 容器A ;

# Jenkins 部署

暂时没有尝试,使用后再补充。

过去无法挽回,未来可以改变,有的人成日殚精竭虑,却掀不起什么风浪,有的人却因一念之差,让世界天翻地覆,这就是命运权重。

阅读次数

请我喝[茶]~( ̄▽ ̄)~*

NIDLH 微信支付

微信支付

NIDLH 支付宝

支付宝