Go云原生开发零基础教程:搭建第一个容器化Go服务
准备工作:安装Go和Docker环境
在开始Go云原生开发之前,先搭建好本地开发环境。
你需要安装Go 1.20以上版本(下载地址)以及Docker Desktop(下载地址)。
安装完成后打开终端验证:
go version
# 输出类似 go version go1.21.0 linux/amd64
docker --version
# 输出类似 Docker version 24.0.6
如果你计划部署到Kubernetes,建议同时启用Docker Desktop内置的K8s集群(Settings → Kubernetes → Enable),或者安装Minikube。
本文示例使用Docker Desktop自带的K8s,打开你的终端确保kubectl可用:
kubectl version --client
编写你的第一个Go HTTP服务
创建一个项目文件夹,比如 go-cloud-native,在里面新建 main.go,写入以下代码:
package main
import (
"fmt"
"log"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, 云原生世界!")
}
func main() {
http.HandleFunc("/", handler)
log.Println("服务启动在 :8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
这个极简服务会在8080端口响应“Hello, 云原生世界!
”。
现在启动一下:
go run main.go
打开浏览器访问 http://localhost:8080,你应该看到那行字。
按 Ctrl+C 停止服务。
使用Docker容器化你的Go服务
在项目根目录创建 Dockerfile(无后缀),内容如下:
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY go.mod ./
COPY main.go ./
RUN go build -o myapp .
FROM alpine:latest
WORKDIR /root
COPY --from=builder /app/myapp .
EXPOSE 8080
CMD ["./myapp"]
采用多阶段构建,最终镜像只有几MB。
然后构建镜像并运行容器:
docker build -t go-cloud-native:v1 .
docker run -d -p 8080:8080 --name go-app go-cloud-native:v1
再次访问 http://localhost:8080,看到同样的响应说明容器化成功。
用 docker stop go-app && docker rm go-app 清理容器。
在Kubernetes中部署Go服务
确保K8s集群已启用(Docker Desktop → 设置 → Kubernetes → 启用)。
创建部署文件 deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: go-app
spec:
replicas: 2
selector:
matchLabels:
app: go-app
template:
metadata:
labels:
app: go-app
spec:
containers:
- name: go-app
image: go-cloud-native:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: go-app-service
spec:
selector:
app: go-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: LoadBalancer
执行以下命令部署:
kubectl apply -f deployment.yaml
# 等待Pod就绪
kubectl get pods
# 查看Service的外部IP(Docker Desktop下为localhost)
kubectl get svc go-app-service
访问 http://localhost(或EXTERNAL-IP指定的地址),再次看到欢迎信息,说明你的Go云原生开发流程已跑通。
常见问题与避坑说明
- Windows下路径分隔符:Dockerfile中的路径使用正斜杠,Windows下
COPY时注意。 - 镜像拉取策略:在K8s中如果不设置
imagePullPolicy: IfNotPresent,默认每次从远程拉取,本地镜像不会被使用导致ImagePullBackOff。我们上面已经正确设置。 - 端口映射:Service中
port: 80是对外端口,targetPort: 8080是容器内端口,务必对应。 - 验证方式:每次修改代码后,需重新构建镜像、更新Deployment(
kubectl set image或重新apply),简易测试可直接用docker run先验证。
如果你在Go云原生开发中遇到其他问题,建议先按本文步骤完整跑通,再扩展到更复杂的业务逻辑。