使用 Dockerfile 與 Docker Compose 結合+Docker-compose.yml 文件詳解

使用 Dockerfile 與 Docker Compose 結合的完整流程

Dockerfile 用于定義單個容器的構建過程,而 Docker Compose 則用于編排多個容器。以下是結合使用兩者的完整方法:

1. 創建 Dockerfile

在項目目錄中創建 Dockerfile 定義應用鏡像的構建過程:

# 使用官方Python 3.6.8鏡像
FROM python:3.6.8-slimWORKDIR /app# 復制依賴文件
COPY requirements.txt .RUN pip install --upgrade pip
# 檢查并安裝依賴(自動處理未安裝的包)
RUN pip install --no-cache-dir -r requirements.txt || \{ echo "Failed to install some packages. Retrying with --upgrade..." && \pip install --no-cache-dir --upgrade -r requirements.txt; }# 復制應用代碼
COPY . .# 添加健康檢查(驗證Python環境)
HEALTHCHECK --interval=30s --timeout=10s \CMD python -c "import sys; from pkg_resources import require; require(open('requirements.txt').read())" || exit 1CMD ["python", "/app/HsSignalQa/server.py"]

2. 創建 docker-compose.yml

在相同目錄下創建 docker-compose.yml 文件:

version: '3.3'services:your-python-service:  # 你的服務名稱build: .container_name: hsrg-signal-container  # 可選:自定義容器名稱networks:znsxnet:aliases:- hsrg-signal  # 設置網絡別名ports:- "4000:8000"    # 端口映射volumes:- .:/app        # 掛載代碼目錄environment:- FLASK_ENV=production# 其他環境變量...networks:znsxnet:external: true     # 使用已存在的網絡

3. 完整工作流程

構建并啟動服務

# 構建鏡像并啟動所有服務
docker-compose up --build# 后臺運行模式
docker-compose up -d --build


Docker-compose.yml 文件詳解

Docker-compose.yml 是 Docker Compose 的核心配置文件,用于定義和運行多容器 Docker 應用程序。以下是該文件的詳細解析:

1. 文件結構概覽

version: '3.8'  # 指定 compose 文件版本services:       # 定義服務的容器service1:     # 第一個服務image: ...  # 服務配置service2:     # 第二個服務build: ...  # 服務配置networks:       # 定義網絡some-network:volumes:        # 定義數據卷some-volume:

2. 主要配置項詳解

version (必選)

指定 compose 文件格式版本,與 Docker Engine 版本兼容性相關:

version: '3.8'  # 推薦使用 3.x 系列的最新版

services (必選)

定義應用程序的各個服務(容器):

基本配置
services:webapp:image: nginx:1.21-alpine  # 使用現成鏡像# 或build: .                  # 使用 Dockerfile 構建build:context: ./dir          # 構建上下文路徑dockerfile: Dockerfile-alternate  # 指定 Dockerfileargs:                   # 構建參數buildno: 1container_name: my-webapp # 自定義容器名restart: unless-stopped   # 重啟策略(no, always, on-failure, unless-stopped)
網絡與端口
    ports:- "80:80"               # 主機端口:容器端口- "443:443"- "3000-3005:3000-3005" # 端口范圍expose:- "3000"                # 僅暴露給其他容器不映射到主機networks:- frontend- backend
環境變量
    environment:NODE_ENV: productionDATABASE_URL: postgres://user:pass@db:5432/db# 或使用文件env_file:- .env- .env.dev
數據持久化
    volumes:- /var/lib/mysql                # 匿名卷- ./data:/var/lib/mysql         # 綁定掛載- db_data:/var/lib/mysql        # 命名卷- config:/etc/config:ro         # 只讀掛載volumes_from:- service_name                 # 使用其他服務的卷
依賴與健康檢查
    depends_on:- db- redishealthcheck:test: ["CMD", "curl", "-f", "http://localhost"]interval: 1m30stimeout: 10sretries: 3start_period: 40s
資源限制
    deploy:  # 僅在使用 docker stack deploy 時有效resources:limits:cpus: '0.50'memory: 500Mreservations:memory: 200M# 或直接使用(適用于 docker-compose up)mem_limit: 512mcpu_shares: 73

volumes (可選)

定義數據卷,用于持久化數據:

volumes:db_data:                 # 命名卷driver: localdriver_opts:type: nfso: addr=192.168.1.1,rwmetrics:                 # 外部已有卷external: truename: metrics_data

networks (可選)

定義自定義網絡:

networks:frontend:driver: bridgedriver_opts:com.docker.network.bridge.name: my-frontendbackend:external: truename: my-existing-network

3. 完整示例

version: '3.8'services:web:build: .ports:- "5000:5000"volumes:- .:/codeenvironment:FLASK_ENV: developmentdepends_on:- redisredis:image: redis:alpineports:- "6379:6379"volumes:- redis_data:/datahealthcheck:test: ["CMD", "redis-cli", "ping"]interval: 10stimeout: 5sretries: 3database:image: postgres:13environment:POSTGRES_PASSWORD: examplevolumes:- postgres_data:/var/lib/postgresql/datanetworks:- backendvolumes:redis_data:postgres_data:networks:backend:driver: bridge

4. 高級配置

擴展字段

x-common-env: &common-envTZ: Asia/ShanghaiLANG: en_US.UTF-8services:app1:environment:<<: *common-envAPP_SPECIFIC: value

條件配置

services:service:image: nginxprofiles:- debug# 使用 docker-compose --profile debug up 啟動

標簽和元數據

    labels:com.example.description: "Webapp service"com.example.department: "IT"

通過合理配置這些選項,您可以精確控制容器化應用的運行方式,實現開發、測試和生產環境的一致部署。

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

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

相關文章

15 ABP Framework 開發工具

ABP Framework 開發工具 概述 該頁面詳細介紹了 ABP Framework 提供的開發工具和命令行界面&#xff08;CLI&#xff09;&#xff0c;用于創建、管理和定制 ABP 項目。ABP CLI 是主要開發工具&#xff0c;支持項目腳手架、模塊添加、數據庫遷移管理及常見開發任務自動化。 ABP …

力扣top100(day02-01)--鏈表01

160. 相交鏈表 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) {* val x;* next null;* }* }*/ public class Solution {/*** 查找兩個鏈表的相交節點* param headA 第一個…

LLM 中 語音編碼與文本embeding的本質區別

直接使用語音編碼,是什么形式,和文本的區別 直接使用語音編碼的形式 語音編碼是將模擬語音信號轉換為數字信號的技術,其核心是對語音的聲學特征進行數字化表征,直接承載語音的物理聲學信息。其形式可分為以下幾類: 1. 基于波形的編碼(保留原始波形特征) 脈沖編碼調制…

模型選擇與調優

一、模型選擇與調優在機器學習中&#xff0c;模型的選擇和調優是一個重要的步驟&#xff0c;它直接影響到最終模型的性能1、交叉驗證在任何有監督機器學習項目的模型構建階段&#xff0c;我們訓練模型的目的是從標記的示例中學習所有權重和偏差的最佳值如果我們使用相同的標記示…

vue+Django農產品推薦與價格預測系統、雙推薦+機器學習預測+知識圖譜

vueflask農產品推薦與價格預測系統、雙推薦機器學習價格預測知識圖譜文章結尾部分有CSDN官方提供的學長 聯系方式名片 文章結尾部分有CSDN官方提供的學長 聯系方式名片 關注B站&#xff0c;有好處&#xff01;編號: D010 技術架構: vueflaskmysqlneo4j 核心技術&#xff1a; 基…

數據分析小白訓練營:基于python編程語言的Numpy庫介紹(第三方庫)(下篇)

銜接上篇文章&#xff1a;數據分析小白訓練營&#xff1a;基于python編程語言的Numpy庫介紹&#xff08;第三方庫&#xff09;&#xff08;上篇&#xff09;&#xff08;十一&#xff09;數組的組合核心功能&#xff1a;一、生成基數組np.arange().reshape() 基礎運算功能&…

負載因子(Load Factor) :哈希表(Hash Table)中的一個關鍵性能指標

負載因子&#xff08;Load Factor&#xff09; 是哈希表&#xff08;Hash Table&#xff09;中的一個關鍵性能指標&#xff0c;用于衡量哈希表的空間利用率和發生哈希沖突的可能性。一&#xff1a;定義負載因子&#xff08;通常用希臘字母 λ 表示&#xff09;的計算公式為&…

監控插件SkyWalking(一)原理

一、介紹 1、簡介 SkyWalking 是一個 開源的 APM&#xff08;Application Performance Monitoring&#xff0c;應用性能監控&#xff09;和分布式追蹤系統&#xff0c;主要用于監控、追蹤、分析分布式系統中的調用鏈路、性能指標和日志。 它由 Apache 基金會托管&#xff0c;…

【接口自動化測試】---自動化框架pytest

目錄 1、用例運行規則 2、pytest命令參數 3、pytest配置文件 4、前后置 5、斷言 6、參數化---對函數的參數&#xff08;重要&#xff09; 7、fixture 7.1、基本用法 7.2、fixture嵌套&#xff1a; 7.3、請求多個fixture&#xff1a; 7.4、yield fixture 7.5、帶參數…

Flink Stream API 源碼走讀 - socketTextStream

概述 本文深入分析了 Flink 中 socketTextStream() 方法的源碼實現&#xff0c;從用戶API調用到最終返回 DataStream 的完整流程。 核心知識點 1. socketTextStream 方法重載鏈 // 用戶調用入口 env.socketTextStream("hostname", 9999)↓ 補充分隔符參數 env.socket…

待辦事項小程序開發

1. 項目規劃功能需求&#xff1a;添加待辦事項標記完成/未完成刪除待辦事項分類或標簽管理&#xff08;可選&#xff09;數據持久化&#xff08;本地存儲&#xff09;2. 實現功能添加待辦事項&#xff1a;監聽輸入框和按鈕事件&#xff0c;將輸入內容添加到列表。 標記完成/未完…

【C#】Region、Exclude的用法

在 C# 中&#xff0c;Region 和 Exclude 是與圖形編程相關的概念&#xff0c;通常在使用 System.Drawing 命名空間進行 GDI 繪圖時出現。它們主要用于定義和操作二維空間中的區域&#xff08;幾何區域&#xff09;&#xff0c;常用于窗體裁剪、控件重繪、圖形繪制優化等場景。 …

機器學習 - Kaggle項目實踐(3)Digit Recognizer 手寫數字識別

Digit Recognizer | Kaggle 題面 Digit Recognizer-CNN | Kaggle 下面代碼的kaggle版本 使用CNN進行手寫數字識別 學習到了網絡搭建手法學習率退火數據增廣 提高訓練效果。 使用混淆矩陣 以及對分類出錯概率最大的例子單獨拎出來分析。 最終以99.546%正確率 排在 86/1035 …

新手如何高效運營亞馬遜跨境電商:從傳統SP廣告到DeepBI智能策略

"為什么我的廣告點擊量很高但訂單轉化率卻很低&#xff1f;""如何避免新品期廣告預算被大詞消耗殆盡&#xff1f;""為什么手動調整關鍵詞和出價總是慢市場半拍&#xff1f;""競品ASIN投放到底該怎么做才有效&#xff1f;""有沒有…

【論文閱讀 | CVPR 2024 | UniRGB-IR:通過適配器調優實現可見光-紅外語義任務的統一框架】

論文閱讀 | CVPR 2024 | UniRGB-IR&#xff1a;通過適配器調優實現可見光-紅外語義任務的統一框架?1&&2. 摘要&&引言3.方法3.1 整體架構3.2 多模態特征池3.3 補充特征注入器3.4 適配器調優范式4 實驗4.1 RGB-IR 目標檢測4.2 RGB-IR 語義分割4.3 RGB-IR 顯著目…

Hyperf 百度翻譯接口實現方案

保留 HTML/XML 標簽結構&#xff0c;僅翻譯文本內容&#xff0c;避免破壞富文本格式。采用「HTML 解析 → 文本提取 → 批量翻譯 → 回填」的流程。百度翻譯集成方案&#xff1a;富文本內容翻譯系統 HTML 解析 百度翻譯 API 集成 文件結構 app/ ├── Controller/ │ └──…

字節跳動 VeOmni 框架開源:統一多模態訓練效率飛躍!

資料來源&#xff1a;火山引擎-開發者社區 多模態時代的訓練痛點&#xff0c;終于有了“特效藥” 當大模型從單一語言向文本 圖像 視頻的多模態進化時&#xff0c;算法工程師們的訓練流程卻陷入了 “碎片化困境”&#xff1a; 當業務要同時迭代 DiT、LLM 與 VLM時&#xff0…

配置docker pull走http代理

之前寫了一篇自建Docker鏡像加速器服務的博客&#xff0c;需要用到境外服務器作為代理&#xff0c;但是一般可能沒有境外服務器&#xff0c;只有http代理&#xff0c;所以如果本地使用想走代理可以用以下方式 臨時生效&#xff08;只對當前終端有效&#xff09; 設置環境變量…

OpenAI 開源模型 gpt-oss 本地部署詳細教程

OpenAI 最近發布了其首個開源的開放權重模型gpt-oss&#xff0c;這在AI圈引起了巨大的轟動。對于廣大開發者和AI愛好者來說&#xff0c;這意味著我們終于可以在自己的機器上&#xff0c;完全本地化地運行和探索這款強大的模型了。 本教程將一步一步指導你如何在Windows和Linux…

力扣-5.最長回文子串

題目鏈接 5.最長回文子串 class Solution {public String longestPalindrome(String s) {boolean[][] dp new boolean[s.length()][s.length()];int maxLen 0;String str s.substring(0, 1);for (int i 0; i < s.length(); i) {dp[i][i] true;}for (int len 2; len …