一、使用Docker容器化部署Go语言微服务

1.1 安装Docker

1.1.1 Rocky9安装Docker

1、每台主机关闭防火墙、swap分区、dnsmasq、selinux

(1)在每台机器上执行以下命令关闭防火墙

$ systemctl disable --now firewalld

(2)在每台机器上执行以下命令关闭selinux

$ setenforce 0
$ sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/sysconfig/selinux
$ sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config

(3)在每台机器上执行以下命令关闭swap分区

#临时关闭
$ swapoff -a && sysctl -w vm.swappiness=0

#永久关闭
$ sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab

2、每台机器配置基础源

sed -e 's|^mirrorlist=|#mirrorlist=|g' \
    -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
    -i.bak \
    /etc/yum.repos.d/rocky-*.repo

# 重新生成缓存
dnf makecache

3、每台机器上安装必备工具

yum install wget jq psmisc vim net-tools telnet yum-utils device-mapper-persistent-data lvm2 git -y

4、安装docker

[root@rock9-12 ~]# vim install_docker_offline.sh
#!/bin/bash

#支持在线和离线安装

DOCKER_VERSION=28.0.4
#DOCKER_VERSION=27.5.1
#DOCKER_VERSION=26.1.4
#DOCKER_VERSION=26.0.0
#DOCKER_VERSION=24.0.7
#DOCKER_VERSION=24.0.5
#DOCKER_VERSION=23.0.3
#DOCKER_VERSION=20.10.19

URL=https://mirrors.tuna.tsinghua.edu.cn
#URL=https://mirrors.aliyun.com
#URL=https://download.docker.com

color () {
    RES_COL=60
    MOVE_TO_COL="echo -en \\033[${RES_COL}G"
    SETCOLOR_SUCCESS="echo -en \\033[1;32m"
    SETCOLOR_FAILURE="echo -en \\033[1;31m"
    SETCOLOR_WARNING="echo -en \\033[1;33m"
    SETCOLOR_NORMAL="echo -en \E[0m"
    echo -n "$1" && $MOVE_TO_COL
    echo -n "["
    if [ $2 = "success" -o $2 = "0" ] ;then
        ${SETCOLOR_SUCCESS}
        echo -n $"  OK  "
    elif [ $2 = "failure" -o $2 = "1"  ] ;then
        ${SETCOLOR_FAILURE}
        echo -n $"FAILED"
    else
        ${SETCOLOR_WARNING}
        echo -n $"WARNING"
    fi
    ${SETCOLOR_NORMAL}
    echo -n "]"
    echo
}

prepare () {
    if [ ! -e docker-${DOCKER_VERSION}.tgz ];then
        #wget ${URL}/docker-ce/linux/static/stable/x86_64/docker-${DOCKER_VERSION}.tgz
        wget ${URL}/docker-ce/linux/static/stable/x86_64/docker-${DOCKER_VERSION}.tgz
    fi
    [ $? -ne 0  ] && { echo "文件下载失败"; exit; }
}

install_docker () {
    tar xf docker-${DOCKER_VERSION}.tgz -C /usr/local/
    cp /usr/local/docker/* /usr/local/bin/
    cat > /lib/systemd/system/docker.service <<-EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target

[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/local/bin/dockerd -H unix://var/run/docker.sock
ExecReload=/bin/kill -s HUP \$MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target
EOF
    systemctl daemon-reload
}

config_docker () {
    mkdir -p /etc/docker
    tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://docker.m.daocloud.io","https://docker.1panel.live","https://docker.1ms.run","https://docker.xuanyuan.me"],
      "insecure-registries": ["harbor.wang.org"]
     }
EOF
    #systemctl restart docker

}

start_docker (){
    systemctl enable --now docker
    docker version && color "Docker 安装成功" 0 ||  color "Docker 安装失败" 1
}

config_docker_completion () {
    wget -P /etc/bash_completion.d http://www.wangxiaochun.com:8888/testdir/docker/docker_completion
    #source /etc/bash_completion.d/docker_completion
}

prepare

install_docker

config_docker

start_docker

config_docker_completion

# 执行安装脚本
[root@rock9-12 ~]# bash install_docker_offline.sh

1.1.2 Ubuntu2404安装Docker

Ubuntu2404安装Docker

apt install -y docker.io

1.2 代码编译

1、使用vscode工具打开scaffold-demo文件夹,按ctrl+j组合键打开终端视图

2、修改环境变量

cmd
SET CGO_ENABLED=0
SET GOOS=linux
SET GOARCH=amd64

验证

echo CGO_ENABLED=%CGO_ENABLED%
echo GOOS=%GOOS%
echo GOARCH=%GOARCH%

3、windows电脑方式进行编译,会在scaffold-demo文件夹下面生成一个名为demo的二进制文件

go build -o demo main.go

编译完成后,还原windows环境

SET CGO_ENABLED=1
SET GOOS=windows
SET GOARCH=amd64

4、将名为demo的二进制文件上传到linux服务器上并测试运行

[root@rock9-12 ~]# chmod +x demo
[root@rock9-12 ~]# ./demo
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

{"file":"C:/zq/宽哥/云原生全栈开发/云原生开发-Go、Gin入门到项目实战/课程笔记/Day014-Go项目容器化部署上线/Day015-Go项目容器化部署上线-代码/scaffold-demo/utils/logs/logs.go:11","func":"scaffold-demo/utils/logs.Info","level":"info","msg":"启动程序成功","time":"2025-05-18 13:40:23"}
[GIN-debug] GET    /debug/routes             --> main.main.func1 (4 handlers)
[GIN-debug] POST   /api/auth/login           --> scaffold-demo/controllers/auth.Login (4 handlers)
[GIN-debug] GET    /api/auth/logout          --> scaffold-demo/controllers/auth.Logout (4 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Listening and serving HTTP on :8080

5、linux服务器上编写Dockerfile并进行构建镜像

[root@rock9-12 ~]# vim Dockerfile
FROM registry.cn-hangzhou.aliyuncs.com/abroad_images/alpine:3.9-tomcat
COPY demo ./
ENTRYPOINT ./demo

#构建镜像
[root@rock9-12 ~]# docker build -t registry.cn-hangzhou.aliyuncs.com/abroad_images/demo:v1 .

1.3 部署启动

1、使用docker利用上面的镜像启动

[root@rock9-12 ~]#
docker run -itd --name demo -p 8080:8080 -e LOG_LEVEL=info -e USERNAME=<encrypted-credential> -e PASSWORD=<encrypted-credential> -e GIN_MODE=release registry.cn-hangzhou.aliyuncs.com/abroad_images/demo:v1

验证

[root@rock9-12 ~]# ss -lntup | grep 8080
tcp   LISTEN 0      4096         0.0.0.0:8080      0.0.0.0:*    users:(("docker-proxy",pid=31183,fd=7))
tcp   LISTEN 0      4096            [::]:8080         [::]:*    users:(("docker-proxy",pid=31190,fd=7))

2、查看启动容器的日志

[root@rock9-12 ~]# docker logs -f demo
{"file":"logs.go","func":"scaffold-demo/utils/logs.Info","level":"info","msg":"启动程序成功","time":"2025-05-18 06:36:02"}

3、使用Postman工具进行POST请求测试,模拟登录,观察到测试成功

填写Uri内容:http://your-service-host:8080/api/auth/login后,选择【Body】-【raw】

填写json内容后,点击【Send】

{
    "username": "<encrypted-credential>",
    "password": "<encrypted-credential>"
}

image-20250518141125868

Postman工具回显内容如下

{
    "status": 200,
    "message": "登录成功",
    "data": {
        "token": "<your-jwt-token>"
    }
}

二、使用K8s容器化部署Go语言微服务

1、定义名为demo-deploy.yaml配置文件

[root@rock9-12 ~]# vim demo-deploy.yaml
# deployment.yam
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo
  labels:
    app: demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: demo
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  template:
    metadata:
      labels:
        app: demo
    spec:
      affinity: {}
      containers:
      - name: demo
        image: registry.cn-hangzhou.aliyuncs.com/abroad_images/demo:v1
        lifecycle: {}
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
          name: web
          protocol: TCP
        resources:
          limits:
            cpu: "1"
            memory: "1024Mi"
          requests:
            cpu: "200m"
            memory: "256Mi"
        env:
        - name: TZ
          value: Asia/Shanghai
        - name: LANG
          value: C.UTF-8
        - name: GIN_MODE
          value: release
        - name: LOG_LEVEL
          value: info
        - name: PASSWORD
          value: <encrypted-credential>
        - name: USERNAME
          value: <encrypted-credential>
        livenessProbe:
          failureThreshold: 2
          initialDelaySeconds: 10
          periodSeconds: 10
          successThreshold: 1
          tcpSocket:
            port: 8080
          timeoutSeconds: 2

        readinessProbe:
          failureThreshold: 2
          initialDelaySeconds: 10
          periodSeconds: 10
          successThreshold: 1
          tcpSocket:
            port: 8080
          timeoutSeconds: 2
---
# service.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: demo
  name: demo
spec:
  type: NodePort
  selector:
    app: demo
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8080
    nodePort: 30080

2、创建应用

[root@k8s-master01 ~]# kaf demo-deploy.yaml

验证

#查看svc和deploy
[root@k8s-master01 ~]# kg svc,deploy demo
NAME           TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
service/demo   NodePort   10.108.134.151   <none>        8080:30080/TCP   51s

NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/demo   1/1     1            1           51s

#查看pod
[root@k8s-master01 ~]# kgp | grep demo
demo-74df6877b7-96gz2          1/1     Running   0             3m58s

#查看pod日志信息
[root@k8s-master01 ~]# k logs -f demo-74df6877b7-96gz2
{"file":"logs.go","func":"scaffold-demo/utils/logs.Info","level":"info","msg":"启动程序成功","time":"2025-05-18 07:05:05"}
{"file":"logs.go","func":"scaffold-demo/utils/logs.Info","level":"info","msg":"开始验证登录信息","time":"2025-05-18 07:06:44","密码":"<encrypted-credential>","用户名":"<encrypted-credential>"}
{"file":"logs.go","func":"scaffold-demo/utils/logs.Info","level":"info","msg":"登录成功","time":"2025-05-18 07:06:44","用户名":"<encrypted-credential>"}
[GIN] 2025/05/18 - 07:06:44 | 200 |     286.331µs |  192.168.32.128 | POST     "/api/auth/login"

3、使用Postman工具进行POST请求测试,模拟登录,观察到测试成功

填写Uri内容:http://your-k8s-node:30080/api/auth/login后,选择【Body】-【raw】

填写json内容后,点击【Send】

{
    "username": "<encrypted-credential>",
    "password": "<encrypted-credential>"
}

image-20250518150719623

Postman工具回显内容如下

{
    "status": 200,
    "message": "登录成功",
    "data": {
        "token": "<your-jwt-token>"
    }
}

4、资源还原

[root@k8s-master01 ~]# k delete -f  demo-deploy.yaml