容器交付流程
作者:@skyflask
转载本文请注明出处:https://www.cnblogs.com/skyflask/p/15335827.html
目录
一、容器交付流程
二、容器交付实战
三、dockerfile制作流程
四、使用控制器部署镜像
五、暴露应用
一、容器交付流程
二、容器交付实战
三、dockerfile制作流程
- 项目代码构成
- 依赖的服务
- 提供服务的端口
- 配置文件
- 程序在工作种涉及持久化的文件
代码项目地址:https://gitee.com/qianxunqianyu/tom-java-demo
1、生成网站打包文件
1 2 3 4 | yum install java-1.8.0-openjdk maven git -y git clone https: //gitee.com/qianxunqianyu/tom-java-demo mvn clean package -Dmaven.test.skip= true # 代码编译构建 unzip target/*.war -d target/ROOT # 解压构建文件 |
2、制作镜像
镜像分类:
基础镜像:例如centos、ubuntu
环境镜像:jdk、nginx
项目镜像:dashboard
Dockerfile编写:
1 2 3 | FROM tomcat LABEL maintainer xq COPY target/ROOT /usr/local/tomcat/webapps/ROOT |
镜像制作:
1 | docker build -t tomcat-java-demo:v1 . |
镜像推送:
1 | docker push tomcat-java-demo:v1 |
注意:推送镜像时,首先要进行harbor仓库的登录,docker login myhabor.kingsoft.com;其次要将镜像重新打tag。
harbor默认试用https登录,需要通过以下方式进行修改为http方式:
cat /etc/docker/daemon.json
1 2 3 4 5 | { "graph" : "/data/docker" , "registry-mirrors" :[ "https://b9pmyelo.mirror.aliyuncs.com" ], "insecure-registries" :[ "myharbor.kingsoft.com" ] } |
1 2 | docker login myharbor.kingsoft.com docker tag tomcat-java-demo:v1 myharbor.kingsoft.com/tomcat-java/tomcat-java-demo:v1 |
四、使用控制器部署镜像
根据业务逻辑编写deployment
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | apiVersion: apps/v1 kind: Deployment metadata: name: java-demo-deployment labels: app: java-demo spec: replicas: 2 selector: matchLabels: app: java-demo template: metadata: labels: app: java-demo spec: imagePullSecrets: - name: registry-auth containers: - name: web-java-demo image: myharbor.kingsoft.com/tomcat-java/tomcat-java:v3 ports: - containerPort: 8080 resources: requests: cpu: 0.5 memory: 500Mi limits: cpu: 1 memory: 1Gi livenessProbe: httpGet: path: / port: 8080 initialDelaySeconds: 50 periodSeconds: 10 readinessProbe: httpGet: path: / port: 8080 initialDelaySeconds: 50 periodSeconds: 10 volumeMounts: - name: config mountPath: "/usr/local/tomcat/webapps/ROOT/WEB-INF/classes/application.yml" subPath: application.yml volumes: # 你可以在 Pod 级别设置卷,然后将其挂载到 Pod 内的容器中 - name: config configMap: # 提供你想要挂载的 ConfigMap 的名字 name: java-demo-config # 来自 ConfigMap 的一组键,将被创建为文件 items: - key: "application.yml" path: "application.yml" |
注意:项目中需要使用的几个东西:健康检查、配置文件、资源限额、镜像拉取
健康检查主要是对pod启动后是否正常提供服务,端口是否正常进行检查,保证pod的健壮性;
1 2 3 4 5 6 7 8 9 10 11 12 | livenessProbe: httpGet: path: / port: 8080 initialDelaySeconds: 50 periodSeconds: 10 readinessProbe: httpGet: path: / port: 8080 initialDelaySeconds: 50 periodSeconds: 10 |
配置文件通过configmap保存,然后使用volume进行挂在到pod里面直接使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | apiVersion: v1 kind: ConfigMap metadata: name: java-demo-config data: application.yml: | server: port: 8080 spring: datasource: url: jdbc:mysql: //localhost:3306/test?characterEncoding=utf-8 username: root password: 12345 driver- class -name: com.mysql.jdbc.Driver freemarker: allow-request- override : false cache: true check-template-location: true charset: UTF-8 content-type: text/html; charset=utf-8 expose-request-attributes: false expose-session-attributes: false expose-spring-macro-helpers: false suffix: .ftl template-loader-path: - classpath:/templates/ |
资源限额,对pod资源进行限制
1 2 3 4 5 6 7 | resources: requests: cpu: 0.5 memory: 500Mi limits: cpu: 1 memory: 1Gi |
镜像拉取,对于像harbor这样的镜像仓库,需要具有登录权限才能拉取镜像。
创建secret:
1 | kubectl create secret docker-registry registry-auth --docker-username=admin --dockepassword=Harbor12345 --docker-server=10.11.97.193 |
在container同一级别配置拉取镜像密码:
1 2 | imagePullSecrets: - name: registry-auth |
五、暴露应用
service
1 2 3 4 5 6 7 8 9 10 11 | apiVersion: v1 kind: Service metadata: name: tomcat-java spec: selector: app: java-demo ports: - protocol: TCP port: 80 targetPort: 8080 |
ingress
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | apiVersion: extensions/v1beta1 kind: Ingress metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | { "apiVersion" : "extensions/v1beta1" , "kind" : "Ingress" , "metadata" :{ "annotations" :{ "kubernetes.io/ingress.class" : "nginx" , "nginx.ingress.kubernetes.io/enable-cors" : "true" , "nginx.ingress.kubernetes.io/proxy-connect-timeout" : "600" , "nginx.ingress.kubernetes.io/proxy-read-timeout" : "600" , "nginx.ingress.kubernetes.io/proxy-send-timeout" : "600" , "nginx.ingress.kubernetes.io/rewrite-target" : "/$1" }, "creationTimestamp" : "2021-04-02T05:27:55Z" , "generation" :4, "name" : "omms-ingress" , "namespace" : "omms-qa" , "resourceVersion" : "20064615" , "selfLink" : "/apis/extensions/v1beta1/namespaces/omms-qa/ingresses/omms-ingress" , "uid" : "c72ec48c-17dc-4df8-bf01-35ccab2a0812" }, "spec" :{ "rules" :[{ "host" : "omms-qa.kingsoft.com" , "http" :{ "paths" :[{ "backend" :{ "serviceName" : "tomcat-java" , "servicePort" :80}, "path" : "/" },{ "backend" :{ "serviceName" : "ommsweb" , "servicePort" :8000}, "path" : "/(api/.*)" },{ "backend" :{ "serviceName" : "ommsweb" , "servicePort" :8000}, "path" : "/(token/.*)" },{ "backend" :{ "serviceName" : "sysmanagefront" , "servicePort" :8000}, "path" : "/sysmanage/(.*)" }]}}]}, "status" :{ "loadBalancer" :{}}} kubernetes.io/ingress. class : nginx nginx.ingress.kubernetes.io/enable-cors: "true" nginx.ingress.kubernetes.io/proxy-connect-timeout: "600" nginx.ingress.kubernetes.io/proxy-read-timeout: "600" nginx.ingress.kubernetes.io/proxy-send-timeout: "600" nginx.ingress.kubernetes.io/rewrite-target: /$1 creationTimestamp: "2021-09-29T05:36:03Z" generation: 1 name: omms-ingress namespace : omms-qa resourceVersion: "20072464" selfLink: /apis/extensions/v1beta1/namespaces/omms-qa/ingresses/omms-ingress uid: b119fe91-0377-44ef-aa7b-9e3cffbb8191 spec: rules: - host: omms-qa.kingsoft.com http: paths: - backend: serviceName: tomcat-java servicePort: 80 path: / - backend: serviceName: ommsweb servicePort: 8000 path: /(api/.*) - backend: serviceName: ommsweb servicePort: 8000 path: /(token/.*) - backend: serviceName: sysmanagefront servicePort: 8000 path: /sysmanage/(.*) status: loadBalancer: {} |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」