目录

一、先分清:Docker、Tomcat、k8s 到底是 “干啥的”?

二、它们的 “合作关系”:从 Java 项目到集群部署的全流程

三、实际应用场景:什么时候该用谁?

1. 单独使用场景

2. 组合使用场景(最常见)

四、简单实操示例:手把手部署一个 Java 项目

1. 步骤 1:用 Docker 打包 Tomcat 镜像

2. 步骤 2:用 k8s 部署这个 Docker 镜像

五、常用使用方法:核心命令速查

1. Docker 核心命令

2. Tomcat 核心操作

3. k8s 核心命令

六、踩坑指南:常见问题 + 解决方法

1. Docker+Tomcat:访问项目 404

2. k8s:Pod 一直处于 Pending 状态

3. Tomcat:启动报错 “Address already in use”

七、段子解疑:抽象概念秒懂

1. 用 “小区物业” 理解 k8s 的 “编排”

2. 用 “外卖” 理解 Docker+Tomcat 的关系

3. 用 “奶茶店” 理解 k8s 的 “副本”

八、专业总结


大家好,我是做云原生运维的小大..刚入行时,我曾对着服务器上的 Docker 容器、Tomcat 进程和 k8s 控制台发懵:“为啥部署个 Java 项目,一会儿打包 Docker 镜像,一会儿启动 Tomcat,最后还要 k8s 来‘管闲事’?” 后来踩了无数坑才明白,这三者不是 “互斥选项”,而是从 “单机部署” 到 “集群运维” 的协同工具链。今天咱们就从定位、联系、实操到踩坑,一次性讲透,还会用段子帮你啃下抽象难点~

一、先分清:Docker、Tomcat、k8s 到底是 “干啥的”?

很多人混淆它们,核心是没搞懂各自的 “核心定位”—— 它们解决的是完全不同的问题,咱们用表格一目了然:

工具核心定位解决的核心痛点角色类比
Docker容器引擎(打包工具)开发 / 测试 / 生产环境不一致(“我这能跑啊”)外卖打包盒
TomcatJava Web 服务器(运行环境)Java 项目无法直接运行,需依赖 Web 容器外卖里的 “米饭”
k8s容器编排平台(管理工具)多容器集群的运维(启停 / 扩容 / 高可用)小区物业

重点标显

  • Docker 不负责 “运行项目”,只负责 “把项目和运行环境打包成容器”;
  • Tomcat 不负责 “环境一致性”,只负责 “让 Java 项目在容器里跑起来”;
  • k8s 不负责 “打包或运行”,只负责 “管理一堆容器的生命周期”。

二、它们的 “合作关系”:从 Java 项目到集群部署的全流程

三者不是 “二选一”,而是 “流水线协作”,以部署一个 Spring MVC 项目为例,完整链路是这样的:

  1. 开发端:写好 Java 项目,打成 War 包(比如my-project.war);
  2. Docker 打包:写一个 Dockerfile,把 “Tomcat 镜像” 和 “War 包” 一起打包成新镜像(比如my-tomcat:v1)—— 相当于 “用外卖盒(Docker)装起米饭(Tomcat)和菜(Java 项目)”;
  3. k8s 部署:用 k8s 的 Deployment 配置,指定 “启动 3 个my-tomcat:v1容器副本”,并通过 Service 暴露访问端口 —— 相当于 “物业(k8s)安排 3 个‘打包好的外卖’(容器)上架,还贴上门牌号(Service)方便别人找到”;
  4. 用户访问:用户通过 k8s 的 Service 地址访问,请求会被分发到任意一个容器上,实现高可用。

重点标显

  • 没有 Docker:Tomcat 和项目在不同环境可能 “水土不服”(比如开发端 Tomcat 8,生产端 Tomcat 9);
  • 没有 Tomcat:Docker 容器里只有项目文件,Java 项目 “没地方跑”;
  • 没有 k8s:几十上百个 Docker 容器需要手动启停、监控,运维能累到 “脱发”。

三、实际应用场景:什么时候该用谁?

1. 单独使用场景

  • Docker:个人开发 / 小型项目的 “环境一致性” 需求。比如你本地开发用 Ubuntu,测试环境是 CentOS,用 Docker 打包后,测试端直接运行镜像,不用再装依赖;
  • Tomcat:单机部署 Java Web 项目。比如公司内部的 OA 系统,用户少、访问量低,直接在服务器上装 Tomcat,把 War 包扔到webapps目录就能跑;
  • k8s:微服务集群 / 高可用场景。比如电商的订单系统、支付系统,需要几十上百个容器,还要应对 “双 11” 的流量峰值,k8s 能自动扩容、故障恢复。

2. 组合使用场景(最常见)

  • Docker + Tomcat:中小型 Java 项目的 “跨环境部署”。比如把 Tomcat 和项目打包成镜像,部署到不同服务器,不用再手动配置 Tomcat;
  • Docker + Tomcat + k8s:大型微服务的 “集群运维”。比如某互联网公司的用户服务,用 k8s 部署 10 个 Tomcat 容器副本,通过 Service 负载均衡,当某个容器挂了,k8s 自动重启,流量无缝切换。

四、简单实操示例:手把手部署一个 Java 项目

咱们以 “用 Docker 打包 Tomcat+Java 项目,再用 k8s 管理” 为例,走一遍核心步骤(假设你已有 Java War 包my-project.war)。

1. 步骤 1:用 Docker 打包 Tomcat 镜像

创建Dockerfile(核心配置):

dockerfile

# 基础镜像:用官方Tomcat 8(避免环境差异)
FROM tomcat:8-jdk8# 重点:删除Tomcat默认的ROOT项目(避免冲突)
RUN rm -rf /usr/local/tomcat/webapps/ROOT# 把本地的War包复制到Tomcat的webapps/ROOT(这样访问时不用加项目名)
COPY my-project.war /usr/local/tomcat/webapps/ROOT.war# 暴露Tomcat默认端口8080
EXPOSE 8080# 启动Tomcat(用官方镜像的启动脚本)
CMD ["catalina.sh", "run"]

然后构建镜像:

# 重点命令:-t 给镜像起名(my-tomcat)+ 版本(v1),. 表示当前目录找Dockerfile
docker build -t my-tomcat:v1 .

本地测试镜像是否能跑:

docker run -d -p 8080:8080 --name test-tomcat my-tomcat:v1
# 访问 http://localhost:8080,能看到项目页面说明成功

2. 步骤 2:用 k8s 部署这个 Docker 镜像

创建 k8s 部署配置文件tomcat-deploy.yaml

yaml

apiVersion: apps/v1
kind: Deployment
metadata:name: tomcat-deployment  # 部署名
spec:replicas: 3  # 重点:启动3个副本(高可用)selector:matchLabels:app: tomcattemplate:metadata:labels:app: tomcatspec:containers:- name: tomcat-containerimage: my-tomcat:v1  # 用刚才构建的Docker镜像ports:- containerPort: 8080  # 容器内部端口resources:  # 可选:限制资源(避免占用太多)limits:cpu: "1"memory: "1Gi"requests:cpu: "0.5"memory: "512Mi"
---
# 重点:创建Service,让外部能访问容器(相当于“门牌号”)
apiVersion: v1
kind: Service
metadata:name: tomcat-service
spec:type: NodePort  # 适合测试:暴露节点端口selector:app: tomcat  # 和Deployment的label对应ports:- port: 8080  # Service内部端口targetPort: 8080  # 容器端口nodePort: 30080  # 外部访问端口(30000-32767之间)

然后部署到 k8s:

# 重点命令:应用配置文件
kubectl apply -f tomcat-deploy.yaml# 查看部署状态
kubectl get pods  # 能看到3个Running的pod
kubectl get service tomcat-service  # 能看到暴露的节点端口30080

外部访问:http://k8s-node-ip:30080,就能访问到 Java 项目了。

五、常用使用方法:核心命令速查

1. Docker 核心命令

功能命令示例重点说明
构建镜像docker build -t 镜像名:版本 .末尾的 “.” 不能漏
运行容器docker run -d -p 宿主端口:容器端口 镜像名-d 表示后台运行
查看运行中的容器docker ps加 -a 看所有容器
查看容器日志docker logs -f 容器名/ID-f 实时跟踪日志
停止容器docker stop 容器名/ID强制停止用 docker kill

2. Tomcat 核心操作

功能操作方法重点说明
启动(Linux)./bin/startup.sh需先给脚本执行权限(chmod +x)
停止(Linux)./bin/shutdown.sh强制停止用 kill -9 进程号
修改端口编辑 conf/server.xml 中的 <Connector port="8080">避免端口冲突
部署项目把 War 包放到 webapps 目录重启 Tomcat 生效

3. k8s 核心命令

功能命令示例重点说明
应用配置文件kubectl apply -f 文件名.yaml新增 / 更新资源都能用
查看 Pod 状态kubectl get pods加 -o wide 看节点信息
查看 Pod 日志kubectl logs -f pod名加 -c 容器名(多容器时)
进入 Pod 内部kubectl exec -it pod名 -- /bin/bash调试用
扩缩容副本数kubectl scale deployment 部署名 --replicas=5快速调整副本数量

六、踩坑指南:常见问题 + 解决方法

1. Docker+Tomcat:访问项目 404

  • 问题现象:Docker 容器启动成功,但访问http://localhost:8080报 404;
  • 核心原因:War 包没放到 Tomcat 的正确路径,或没重命名为ROOT.war
  • 解决步骤
    1. 进入容器查看路径:docker exec -it 容器名 ls /usr/local/tomcat/webapps
    2. 确认 War 包是否存在,若不存在,检查 Dockerfile 的COPY路径是否正确;
    3. 若存在但不是ROOT.war,修改 Dockerfile 为COPY my-project.war /usr/local/tomcat/webapps/ROOT.war,重新构建镜像。

2. k8s:Pod 一直处于 Pending 状态

  • 问题现象kubectl get pods显示 Pod 状态为 Pending,事件里提示 “no nodes available to schedule pods”;
  • 核心原因:k8s 节点资源不足(CPU / 内存),或节点有污点(Taint);
  • 解决步骤
    1. 查看事件详情:kubectl describe pod pod名,找到 “Events” 部分;
    2. 若提示 “Insufficient cpu”,修改tomcat-deploy.yamlresources.limits.cpu为更小值(比如 0.5);
    3. 若提示 “Taint toleration not found”,给 Pod 添加污点容忍(Toleration),或移除节点污点。

3. Tomcat:启动报错 “Address already in use”

  • 问题现象:Tomcat 启动时提示 “8080 端口被占用”;
  • 核心原因:服务器上其他进程占用了 8080 端口;
  • 解决步骤
    1. 查找占用端口的进程:netstat -tulpn | grep 8080(Linux);
    2. 若进程可停止,用kill -9 进程号停止;
    3. 若进程不能停,修改 Tomcat 的conf/server.xml,把<Connector port="8080">改成其他端口(比如 8081),重启 Tomcat。

七、段子解疑:抽象概念秒懂

1. 用 “小区物业” 理解 k8s 的 “编排”

k8s 的 “编排” 到底是啥?其实就是 “小区物业的日常”:

  • Docker 容器 = 小区里的住户;
  • k8s = 物业;
  • 住户(容器)家里水管爆了(挂了),物业(k8s)不用你打电话,直接派维修员换个新住户(重启副本);
  • 小区人多了(容器多了),物业分单元管理(命名空间 Namespace),避免混乱;
  • 外人要找住户(外部访问),物业给个门牌号(Service),不用记住户的具体房间号(Pod IP);
  • 住户要用电(资源),物业规定每户最多用多少(resources.limits),避免有人占太多导致其他人没电用。

2. 用 “外卖” 理解 Docker+Tomcat 的关系

Docker 和 Tomcat 的配合,就像 “外卖套餐”:

  • Docker = 外卖盒;
  • Tomcat = 外卖里的米饭;
  • 你的 Java 项目 = 外卖里的菜;
  • 没有外卖盒(Docker):米饭(Tomcat)和菜(项目)容易撒(环境不一致),比如你在公司点的菜,带回家就凉了(依赖缺失);
  • 没有米饭(Tomcat):菜(项目)没法吃(Java 项目不能直接运行,需要 Web 容器解析);
  • 外卖盒里装着米饭和菜,不管你在公司、家里还是咖啡店(不同服务器),打开就能吃(一致部署)。

3. 用 “奶茶店” 理解 k8s 的 “副本”

k8s 的 “副本(Replicas)”,就是奶茶店的 “备用珍珠”:

  • 你点一杯奶茶(用户发一个请求),需要加珍珠(容器处理请求);
  • 如果珍珠不够(容器数量少),后面的人就要等(请求排队),店员赶紧加备用珍珠(k8s 扩容副本);
  • 如果有一颗珍珠坏了(容器挂了),店员直接换一颗新的(k8s 重启副本),你完全没感觉,继续喝奶茶;
  • 奶茶店打烊(服务下线),店员把所有珍珠收走(k8s 删除 Pod),下次开门再拿新的(重新部署)。

八、专业总结

Docker、Tomcat 与 k8s 的关系,本质是云原生架构下 “从单机到集群” 的工具协同链

  • Docker是基础:解决了 “环境一致性” 问题,让 “一次打包,到处运行” 成为可能,是容器化的基石;
  • Tomcat是核心:作为 Java 生态的主流 Web 服务器,是 Java 项目容器化的 “必需运行环境”,没有它,Java 项目无法在 Docker 容器中生效;
  • k8s是升华:基于 Docker 实现了 “容器集群的自动化管理”,解决了高可用、弹性扩容、故障自愈等运维痛点,让微服务架构落地成为可能。

三者并非替代关系,而是 “打包→运行→管理” 的递进:小项目可用 Docker+Tomcat 快速部署,大项目则需 k8s 实现集群化运维。理解它们的定位和协同逻辑,才能在云原生路上少走弯路~

如果大家在实操中遇到其他问题,欢迎在评论区留言,咱们一起讨论解决!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/920973.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/920973.shtml
英文地址,请注明出处:http://en.pswp.cn/news/920973.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

测试覆盖率不够高?这些技巧让你的FastAPI测试无懈可击!

url: /posts/0577d0e24f48b3153b510e74d3d1a822/ title: 测试覆盖率不够高?这些技巧让你的FastAPI测试无懈可击! date: 2025-09-02T01:49:10+08:00 lastmod: 2025-09-02T01:49:10+08:00 author: cmdragon summary: FastAPI通过TestClient工具支持单元测试,模拟HTTP请求直接…

Qwen3-Reranker-0.6B 模型结构

模型加载 import torch from modelscope import AutoModel, AutoTokenizer, AutoModelForCausalLMtokenizer AutoTokenizer.from_pretrained("Qwen/Qwen3-Reranker-0.6B", padding_sideleft) model AutoModelForCausalLM.from_pretrained("Qwen/Qwen3-Reranke…

无参 MOS 算法的评估方式

一、无参 MOS 算法 在音频处理和质量评估领域&#xff0c;MOS&#xff08;Mean Opinion Score&#xff09;是一种常用的主观评价指标&#xff0c;用于衡量音频质量。然而&#xff0c;获取主观 MOS 评分通常需要大量的人力和时间。因此&#xff0c;无参 MOS 算法应运而生&#…

Flowable——配置使用Flowable-UI

文章目录 前言 框架选型与版本 flowable-ui 搭建 依赖引入 springboot 主要版本 flowable 相关 log4j 日志配置项 配置文件 log4j配置文件 application.yml 增加启动类并启动程序 项目整体结构 前言 最近对工作流的flowable比较感兴趣,汇总记录一下相关的研究学习知识点。 框…

2025大学生必考互联网行业证书排名​

在互联网行业蓬勃发展的当下&#xff0c;大学生若想毕业后顺利投身其中&#xff0c;提前考取相关高含金量证书不失为明智之举。这些证书不仅能证明专业能力&#xff0c;还能在求职时为你增添竞争优势。接下来&#xff0c;为大家详细介绍 2025 年大学生必考的互联网行业证书排名…

【并发系列-01】高并发系统架构设计原理

【并发系列-01】高并发系统架构设计原理 1. 业务场景&#xff1a;当双11遇上技术挑战 1.1 问题场景描述 想象一下这样的场景&#xff1a;某电商平台在双11期间&#xff0c;短短30分钟内涌入了500万用户&#xff0c;同时发起了超过2000万次商品查询请求和100万次下单操作。而平时…

【Vue2 ✨】Vue2 入门之旅(八):过渡与动画

前几篇我们学习了事件处理。本篇将介绍 过渡与动画&#xff0c;让 Vue 页面更加生动。 目录 transition 组件进入与离开过渡过渡类名结合 CSS 动画JavaScript 钩子小结 transition 组件 Vue 提供了内置组件 <transition>&#xff0c;可以为元素或组件的进入和离开添加动…

【LeetCode】力扣刷题攻略路线推荐!适合新手小白入门~(含各类题目序号)

力扣上有许多数据结构及算法的练习&#xff0c;但是如果由第一题【两数之和】开始刷&#xff0c;会让50%的人倒在起点。所以我们刷题要讲究路线攻略以及技巧~大体路线方向由简入难数学数组链表字符串哈希表双指针递归栈队列树图与回溯算法贪心动态规划刷题技巧 建议刷题的时候分…

Windows 电脑发现老是自动访问外网的域名排障步骤

Windows 电脑发现老是自动访问外网的域名,如何排障 一、基础信息获取与进程定位 1.1、确认进程关键信息 1.2、进程合法性初步验证 二、网络连接深度分析 2.1、目的IP/域名溯源 2.2、端口与协议检查 三、进程行为与系统异常排查 3.1、进程启动与依赖分析 3.2、系统异常行为扫描…

curl、python-requests、postman和jmeter的对应关系

一、初识curlcurl 是一个功能强大的命令行工具&#xff0c;用于传输数据&#xff0c;支持多种协议&#xff08;如 HTTP、HTTPS、FTP 等&#xff09;。分析以下curl&#xff1a;curl "https://$HOST/mon/adm/au/opera" --header "Authorization: $AUTH" -X …

【MySQL】初识数据库基础

【MySQL】初识数据库基础 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;MySQL笔记 文章目录【MySQL】初识数据库基础前言一. 数据库基础&#xff08;重点&#xff09;1.1 什么是数据库1.2 主流数据库1.3 基本使用1.3.1 MySQL安装1.3.2 连接…

微服务Docker-compose之若依部署

目录 1.创建一个文件夹 2.上传压缩包 3.解压 4.执行ry1文件 5.执行ry2文件 6.进入nginx的html目录解压dist文件 7.执行ry3文件 8.访问nacos 9.访问若依 1.创建一个文件夹 2.上传压缩包 3.解压 4.执行ry1文件 5.执行ry2文件 6.进入nginx的html目录解压dist文件 7.执行ry…

《中国棒球》健将级运动员什么水平·棒球1号位

棒球国家健将级の神级科普&#xff5c;国内TOP1%⚾️国际能打吗&#xff1f;1. 什么是"国家健将级"&#xff1f;&#xff5c;What is "Master Sportsman"&#xff1f;中国运动员等级天花板&#xff1a;仅次"国际健将"的最高国家级荣誉&#xff0…

NAT与内网穿透

目录 一、为什么需要NAT&#xff1f; 二、NAT的核心&#xff1a;从“一对一”到“多对一” &#xff08;1&#xff09;静态NAT &#xff08;2&#xff09;动态NAT &#xff08;3&#xff09;NAPT 三、NAPT的双刃剑&#xff1a;安全与局 四、内网穿透 &#xff08;1&…

力扣222 代码随想录Day15 第四题

完全二叉树结点的数量class Solution { public:int countNodes(TreeNode* root) {if(rootNULL) return 0;TreeNode* leroot->left;TreeNode* riroot->right;int ld0;int rd0;while(le){lele->left;ld;}while(ri){riri->right;rd;}if(ldrd) return(2<<ld)-1;i…

Node.js异步编程:Callback/Promise/Async

Node.js异步编程&#xff1a;Callback/Promise/Async引言Node.js以其非阻塞I/O和事件驱动架构而闻名&#xff0c;这使得异步编程成为Node.js开发中的核心概念。在Node.js中&#xff0c;处理异步操作经历了从Callback到Promise再到Async/Await的演进过程。本文将探讨这三种异步编…

野火STM32Modbus主机读取寄存器/线圈失败(一)-解决接收中断不触发的问题

接收中断不触发 前情提要 在自己的开发板上移植了野火的modbus主机程序。 野火主机程序移植 野火主机代码理解与使用 问题背景 我使用STM32显示板作为Modbus主机连接电脑&#xff0c;并在电脑上运行Modbus Slave软件。测试中发现&#xff0c;读取保持寄存器和输入寄存器均失…

5种常见的网络安全漏洞及防护建议

五种常见的网络安全漏洞及防护建议在数字化时代&#xff0c;网络安全已成为个人和企业面临的重要挑战。网络攻击手段不断升级&#xff0c;黑客利用各种漏洞入侵系统、窃取数据或破坏服务。了解常见的网络安全漏洞并采取相应的防护措施&#xff0c;是保障信息安全的关键。本文将…

mysql5.6+分页时使用 limit+order by 会出现数据重复问题

mysql5.6分页时使用 limitorder by 会出现数据重复问题 问题描述 在MySQL中我们通常会采用limit来进行翻页查询&#xff0c;比如limit(0,10)表示列出第一页的10条数据&#xff0c;limit(10,10)表示列出第二页。但是&#xff0c;当limit遇到order by的时候&#xff0c;可能会出现…

【XR技术概念科普】VST(视频透视)vs OST(光学透视):解码MR头显的两种核心技术路径

混合现实(MR)头显作为连接虚拟与现实世界的桥梁&#xff0c;其核心技术路径主要分为视频透视(VST)和光学透视(OST)两种。本文将深入探讨这两种技术的原理、优缺点、代表性产品、应用场景及未来发展趋势&#xff0c;为读者全面解析MR头显的技术选择。一、VST技术详解1.1 VST技术…