第二十二: go与k8s、docker相关编写dockerfile

实战演示k8s部署go服务,实现滚动更新、重新创建、蓝绿部署、金丝雀发布-CSDN博客

go 编写k8s命令:

怎么在go语言中编写k8s命令 • Worktile社区

k8s中如何使用go

在K8s编程中如何使用Go-阿里云开发者社区

go build - o : -o :指定输出文件的名称和路径。例如,go build -o myapp会将编译后的可执行文件命名为myapp

Go 常用命令介绍 - 贾维斯Echo - 博客园

Mac 上搭建k8s-CSDN博客

编写dockerFile 文件:

如何使用Docker部署Go Web应用 | 李文周的博客

如何使用Docker部署Go Web应用的实现_docker_脚本之家

使用 docker 轻松部署你的 Go 项目-腾讯云开发者社区-腾讯云

Docker Compose 项目打包部署-腾讯云开发者社区-腾讯云

docker-compose教程(安装,使用, 快速入门)-CSDN博客

【实战篇】docker-compose部署go项目 - 随风落木 - 博客园

docker-compose自动部署go项目全流程,本地到镜像仓库到服务器,踩坑笔记 - cccq - 博客园

安装docker 和 docker compose :

docker-compose管理多个服务_docker-compose 启动多个服务-CSDN博客

Docker compose部署Golang服务_docker-compose golang-CSDN博客

为了在 Kubernetes 中运行你的 Go 应用,你需要将其打包进一个 Docker 容器中。创建一个 Dockerfile

bash 复制代码
# 使用官方的 Go 语言基础镜像
FROM golang:1.17 as builder
WORKDIR /app
COPY . .
RUN go build -o myapp main.go
 
# 使用轻量级的基础镜像运行应用
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp /app/myapp
ENTRYPOINT ["./myapp"]


第二种方式详解:

Dockerfile复制代码
# 使用官方的Golang镜像作为基础镜像  
FROM golang:1.17-alpine AS build-env
# 设置工作目录  
WORKDIR /app  
# 将当前目录下的所有文件复制到容器中的/app目录下  
COPY . .  
# 安装依赖(如果有的话)  
# RUN go mod tidy  
# 编译Go应用程序  
RUN CGO_ENABLED=0 GOOS=linux go build -o myapp .  
# 使用一个轻量级的Alpine Linux镜像来运行编译好的程序  
FROM alpine:latest  
# 将编译好的程序从build-env阶段复制到当前镜像  
COPY --from=build-env /app/myapp /usr/local/bin/myapp  
# 设置容器启动时运行的命令  
ENTRYPOINT ["/usr/local/bin/myapp"]  
# 暴露端口  
EXPOSE 8080



第三种方式:

FROM golang:1.13.5-alpine3.10 AS builder

WORKDIR /build
RUN adduser -u 10001 -D app-runner

ENV GOPROXY https://goproxy.cn
COPY go.mod .
COPY go.sum .
RUN go mod download

COPY . .
RUN CGO_ENABLED=0 GOARCH=amd64 GOOS=linux go build -a -o your-application .

FROM alpine:3.10 AS final

WORKDIR /app
COPY --from=builder /build/your-application /app/
#COPY --from=builder /build/config /app/config
COPY --from=builder /etc/passwd /etc/passwd
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/

USER app-runner
ENTRYPOINT ["/app/your-application"]

golang 打包的几种镜像效率对比:

golang学习总结(四)-程序编译_from golang:alpine-CSDN博客

机遇屋-golang 打包到docker运行,最小镜像

构建docer 镜像:

Go 复制代码
docker build -t my-go-app .

4. 推送 Docker 镜像到容器仓库(如 Docker Hub)

Go 复制代码
docker tag my-go-app yourusername/my-go-app:latest
docker push yourusername/my-go-app:latest

5. 在 Kubernetes 中部署应用

首先,确保你的 Kubernetes 集群已配置并可以访问。然后,创建一个 Deployment 来运行你的应用:

Go 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-app-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: go-app
  template:
    metadata:
      labels:
        app: go-app
    spec:
      containers:
      - name: go-app-container
        image: yourusername/my-go-app:latest
        ports:
        - containerPort: 8080

应用这个配置:

Go 复制代码
kubectl apply -f deployment.yaml

6. 暴露服务(可选)

如果你想要从集群外部访问你的应用,可以创建一个 Service:

Go 复制代码
apiVersion: v1
kind: Service
metadata:
  name: go-app-service
spec:
  type: LoadBalancer  # 或者 NodePort, ClusterIP 等类型,取决于你的需求和 Kubernetes 集群的配置。
  ports:
  - port: 8080       # 服务端口号。这应该与 Deployment 中的容器端口号相匹配。
    targetPort: 8080 # Pod 中的容器端口号。这应该与 Deployment 中的容器端口号相匹配。
  selector:          # 选择器用于确定哪些 Pod 应该被包含在 Service 中。这应该与 Deployment 中的标签选择器相匹配。
    app: go-app      # 选择器中的标签值应该与 Deployment 中的 Pod 标签相匹配。

应用这个配置:

Go 复制代码
kubectl apply -f service.yaml

现在,你应该可以通过 Kubernetes 的 LoadBalancer IP 或 NodePort(取决于你选择的服务类型)来访问你的 Go 应用了。使用 kubectl get svc 查看服务详情。

以上步骤涵盖了在 Kubernetes 中使用 Go 语言编写、构建、部署和运行一个简单应用的完整流程。

相关推荐
Scott9999HH1 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社2 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海2 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖3 小时前
JDK 26 新特性详解
java·开发语言
马优晨4 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区6 小时前
怎么把C语言学到精通?
c语言·开发语言
张忠琳6 小时前
【NVIDIA】 NVIDIA Container Toolkit v1.19.1 — OCI 模块超深度分析之三
云原生·容器·架构·kubernetes·nvidia
心平气和量大福大6 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai7 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
এ慕ོ冬℘゜7 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript