技术栈:Vue + Golang + MySQL + Redis
背景:MySQL 数据库在使用前需要对数据进行初始化
步骤:
1. 为前端 Vue 项目、后端 Go 项目、MySQL 数据库编写 Dockerfile,打包镜像,push 至 Dockerhub
2. 为 4 个服务分别编写 Service、Deployment
3. kubectl create 执行 Service、Deployment
复制代码
附项目地址:github.com/TeanLee/mal…
前端:mall-admin-frontend(包含数据库初始化内容,在 MySQL 文件夹中)
具体 yaml 文件如下:
前端项目
先编写 Dockerfile 对前端项目打包,Dockerfile 如下:
# !注意:node 版本要和本地能执行成功的版本保持一致!!!
FROM node:16.12
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
ENV VUE_APP_API_URL='http://127.0.0.1:8081'
EXPOSE 8080
CMD [ "npm", "run", "serve" ]
复制代码
.dockerignore(不拷贝 node_modules,减少文件内容)
node_modules
复制代码
在当前 Dockerfile 目录下执行命令:
docker build -t mall-admin-server-frontend .
docker tag mall-admin-server-frontend {your dockerhub name}/mall-admin-server-frontend:1.0.0
docker login
docker push {your dockerhub name}/mall-admin-server-frontend:1.0.0
复制代码
k8s 构建 Service、Deployment 的文件如下,注意替换镜像(image)为上一步构建的镜像名称!
apiVersion: v1
kind: Service
metadata:
annotations:
kompose.cmd: kompose convert
kompose.version: 1.24.0 (HEAD)
creationTimestamp: null
labels:
io.kompose.service: mall-frontend
name: mall-frontend
spec:
ports:
- name: "8080"
port: 8080
targetPort: 8080
selector:
io.kompose.service: mall-frontend
status:
loadBalancer: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
kompose.cmd: kompose convert
kompose.version: 1.24.0 (HEAD)
creationTimestamp: null
labels:
io.kompose.service: mall-frontend
name: mall-frontend
spec:
replicas: 1
selector:
matchLabels:
io.kompose.service: mall-frontend
strategy: {}
template:
metadata:
annotations:
kompose.cmd: kompose convert
kompose.version: 1.24.0 (HEAD)
creationTimestamp: null
labels:
io.kompose.service: mall-frontend
spec:
containers:
- env:
- name: VUE_APP_API_URL
value: http://127.0.0.1:8081
image: tean123/mall-admin-server-frontend:1.0.0
name: mall-admin-server-front-end
ports:
- containerPort: 8080
resources: {}
tty: true
restartPolicy: Always
status: {}
复制代码
MySQL 数据库部分
其中 Dump20220317.sql 文件是我需要初始化的文件,按照我在 docker启动时初始化 mysql 数据 文章中的方式,对 MySQL 进行数据初始化。
Dockerfile 如下:
FROM mysql:latest
COPY Dump20220317.sql /docker-entrypoint-initdb.d/Dump20220317.sql
复制代码
在该 Dockerfile 所在目录下执行:
docker build -t mall-admin-server-mysql .
docker tag mall-admin-server-frontend {your dockerhub name}/mall-admin-server-mysql:1.0.0
docker login
docker push {your dockerhub name}/mall-admin-server-mysql:1.0.0
复制代码
MySQL 的 Service、Deployment 部署文件如下:
apiVersion: v1
kind: Service
metadata:
annotations:
kompose.cmd: kompose convert
kompose.version: 1.24.0 (HEAD)
creationTimestamp: null
labels:
io.kompose.service: mydb
name: mydb
spec:
ports:
- name: "3306"
port: 3306
targetPort: 3306
selector:
io.kompose.service: mydb
status:
loadBalancer: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
kompose.cmd: kompose convert
kompose.version: 1.24.0 (HEAD)
creationTimestamp: null
labels:
io.kompose.service: mydb
name: mydb
spec:
replicas: 1
selector:
matchLabels:
io.kompose.service: mydb
strategy: {}
template:
metadata:
annotations:
kompose.cmd: kompose convert
kompose.version: 1.24.0 (HEAD)
creationTimestamp: null
labels:
io.kompose.service: mydb
spec:
containers:
- env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
image: tean123/mall-admin-server-mysql:1.0.0
name: mall-admin-server-db
ports:
- containerPort: 3306
resources: {}
tty: true
restartPolicy: Always
status: {}
复制代码
后端 Go 部分
Dockerfile 如下:
FROM golang:latest
RUN mkdir /app
WORKDIR /app
ADD go.mod .
ADD go.sum .
RUN go mod download
ADD . .
RUN go build -o main .
EXPOSE 8081
ENTRYPOINT ["./main"]
复制代码
在该 Dockerfile 下执行:
docker build -t mall-admin-server-backend .
docker tag mall-admin-server-frontend {your dockerhub name}/mall-admin-server-backend:1.0.0
docker login
docker push {your dockerhub name}/mall-admin-server-backend:1.0.0
复制代码
后端 Go 项目的 Service、Deployment 部署文件如下:
apiVersion: v1
kind: Service
metadata:
annotations:
kompose.cmd: kompose convert
kompose.version: 1.24.0 (HEAD)
creationTimestamp: null
labels:
io.kompose.service: app
name: app
spec:
ports:
- name: "8081"
port: 8081
targetPort: 8081
selector:
io.kompose.service: app
status:
loadBalancer: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
kompose.cmd: kompose convert
kompose.version: 1.24.0 (HEAD)
creationTimestamp: null
labels:
io.kompose.service: app
name: app
spec:
replicas: 1
selector:
matchLabels:
io.kompose.service: app
strategy:
type: Recreate
template:
metadata:
annotations:
kompose.cmd: kompose convert
kompose.version: 1.24.0 (HEAD)
creationTimestamp: null
labels:
io.kompose.service: app
spec:
containers:
- env:
- name: env
value: production
image: tean123/mall-admin-server-backend:1.0.0
name: mall-admin-server-app
ports:
- containerPort: 8081
resources: {}
tty: true
volumeMounts:
- mountPath: /workspace
name: app-claim0
restartPolicy: Always
volumes:
- name: app-claim0
persistentVolumeClaim:
claimName: app-claim0
status: {}
复制代码
Redis 部分
由于没有数据初始化等内容,相对更简单,无需 Dockerfile,只需要部署集群的 Service 和 Deployment
apiVersion: v1
kind: Service
metadata:
annotations:
kompose.cmd: kompose convert
kompose.version: 1.24.0 (HEAD)
creationTimestamp: null
labels:
io.kompose.service: cache
name: cache
spec:
ports:
- name: "6379"
port: 6379
targetPort: 6379
selector:
io.kompose.service: cache
status:
loadBalancer: {}
---
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
kompose.cmd: kompose convert
kompose.version: 1.24.0 (HEAD)
creationTimestamp: null
labels:
io.kompose.service: cache
name: cache
spec:
replicas: 1
selector:
matchLabels:
io.kompose.service: cache
strategy: {}
template:
metadata:
annotations:
kompose.cmd: kompose convert
kompose.version: 1.24.0 (HEAD)
creationTimestamp: null
labels:
io.kompose.service: cache
spec:
containers:
- image: redis:6.2-alpine
name: mall-admin-server-redis
ports:
- containerPort: 6379
resources: {}
restartPolicy: Always
status: {}
复制代码
存储部分
需要注意的是,由于数据库等内容有 Volumn 挂载,因此还需要编写 persistent volumn 内容:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
creationTimestamp: null
labels:
io.kompose.service: app-claim0
name: app-claim0
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Mi
status: {}
复制代码
部署服务
接下来就是部署服务了,可以选择将所有部署服务的 yaml 放在一个文件夹中,执行
kubectl create -f {deployfile}
复制代码
执行结果如下图:
文末再推荐一个将 docker-compose 的方法:Kompose
使用kompose convert -f docker-compose.yaml
命令就将Docker Compose
转换成Kubernetes
或OpenShift
所需文件。