從實操到原理:一文搞懂 Docker、Tomcat 與 k8s 的關系(附踩坑指南 + 段子解疑)

目錄

一、先分清: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技術…