一、使用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>"
}

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>"
}

Postman工具回显内容如下
{
"status": 200,
"message": "登录成功",
"data": {
"token": "<your-jwt-token>"
}
}
4、资源还原
[root@k8s-master01 ~]# k delete -f demo-deploy.yaml