当前位置: 首页 > news >正文

一个实验搞懂 Docker 和 K8s 怎么配合

🗂️ 我的项目目录(12 个关键文件)

text

/root/message-board/ │ ├── backend/ ← 【Docker 相关】打包后端用的 │ ├── Dockerfile ← 告诉 Docker 怎么打包后端 │ ├── package.json ← 后端依赖列表(供 Docker 构建时用) │ └── server.js ← 后端代码(被 Docker 打包进镜像) │ ├── frontend/ ← 【Docker 相关】打包前端用的 │ ├── Dockerfile ← 告诉 Docker 怎么打包前端 │ ├── index.html ← 前端页面(被 Docker 打包进镜像) │ ├── app.js ← 前端逻辑(被 Docker 打包进镜像) │ └── config.js ← 前端配置(被 Docker 打包进镜像,但 K8s 会覆盖它) │ └── k8s/ ← 【K8s 相关】告诉 K8s 怎么部署 ├── namespace.yaml ← 告诉 K8s:创建一个叫 message-board 的文件夹 ├── api-deployment.yaml ← 告诉 K8s:后端容器怎么跑 ├── api-service.yaml ← 告诉 K8s:后端端口怎么对外暴露 ├── frontend-configmap.yaml ← 告诉 K8s:前端配置内容是什么 ├── frontend-deployment.yaml ← 告诉 K8s:前端容器怎么跑 └── frontend-service.yaml ← 告诉 K8s:前端端口怎么对外暴露

一、Docker 环节:哪些文件参与了?怎么参与的?

你执行的命令

bash

docker build -t message-api:v1 ./backend docker build -t message-frontend:v1 ./frontend

第一个命令:docker build -t message-api:v1 ./backend

文件在这个命令中扮演的角色
backend/Dockerfile主文件。Docker 读取它,按里面的步骤一步步执行
backend/package.json被 Dockerfile 里的COPY package.json ./复制进镜像,然后执行npm install装依赖
backend/server.js被 Dockerfile 里的COPY server.js ./复制进镜像,成为容器的运行代码

Dockerfile 怎么说的:

dockerfile

FROM node:20-alpine # 基础环境:装好 Node.js 的 Linux COPY package.json ./ # 把依赖列表复制进去 RUN npm install # 在镜像里安装依赖 COPY server.js ./ # 把代码复制进去 CMD ["npm", "start"] # 容器启动时执行 node server.js

最终产出message-api:v1镜像。这个镜像 = Node.js 环境 + 你的代码 + 依赖。

第二个命令:docker build -t message-frontend:v1 ./frontend

文件在这个命令中扮演的角色
frontend/Dockerfile主文件。Docker 读取它,按里面的步骤执行
frontend/index.html被复制进镜像,成为 Nginx 提供的页面
frontend/app.js被复制进镜像,页面加载后执行
frontend/config.js被复制进镜像,但 K8s 部署时会用 ConfigMap 覆盖它

Dockerfile 怎么说的:

dockerfile

FROM nginx:1.25-alpine # 基础环境:装好 Nginx 的 Linux COPY index.html /usr/share/nginx/html/ # 复制页面 COPY app.js /usr/share/nginx/html/ # 复制 JS COPY config.js /usr/share/nginx/html/ # 复制配置

最终产出message-frontend:v1镜像。这个镜像 = Nginx + 你的前端文件。

Docker 环节总结

你的文件被谁用了用来干什么
backend/DockerfileDocker 读取指导构建后端镜像
backend/package.jsonDocker 构建时复制进去在镜像里装依赖
backend/server.jsDocker 构建时复制进去成为容器的运行代码
frontend/DockerfileDocker 读取指导构建前端镜像
frontend/index.htmlDocker 构建时复制进去成为 Nginx 的页面
frontend/app.jsDocker 构建时复制进去成为页面逻辑
frontend/config.jsDocker 构建时复制进去作为默认配置,后续被 K8s ConfigMap 覆盖

二、K8s 环节:哪些文件参与了?怎么参与的?

你执行的命令

bash

kubectl apply -f k8s/namespace.yaml kubectl apply -f k8s/api-deployment.yaml kubectl apply -f k8s/api-service.yaml kubectl apply -f k8s/frontend-configmap.yaml kubectl apply -f k8s/frontend-deployment.yaml kubectl apply -f k8s/frontend-service.yaml

逐一拆解每个 YAML 文件的作用

k8s/namespace.yaml

yaml

apiVersion: v1 kind: Namespace metadata: name: message-board

作用:告诉 K8s 创建一个叫message-board的“文件夹”,后面所有资源都放里面。

和 Docker/K8s 的关系:纯 K8s 概念。Docker 不参与。

k8s/api-deployment.yaml

yaml

apiVersion: apps/v1 kind: Deployment metadata: name: message-api namespace: message-board spec: replicas: 1 template: spec: containers: - name: message-api image: message-api:v1 # ← 关键!用的就是 Docker 构建的镜像 imagePullPolicy: IfNotPresent ports: - containerPort: 3000

作用:告诉 K8s——“我要运行 1 个容器,用message-api:v1这个镜像(Docker 刚打好的),它监听 3000 端口”。

和 Docker 的关系image: message-api:v1直接引用 Docker 构建的镜像。

k8s/api-service.yaml

yaml

apiVersion: v1 kind: Service metadata: name: message-api namespace: message-board spec: type: NodePort selector: app: message-api ports: - port: 3000 targetPort: 3000 nodePort: 30787

作用:告诉 K8s——“把后端 Pod 的 3000 端口映射到集群的 30787 端口,让外部能访问”。

和 Docker 的关系:引用的是 Pod(容器),通过selector: app: message-api找到 Deployment 创建的容器。

k8s/frontend-configmap.yaml

yaml

apiVersion: v1 kind: ConfigMap metadata: name: frontend-config namespace: message-board data: config.js: | window.APP_CONFIG = { APP_TITLE: "K8s班级留言板", API_BASE_URL: "http://192.168.116.168:30787" };

作用:告诉 K8s——“这里有一份前端配置文件,内容如上”。

和 Docker 的关系:这个文件的内容会覆盖Docker 构建时打包进去的config.js。这就是“配置与镜像分离”。

k8s/frontend-deployment.yaml

yaml

apiVersion: apps/v1 kind: Deployment metadata: name: message-frontend namespace: message-board spec: replicas: 1 template: spec: containers: - name: message-frontend image: message-frontend:v1 # ← 关键!用的就是 Docker 构建的镜像 ports: - containerPort: 80 volumeMounts: - name: frontend-config mountPath: /usr/share/nginx/html/config.js subPath: config.js # ← 用 ConfigMap 覆盖镜像里的 config.js volumes: - name: frontend-config configMap: name: frontend-config

作用

  1. 告诉 K8s——“运行 1 个前端容器,用message-frontend:v1镜像”

  2. 同时告诉 K8s——“把 ConfigMap 里的配置挂进去,覆盖镜像里原来的 config.js”

和 Docker 的关系

  • image: message-frontend:v1引用 Docker 构建的镜像

  • volumeMounts用 ConfigMap 覆盖镜像里的文件

k8s/frontend-service.yaml

yaml

apiVersion: v1 kind: Service metadata: name: message-frontend namespace: message-board spec: type: NodePort selector: app: message-frontend ports: - port: 80 targetPort: 80 nodePort: 30082

作用:告诉 K8s——“把前端 Pod 的 80 端口映射到集群的 30082 端口,让用户浏览器能访问页面”。

和 Docker 的关系:引用的是 Pod(容器),通过selector: app: message-frontend找到 Deployment 创建的容器。

三、一张图:每个文件对应到 Docker/K8s 的哪个环节

text

┌─────────────────────────────────────────────────────────────────────┐ │ 【Docker 环节】 │ ├─────────────────────────────────────────────────────────────────────┤ │ 输入文件 → 输出 │ │ ├── backend/Dockerfile → │ │ ├── backend/package.json → message-api:v1 镜像 │ │ └── backend/server.js → │ │ │ │ ├── frontend/Dockerfile → │ │ ├── frontend/index.html → message-frontend:v1 镜像 │ │ ├── frontend/app.js → │ │ └── frontend/config.js → (默认配置,会被覆盖) │ └─────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────┐ │ 【K8s 环节】 │ ├─────────────────────────────────────────────────────────────────────┤ │ 输入文件 → 作用 │ │ ├── namespace.yaml → 创建“message-board”文件夹 │ │ ├── api-deployment.yaml → 用 message-api:v1 启动后端容器│ │ ├── api-service.yaml → 后端暴露 30787 端口 │ │ ├── frontend-configmap.yaml → 创建前端配置(API 地址) │ │ ├── frontend-deployment.yaml → 用 message-frontend:v1 + │ │ │ ConfigMap 覆盖 config.js │ │ └── frontend-service.yaml → 前端暴露 30082 端口 │ └─────────────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────────┐ │ 【最终运行】 │ ├─────────────────────────────────────────────────────────────────────┤ │ 浏览器访问 http://192.168.116.168:30082 → 看到留言板页面 ✅ │ └─────────────────────────────────────────────────────────────────────┘

四、我之前疑惑的几个点,现在用文件回答

你的疑惑用文件回答
Docker 怎么用的?backend/Dockerfilefrontend/Dockerfile,分别生成message-api:v1message-frontend:v1两个镜像
K8s 怎么用的?k8s/目录下的 6 个 YAML 文件,告诉 K8s 怎么运行、暴露、配置这两个镜像
配置文件怎么改?frontend/config.js本来在镜像里,但 K8s 部署时用frontend-configmap.yaml覆盖它
镜像和 YAML 什么关系?api-deployment.yaml里的image: message-api:v1引用 Docker 构建的镜像;frontend-deployment.yaml里的image: message-frontend:v1同理
Node2 收到什么?Node2 没有收到 YAML 文件,收到的是 K8s 的指令:“用 message-api:v1 启动容器”

五、一句话总结

Docker读了backend/Dockerfilefrontend/Dockerfile,生成了 2 个镜像(message-api:v1message-frontend:v1)。
K8s读了k8s/目录下的 6 个 YAML 文件,拿着这 2 个镜像在集群里启动容器、暴露端口、注入配置,最终让用户通过http://192.168.116.168:30082访问到留言板。

http://www.jsqmd.com/news/1067115/

相关文章:

  • Chroma GUI - Chroma 向量数据库可视化管理工具
  • AMD 显卡驱动更新指南,确保 Strix Halo 大模型部署不掉链子
  • 混合检索深度解析:大模型应用中的召回革命与精度突围
  • 基于JAX的函数式时序预测:Chronax库的核心原理与实践指南
  • 今天很开心
  • 传统电话报备 vs 智能手环监管,电力安全差距一目了然
  • 独立站品牌出海,做出高级的品牌
  • 电力系统的“安全卫士”是怎样炼成的?答案藏在这个实验台里
  • 深度技术揭秘:OpenCore Legacy Patcher如何让老Mac突破硬件限制运行最新macOS
  • 3步完成专业Windows部署:MediaCreationTool.bat批处理工具深度解析与实战指南
  • 静态库和动态库的开发使用
  • AI项目经理/产品经理薪资狂飙50%?掌握这技术,2026年职场无人能敌!
  • 为什么顶尖实验室已弃用手工特征?2026奇点大会公布的“特征熵阈值”动态判据,让AutoFE真正落地产线
  • 非正式同行评审:动机、实践与平台挑战
  • 【AI原生指令微调终极指南】:2026奇点大会核心方法论首次解密,3大工业级调优范式+5类失效场景避坑清单
  • 最大抖动低至1微秒,望获OS支持奥特思AnyControl EtherCAT运动控制主站
  • AI应用安全:JNDI注入与无文件内存马攻击的深度解析与防御
  • DataDjinn v0.2.0:桌面界面焕新,查询工作区和 AI 面板都更像一个完整产品了
  • ATWILC系列Wi-Fi/BT驱动移植:内核配置与设备树适配实战
  • 华尔街神秘量化公司 Jane Street:押注 AI 基建与模型,投资回报超 50 倍!
  • 从 7B 到 32B,Strix Halo 笔记本运行大模型性能阶梯测试
  • AI面试必看!35道核心问题深度解析,助你拿下高薪Offer!
  • 五金企业老板最头疼的几个管理问题,数字化到底能解决几个
  • SMUDebugTool终极指南:免费开源AMD Ryzen处理器调试工具轻松上手
  • 字符串与字符指针——没有 string 类型的世界
  • 原来公墓陵园设计还有好用的老牌服务商?究竟好在哪?
  • 港科大提出Robust-U1:MLLM自我修复受损视觉内容
  • 呼和浩特新城区今日黄金回收行情与靠谱机构全解析 - 全城黄金专业上门回收
  • 从被动清仓到主动预防,仓库周转的逻辑需要调整
  • 2026年Java岗八股文面试大全(金九银十最新版,含答案解析)