Dockerfile講解與示例匯總

容器化技術已經成為應用開發和部署的標準方式,而Docker作為其中的佼佼者,以其輕量、高效、可移植的特性,深受開發者和運維人員的喜愛。本文將從實用角度出發,分享各類常用服務的Docker部署腳本與最佳實踐,希望能幫助各位在容器化之路上少走彎路。

無論你是剛接觸Docker的新手,還是尋求優化部署方案的老手,相信這篇文章都能為你提供一些有價值的參考。

Nginx部署:靜態資源服務與反向代理

Nginx作為高性能的Web服務器和反向代理,是容器化部署中的常客。以下是一個實用的Nginx容器化配置,特別適合前端應用部署和API網關場景。

Dockerfile

FROM nginx:1.21-alpine# 設置時區為中國時區
ENV TZ=Asia/Shanghai# 創建非root用戶nginx
RUN addgroup -g 101 -S nginx \&& adduser -S -D -H -u 101 -h /var/cache/nginx -s /sbin/nologin -G nginx -g nginx nginx \&& apk --no-cache add tzdata \&& ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \&& echo $TZ > /etc/timezone \# 清理臨時文件,減小鏡像體積&& rm -rf /var/cache/apk/*# 自定義Nginx配置
COPY nginx.conf /etc/nginx/nginx.conf
COPY default.conf /etc/nginx/conf.d/default.conf# 創建必要的目錄并設置正確的權限
RUN mkdir -p /usr/share/nginx/html /var/log/nginx \&& chown -R nginx:nginx /usr/share/nginx/html /var/log/nginx /etc/nginx/conf.d \&& chmod -R 755 /usr/share/nginx/html /var/log/nginx# 使用非root用戶運行
USER nginx# 暴露默認的HTTP和HTTPS端口
EXPOSE 80 443# 啟動nginx
CMD ["nginx", "-g", "daemon off;"]

這個Dockerfile構建了一個基于Alpine的輕量級Nginx鏡像,并進行了一些安全性和性能的優化。

部署命令

# 構建鏡像
docker build -t my-nginx:v1.0 -f ops/nginx/Dockerfile .# 運行容器(掛載靜態資源和配置)
docker run -d --name web-server \-p 80:80 -p 443:443 \-v /path/to/html:/usr/share/nginx/html \-v /path/to/conf:/etc/nginx/conf.d \-v /path/to/logs:/var/log/nginx \--restart always \my-nginx:v1.0

使用技巧

  1. 配置文件掛載:將Nginx配置文件掛載到容器外部,方便修改配置而無需重建鏡像
  2. 日志持久化:將日志目錄掛載出來,便于問題排查和日志分析
  3. 靜態資源更新:前端代碼可以直接更新掛載目錄,無需重啟容器
  4. 性能優化:根據實際場景調整worker進程數和連接數

在實際生產環境中,我們經常會將Nginx作為整個系統的入口,配合后端服務實現負載均衡和流量控制。

Java應用容器化部署

Java應用在企業級開發中占據重要地位,將Spring Boot等Java應用容器化可以顯著提升部署效率和環境一致性。

Dockerfile

FROM openjdk:8-jre-slim# 設置工作目錄
WORKDIR /app# 設置時區
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone# 創建非root用戶
RUN groupadd -r javauser && useradd -r -g javauser javauser# 創建日志和配置目錄
RUN mkdir -p /app/logs /app/config \&& chown -R javauser:javauser /app# 復制預先構建好的jar文件到容器中
COPY app.jar /app/app.jar
RUN chown javauser:javauser /app/app.jar# 切換到非root用戶
USER javauser# 設置環境變量
ENV JAVA_OPTS="-Xms512m -Xmx1024m"
ENV SPRING_PROFILES_ACTIVE="prod"# 暴露應用端口
EXPOSE 8080# 啟動應用
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]

為什么選擇openjdk:8-jre-slim而非openjdk:8?

在我們的Dockerfile中,選擇了openjdk:8-jre-slim作為基礎鏡像,這是經過深思熟慮的決定。以下是兩者的比較:

特性openjdk:8-jre-slimopenjdk:8
鏡像大小約170-180MB約500MB以上
包含組件僅JRE,用于運行Java應用完整JDK,包含編譯、調試工具
基礎系統基于Debian精簡版基于完整Debian
啟動時間更快較慢
安全面較小較大

使用jre-slim版本的優勢:

  1. 鏡像體積更小:體積減少60%以上,節省存儲空間、網絡帶寬,加快部署速度
  2. 資源占用更少:移除了不必要的組件,降低了內存占用
  3. 更高的安全性:減少了潛在的攻擊面,遵循最小權限原則
  4. 更適合微服務架構:輕量級容器更符合微服務的設計理念

什么情況下應考慮使用完整的openjdk:8:

  1. 當應用在運行時需要進行動態編譯(如使用JIT)
  2. 需要在容器中進行開發或調試
  3. 應用依賴于JDK中的特定工具(如javac、jmap等)

在我們的生產實踐中,對于絕大多數后端服務,jre-slim版本已經完全滿足需求,同時帶來了顯著的資源效率提升。正如DevOps的核心理念一樣,我們始終追求"恰到好處"的資源配置,而非過度配置。

部署命令

# 構建鏡像
docker build -t my-java-app:v1.0 -f ops/java/Dockerfile .# 運行容器
docker run -d --name java-service \-p 8080:8080 \-v /path/to/logs:/app/logs \-v /path/to/config:/app/config \-e JAVA_OPTS="-Xms512m -Xmx1024m" \-e SPRING_PROFILES_ACTIVE=prod \--restart always \my-java-app:v1.0

使用技巧

  1. 內存優化:通過環境變量調整JVM參數,適配不同規格的容器
  2. 配置外部化:將配置文件掛載到容器外,支持不同環境的配置管理
  3. 健康檢查:添加健康檢查端點,便于容器編排平臺進行自動故障恢復
  4. JVM調優:根據應用特性,調整GC策略和內存分配

在我們的生產環境中,Java應用通常會配合服務注冊中心(如Nacos或Eureka)實現微服務架構,容器化部署讓服務擴縮變得更加靈活。

Python應用容器化部署

Python因其簡潔高效的特性,在數據處理、AI和Web開發等領域廣受歡迎。容器化Python應用可以有效解決"在我機器上能運行"的問題。

Dockerfile

FROM python:3.9-slim# 設

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/78569.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78569.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/78569.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在QGraphicsView中精確地以鼠標為錨縮放圖片

在pyqt中以鼠標所在位置為錨點縮放圖片-CSDN博客中的第一個示例中,通過簡單設置: self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse) 使得QGraphicsView具有了以鼠標為錨進行縮放的功能。但是,其內部應當是利用了滾動條的移動來…

制造工廠如何借助電子看板實現高效生產管控

在當今高度競爭的制造業環境中,許多企業正面臨著嚴峻的管理和生產挑戰。首先,管理流程落后,大量工作仍依賴"人治"方式,高層管理者理論知識薄弱且不愿聽取專業意見。其次,生產過程控制能力不足,導…

在 C# .NET 中駕馭 JSON:使用 Newtonsoft.Json 進行解析與 POST 請求實戰

JSON (JavaScript Object Notation) 已經成為現代 Web 應用和服務之間數據交換的通用語言。無論你是開發后端 API、與第三方服務集成,還是處理配置文件,都繞不開 JSON 的解析與生成。在 C# .NET 世界里,處理 JSON 有多種選擇,其中…

Debian10系統安裝,磁盤分區和擴容

1、說明 過程記錄信息有些不全,僅作為參考。如有其它疑問,歡迎留言。 2、ISO下載 地址:debian-10.13.0鏡像地址 3、開始安裝 3.1、選擇圖形界面 3.2、選擇中文語言 3.3、選擇中國區域 3.4、按照提示繼續 3.5、選擇一個網口 3.6、創建管…

1.10軟考系統架構設計師:優秀架構設計師 - 練習題附答案及超詳細解析

優秀架構設計師綜合知識單選題 每道題均附有答案解析: 題目1 衡量優秀系統架構設計師的核心標準不包括以下哪項? A. 技術全面性與底層系統原理理解 B. 能夠獨立完成模塊開發與調試 C. 與利益相關者的高效溝通與協調能力 D. 對業務需求和技術趨勢的戰略…

MPI Code for Ghost Data Exchange in 3D Domain Decomposition with Multi-GPUs

MPI Code for Ghost Data Exchange in 3D Domain Decomposition with Multi-GPUs Here’s a comprehensive MPI code that demonstrates ghost data exchange for a 3D domain decomposition across multiple GPUs. This implementation assumes you’re using CUDA-aware MPI…

計算機考研精煉 計網

第 19 章 計算機網絡體系結構 19.1 基本概念 19.1.1 計算機網絡概述 1.計算機網絡的定義、組成與功能 計算機網絡是一個將分散的、具有獨立功能的計算機系統,通過通信設備與線路連接起來,由功能完善的軟件實現資源共享和信息傳遞的系統。 …

KUKA機器人自動備份設置

在機器人的使用過程中,對機器人做備份不僅能方便查看機器人的項目配置與程序,還能防止機器人項目和程序丟失時進行及時的還原,因此對機器人做備份是很有必要的。 對于KUKA機器人來說,做備份可以通過U盤來操作。也可以在示教器上設…

【wpf】 WPF中實現動態加載圖片瀏覽器(邊滾動邊加載)

WPF中實現動態加載圖片瀏覽器(邊滾動邊加載) 在做圖片瀏覽器程序時,遇到圖片數量巨大的情況(如幾百張、上千張),一次性加載所有圖片會導致界面卡頓甚至程序崩潰。 本文介紹一種 WPF Prism 實現動態分頁加…

Kubernetes》》k8s》》Taint 污點、Toleration容忍度

污點 》》 節點上 容忍度 》》 Pod上 在K8S中,如果Pod能容忍某個節點上的污點,那么Pod就可以調度到該節點。如果不能容忍,那就無法調度到該節點。 污點和容忍度的概念 》》污點等級——>node 》》容忍度 —>pod Equal——>一種是等…

SEO長尾關鍵詞優化核心策略

內容概要 在搜索引擎優化領域,長尾關鍵詞因其精準的流量捕獲能力與較低的競爭強度,已成為提升網站自然流量的核心突破口。本文圍繞長尾關鍵詞優化的全鏈路邏輯,系統拆解從需求洞察到落地執行的五大策略模塊,涵蓋用戶搜索意圖解析…

AWS中國區ICP備案全攻略:流程、注意事項與最佳實踐

導語 在中國大陸地區開展互聯網業務時,所有通過域名提供服務的網站和應用必須完成ICP備案(互聯網內容提供商備案)。對于選擇使用AWS中國區(北京/寧夏區域)資源的用戶,備案流程因云服務商的特殊運營模式而有所不同。本文將詳細解析AWS中國區備案的核心規則、操作步驟及避坑…

計算機視覺——通過 OWL-ViT 實現開放詞匯對象檢測

介紹 傳統的對象檢測模型大多是封閉詞匯類型,只能識別有限的固定類別。增加新的類別需要大量的注釋數據。然而,現實世界中的物體類別幾乎無窮無盡,這就需要能夠檢測未知類別的開放式詞匯類型。對比學習(Contrastive Learning&…

大語言模型的“模型量化”詳解 - 04:KTransformers MoE推理優化技術

基本介紹 隨著大語言模型(LLM)的規模不斷擴大,模型的推理效率和計算資源的需求也在迅速增加。DeepSeek-V2作為當前熱門的LLM之一,通過創新的架構設計與優化策略,在資源受限環境下實現了高效推理。 本文將詳細介紹Dee…

排序算法詳解筆記

評價維度 運行效率就地性穩定性 自適應性:自適應排序能夠利用輸入數據已有的順序信息來減少計算量,達到更優的時間效率。自適應排序算法的最佳時間復雜度通常優于平均時間復雜度。 是否基于比較:基于比較的排序依賴比較運算符(…

【“星瑞” O6 評測】 — llm CPU部署對比高通驍龍CPU

前言 隨著大模型應用場景的不斷拓展,arm cpu 憑借其獨特優勢在大模型推理領域的重要性日益凸顯。它在性能、功耗、架構適配等多方面發揮關鍵作用,推動大模型在不同場景落地 1. CPU對比 星睿 O6 CPU 采用 Armv9 架構,集成了 Armv9 CPU 核心…

Ocelot的應用案例

搭建3個項目,分別是OcelotDemo、ServerApi1和ServerApi2這3個項目。訪問都是通過OcelotDemo進行輪訓轉發。 代碼案例鏈接:https://download.csdn.net/download/ly1h1/90715035 1.架構圖 2.解決方案結構 3.步驟一,添加Nuget包 4.步驟二&…

DeepSeek+Dify之五工作流引用API案例

DeepSeekDify之四Agent引用知識庫案例 文章目錄 背景整體流程測試數據用到的節點開始HTTP請求LLM參數提取器代碼執行結束 實現步驟1、新建工作流2、開始節點3、Http請求節點4、LLM節點(大模型檢索)5、參數提取器節點(提取大模型檢索后數據&am…

《從分遺產說起:JS 原型與繼承詳解》

“天天開心就好” 先來講講概念: 原型(Prototype) 什么是原型? 原型是 JavaScript 中實現對象間共享屬性和方法的機制。每個 JavaScript 對象(除了 null)都有一個內部鏈接指向另一個對象,這…

立馬耀:通過阿里云 Serverless Spark 和 Milvus 構建高效向量檢索系統,驅動個性化推薦業務

作者:廈門立馬耀網絡科技有限公司大數據開發工程師 陳宏毅 背景介紹 行業 蟬選是蟬媽媽出品的達人選品服務平臺。蟬選秉持“陪伴達人賺到錢”的品牌使命,致力于洞悉達人變現需求和痛點,提供達人選高傭、穩變現、速響應的選品服務。 業務特…