Docker Compose(容器編排)

目錄

什么是 Docker Compose

Docker Compose 的功能

Docker Compose 使用場景

Docker Compose 文件(docker-compose.yml)

Docker Compose 命令清單

常見命令說明

操作案例

總結


什么是 Docker Compose

docker-compose Docker 官方的開源項目,使用 python 編寫,實現上調用了 Docker 服務的 API 進行容器管理及編排,其官方定義為定義和運行多個 Docker 容器的應用。
docker-compose 中有兩個非常重要的概念 :
服務 ( service ) :一個應用的容器,實際上可以包括若干運行相同鏡像的容器實例。
項目 ( project ) :由一組關聯的應用容器組成的一個完整業務單元,在 docker-compose.yml 文件中定義 , 整個 docker-compose.yml 定義一個項目。 Compose 的默認管理對象是項目,通過子命令對項目中的一組容器進行便捷地生命周期管理。 通過 compose 可以方便的管理多個服務。
為什么要 Docker Compose
Docker 是一個輕量化的應用程序, Docker 官方推薦每個 Docker 容器中只運行一個進程
如果一個應用需要涉及到 MySQL nginx 等環境, 那么我們需要分別為應用、數據庫和 nginx 創建單獨的 docker 容器,然后分別啟動容器。
想象一下,當我們構建好 Docker 之后,每次啟動應用,都至少需要 docker run三次, 或者寫一些腳本來實現, 這樣會比較繁瑣。
另外,這些 docker 容器都是分散獨立的,也不方便鏡像管理。那既然這些 docker容器 都是為了同一個應用服務,我們就應該把它們放到一起,這就引出了 docker-compose 來解決這類型的問題。
Docker Compose 的安裝
安裝 docker 的時候,我們默認已經安裝了 docker-compose,安裝的組件包名稱為 docker-compose-plugin ,此處不再贅述
Shell
# 檢查安裝是否成功
root@139-159-150-152:/data/myworkdir/compose# docker compose
version
Docker Compose version v2.16.0

Docker Compose 的功能

1. 使用步驟
Compose 使用的步驟:
使用 docker-compose.yml 定義構成應用程序的服務,這樣它們可以在隔離環境中一起運行。
最后,執行 docker compose up 命令來啟動并運行整個應用程序。
2. 核心功能
Compose 具有管理應用程序整個生命周期的命令:
啟動,停止和重建服務
查看正在運行的服務的狀態
流式傳輸運行服務的日志輸出
在服務上運行一次性命令

Docker Compose 使用場景

單主機部署
快速搭建一個單節點開發或者測試環境,方便使用。
不同環境隔離
通過指定 project 來運行不同的環境,實現隔離的目的。

Docker Compose 文件(docker-compose.yml)

文件基本結構及常見指令
YAML
version: "3.8" # 定義版本, 表示當前使用的 docker-compose 語法的版本
services: # 服務,可以存在多個
servicename: # 服務名字,它也是內部 bridge 網絡可以使用的 DNS name, 如果不是集群模式相當于 docker run 的時候指定的一個名稱
# 集群( Swarm )模式是多個容器的邏輯抽象
image: # 必選,鏡像的名字
command: # 可選,如果設置,則會覆蓋默認鏡像里的 CMD 命令
environment: # 可選,等價于 docker container run 里的 --env 選項設置環境變量
volumes: # 可選,等價于 docker container run 里的 -v 選項 綁定數據卷
networks: # 可選,等價于 docker container run 里的 --network 選項指定網絡
ports: # 可選,等價于 docker container run 里的 -p 選項指定端口映射
expose: # 可選,指定容器暴露的端口
build: # 構建目錄
depends_on: # 服務依賴配置
env_file: # 環境變量文件
servicename2:
image:
command:
networks:
ports:
servicename3:
#...
volumes: # 可選,等價于 docker volume create
networks: # 可選,等價于 docker network create
image
指定容器運行的鏡像。以下格式都可以:

image: redis
image: redis:5
image: 
redis@sha256:0ed5d5928d4737458944eb604cc8509e245c3e19d02ad83935398
bc4b991aac7
image: library/redis
image: docker.io/library/redis
image: my_private.registry:5000/redis
command
覆蓋容器啟動的默認命令。
Shell
command: ["bundle", "exec", "thin", "-p", "3000"]
command: bundle exec thin -p 3000
entrypoint
覆蓋容器默認的 entrypoint
Shell
entrypoint: /code/entrypoint.sh
也可以是以下格式:
Shell
entrypoint:
- php
- -d
- zend_extension=/usr/local/lib/php/extensions/no-debug-non
zts-20100525/xdebug.so
- -d
- memory_limit=-1
- vendor/bin/phpunit
environment
添加環境變量。您可以使用數組或字典、任何布爾值,布爾值需要用引號引起來,以確保 YML 解析器不會將其轉換為 True False
Shell
#map 語法
environment:
RACK_ENV: development
SHOW: "true"
USER_INPUT:
# 數組語法
environment:
- RACK_ENV=development
- SHOW=true
- USER_INPUT
networks
指定容器運行的網絡:
配置容器網絡
Shell
services:
frontend:
image: awesome/webapp
networks:
- front-tier
- back-tier
monitoring:
image: awesome/monitoring
networks:
- admin
backend:
image: awesome/backend
networks:
back-tier:
aliases:
- database
admin:
aliases:
- mysql
networks:
front-tier:
back-tier:
admin:
配置網絡驅動和子網信息
Shell
services:
frontend:
image: awesome/webapp
networks:
front-tier:
ipv4_address: 172.16.238.10
networks:
front-tier:
ipam:
driver: default
config:
- subnet: "172.16.238.0/24"
volumes
將主機的數據卷或者文件掛載到容器里。
Shell
# 短語法
services:
db:
image: postgres:latest
volumes:
- "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
- "/localhost/data:/var/lib/postgresql/data"
# 完整語法
services:
backend:
image: awesome/backend
volumes:
- type: volume
# 命名卷
source: db-data
target: /data
volume:
nocopy: true
# 綁定卷
- type: bind
source: /var/run/postgres/postgres.sock
target: /var/run/postgres/postgres.sock
volumes:
db-data:
ports
指定端口映射。以下格式都可以:
Shell
# 完整語法
ports:
- target: 80
host_ip: 127.0.0.1
published: 8080
protocol: tcp
mode: host
- target: 80
host_ip: 127.0.0.1
published: 8000-9000
protocol: tcp
mode: host
# 短語法
ports:
- "3000"
- "3000-3005"
- "8000:8000"
- "9090-9091:8080-8081"
- "49100:22"
- "127.0.0.1:8001:8001"
- "127.0.0.1:5000-5010:5000-5010"
- "6060:6060/udp"
expose
暴露端口,但不映射到宿主機,只被連接的服務訪問。
僅可以指定內部端口為參數:
Shell
expose:
- "3000"
- "8000"
build
指定為構建鏡像上下文路徑:
例如 webapp 服務,指定為從上下文路徑 ./dir/Dockerfile 所構建的鏡像:
Shell
version: "3.7"
services:
webapp:
build: ./dir
或者,作為具有在上下文指定的路徑的對象,以及可選的 Dockerfile args
version: "3.7"
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
labels:
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
?
context :上下文路徑。
?
dockerfile :指定構建鏡像的 Dockerfile 文件名。
?
args :添加構建參數,這是只能在構建過程中訪問的環境變量。
?
labels :設置構建鏡像的標簽。
depends_on
設置依賴關系。
?
docker compose up :以依賴性順序啟動服務。在以下示例中,先啟動 db
redis ,才會啟動 web
?
docker compose up SERVICE :自動包含 SERVICE 的依賴項。在以下示例中,
docker compose up web 還將創建并啟動 db redis
?
docker compose stop :按依賴關系順序停止服務。在以下示例中, web db
redis 之前停止。
Shell
version: "3.7"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
可以指定條件, healthy 需要配置 healthcheck 來完成
services:
web:
build: .
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
redis:
image: redis
db:
image: postgres
health check 樣例
Shell
version: "3.8"
services:
web:
image: nginx:1.24.0
environment:
TEST: 1
depends_on:
mysql:
condition: service_healthy
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: "bit@123"
volumes:
- /data/maxhou/mysqldata/varlib/:/var/lib/mysql
healthcheck :
test: mysql --user=root --password='bit@123' -e "SELECT 1;"
interval: 10s
timeout: 5s
retries: 10
env_file
從文件添加環境變量。可以是單個值或列表的多個值。
Shell
env_file: .env

Docker Compose 命令清單

Docker Compose 有很多命令,但是常用的就幾個,這里列出一些,有需要額外學習的可以去docker官網學習

docker compose build
構建服務
docker compose config
規范的格式來顯示服務配置
docker compose cp
在本地系統和服務容器直接拷貝文件
docker compose create
創建服務的容器
docker compose down
停止所有容器,并刪除容器
docker compose exec
在容器中執行命令
docker compose
images
列出所有容器使用的鏡像
docker compose kill
強制停止服務的容器
docker compose ls
顯示所有項目
docker compose pause
docker compose pause
命令格式
對于 Compose 來說,大部分命令的對象既可以是項目本身,也可以指定為項目中的服務或者容器。如果沒有特別的說明,命令對象將是項目,這意味著項目中所有的服務都會受到命令影響。
docker-compose 命令的基本的使用格式為
docker compose [OPTIONS] COMMAND [ARGS...]
常見選項說明
-f, --file 指定使用的 Compose 模板文件,默認為 docker-compose.yml,可以多次指定
-p, --project-name 指定項目名稱,默認將使用所在目錄名稱作為項目名

常見命令說明

up
該命令的作用十分強大,它會嘗試自動完成包括構建鏡像、(重新)創建服務、啟動服務并關聯服務相關容器的一系列操作,可以直接通過該命令來啟動一個項目。
Shell
docker compose up [options] [SERVICE...]
-d 在后臺運行服務容器, 推薦在生產環境下使用該選項
--force-recreate 強制重新創建容器,不能與 --no-recreate 同時使用
--no-recreate 如果容器已經存在了,則不重新創建,不能與 --force-recreate 同時使用
down
停止所有容器,并刪除容器和網絡
docker compose down [options] [SERVICE...]
-v, --volumes 刪除容器同時刪除目錄映射
run
該命令可以在指定服務容器上執行相關的命令
Shell
# 例如 : 啟動一個 ubuntu 服務容器,并執行 ping docker.com 命令
# docker compose run ubuntu ping docker.com
docker compose run [options] SERVICE [COMMAND] [ARGS...]
-d 后臺運行容器
--name NAME 為容器指定一個名字
--entrypoint CMD 覆蓋默認的容器啟動指令
-e KEY=VAL 設置環境變量值,可多次使用選項來設置多個環境變
-u, --user="" 指定運行容器的用戶名或者 ui
--rm 運行命令后自動刪除容器
-p, --publish=[] 映射容器端口到本地主機

操作案例

1. 創建 compose 目錄

mkdir -p /data/myworkdir/compose/base
cd /data/myworkdir/compose/base
2. 進入 base 目錄 , 創建 docker-compose.yml 文件
cd /data/myworkdir/compose/base/
vi docker-compose.yml
3. 輸入一下內容
version: 3.8
services:web:image: nginx:1.24.0environment:TEST: 1ports:- 8979:80networks:
- mytestnetvolumes:- ./mynginxhome:/usr/share/nginx/htmldepends_on:mysql:condition: service_healthy redis:condition: service_healthymysql:image: mysql:5.7environment:MYSQL_ROOT_PASSWORD: "bit@123"networks:- mytestnetvolumes:- /data/maxhou/mysqldata/varlib/:/var/lib/mysqlhealthcheck:test: mysql --user=root --password='bit@123' -e "SELECT 1;"interval: 10stimeout: 5sretries: 10redis:image: redis:7networks:- mytestnethealthcheck:test: redis-cli pinginterval: 10stimeout: 5sretries: 10
networks:mytestnet:
4. 輸入 docker config 會做檢查????????
root@139-159-150-152:/data/myworkdir/compose/base# docker compose
config
version must be a string
5. 我們修改錯誤信息,將版本轉為字符串,再次檢查,檢查通過
6. 創建首頁目錄,編輯首頁內容
Shell
root@139-159-150-152:/data/myworkdir/compose/base# mkdir - p ./mynginxhome
root@139-159-150-152:/data/myworkdir/compose/base# cd ./mynginxhome/
root@139-159-150-152:/data/myworkdir/compose/base/mynginxhome#
echo "Hello bit" > index.html
7. 啟動服務????????
root@139-159-150-152:/data/myworkdir/compose/base# docker compose
up -d
8. 停止服務
root@139-159-150-152:/data/myworkdir/compose/base# docker compose
stop
10. 啟動服務
root@139-159-150-152:/data/myworkdir/compose/base# docker compose
start
11. 刪除服務
SQL
root@139-159-150-152:/data/myworkdir/compose/base# docker compose
down

總結

當docker某個項目牽扯多個微服務容器時,可以使用compose技術,實現對服務的容器定制化設置、網絡的搭建和連接,以及容器的啟動停止

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

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

相關文章

【網絡安全】輕量敏感路徑掃描工具

訂閱專欄,獲取文末項目源碼。 文章目錄 工具簡介工具特點項目結構使用方法1.環境準備2.配置目標URL3.運行掃描4.結果查看5.自定義擴展項目源碼工具簡介 該工具是一款基于Python的異步敏感路徑掃描工具,用于檢測目標網站是否存在敏感文件或路徑泄露(如配置文件、密鑰、版本控…

SpringAI+DeepSeek大模型應用開發實戰

內容來自黑馬程序員 這里寫目錄標題 認識AI和大模型大模型應用開發模型部署方案對比模型部署-云服務模型部署-本地部署調用大模型什么是大模型應用傳統應用和大模型應用大模型應用 大模型應用開發技術架構 SpringAI對話機器人快速入門會話日志會話記憶 認識AI和大模型 AI的發…

高溫爐制造企業Odoo ERP實施規劃與深度分析報告

摘要 本報告旨在為高溫爐生產企業提供一個基于Odoo 18平臺的企業資源規劃(ERP)系統實施的全面分析與規劃。報告首先系統梳理了高溫爐制造業獨特的業務流程特點,隨后詳細映射了Odoo 18各核心模塊功能與這些業務需求的匹配程度。重點分析了生產…

簡述什么是全局鎖?它的應用場景有哪些?

全局鎖是數據庫管理系統中的一種特殊鎖機制,用于對整個數據庫實例進行加鎖,使數據庫處于只讀狀態,阻止所有數據更新(DML)、數據定義(DDL)及更新類事務提交等操作。 其核心應用場景包括&#xf…

window 顯示驅動開發-呈現開銷改進(二)

對共享表面的紋理格式支持 驅動程序應支持共享資源和可共享的后臺緩沖區,以使用 DXGI_FORMAT 枚舉中的這些附加紋理格式: DXGI_FORMAT_A8_UNORMDXGI_FORMAT_R8_UNORMDXGI_FORMAT_R8G8_UNORMDXGI_FORMAT_BC1_TYPELESS\*DXGI_FORMAT_BC1_UNORMDXGI_FORMAT…

jenkins集成gitlab實現自動構建

jenkins集成gitlab實現自動構建 前面我們已經部署了Jenkins和gitlab,本文介紹將二者結合使用 項目源碼上傳至gitee提供公網訪問:https://gitee.com/ye-xiao-tian/my-webapp 1、創建一個群組和項目 2、添加ssh密鑰 #生成密鑰 [rootgitlab ~]# ssh-keyge…

barker-OFDM模糊函數原理及仿真

文章目錄 前言一、巴克碼序列二、barker-OFDM 信號1、OFDM 信號表達式2、模糊函數表達式 三、MATLAB 仿真1、MATLAB 核心源碼2、仿真結果①、barker-OFDM 模糊函數②、barker-OFDM 距離分辨率③、barker-OFDM 速度分辨率④、barker-OFDM 等高線圖 四、資源自取 前言 本文進行 …

深入解析 Redis Cluster 架構與實現(一)

#作者:stackofumbrella 文章目錄 Redis Cluster特點Redis Cluster與其它集群模式的區別集群目標性能hash tagsMutli-key操作Cluster Bus安全寫入(write safety)集群節點的屬性集群拓撲節點間handshake重定向與reshardingMOVED重定向ASK重定向…

linux centos 服務器性能排查 vmstat、top等常用指令

背景:項目上經常出現系統運行緩慢,由于數據庫服務器是linux服務器,記錄下linux服務器性能排查常用指令 vmstat vmstat介紹 vmstat 命令報告關于內核線程、虛擬內存、磁盤、陷阱和 CPU 活動的統計信息。由 vmstat 命令生成的報告可以用于平衡系統負載活動。系統范圍內的這…

在IIS上無法使用PUT等請求

錯誤來源: chat:1 Access to XMLHttpRequest at http://101.126.139.3:11000/api/receiver/message from origin http://101.126.139.3 has been blocked by CORS policy: No Access-Control-Allow-Origin header is present on the requested resource. 其實我的后…

Python訓練第四十一天

DAY 41 簡單CNN 知識回顧 數據增強卷積神經網絡定義的寫法batch歸一化:調整一個批次的分布,常用與圖像數據特征圖:只有卷積操作輸出的才叫特征圖調度器:直接修改基礎學習率 卷積操作常見流程如下: 1. 輸入 → 卷積層 →…

Linux線程同步實戰:多線程程序的同步與調度

個人主頁:chian-ocean 文章專欄-Linux Linux線程同步實戰:多線程程序的同步與調度 個人主頁:chian-ocean文章專欄-Linux 前言:為什么要實現線程同步線程饑餓(Thread Starvation)示例:搶票問題 …

5.2 初識Spark Streaming

在本節實戰中,我們初步探索了Spark Streaming,它是Spark的流式數據處理子框架,具備高吞吐量、可伸縮性和強容錯能力。我們了解了Spark Streaming的基本概念和運行原理,并通過兩個案例演示了如何利用Spark Streaming實現詞頻統計。…

Go 即時通訊系統:日志模塊重構,并從main函數開始

重構logger 上次寫的logger.go過于繁瑣,有很多沒用到的功能;重構后只提供了簡潔的日志接口,支持日志輪轉、多級別日志記錄等功能,并采用單例模式確保全局只有一個日志實例 全局變量 var (once sync.Once // 用于實現…

「數據采集與網絡爬蟲(使用Python工具)」【數據分析全棧攻略:爬蟲+處理+可視化+報告】

- 第 103 篇 - Date: 2025 - 06 - 01 Author: 鄭龍浩/仟墨 文章目錄 「據采集與網絡爬蟲」【使用工具:Python】一 數據采集1 數據采集綜述(1)基本介紹(2)數據目標源(3)采集方式(4&am…

響應式系統與Spring Boot響應式應用開發

響應式系統概述 過去十年間,為應對移動和云計算的需求,軟件行業通過改進開發流程來構建更穩定、健壯且靈活的軟件系統。這種演進不僅服務于傳統用戶端(桌面/Web),還需支持多樣化設備(手機、傳感器等)。為應對這些挑戰,多個組織共同制定了《響應式宣言》(2014年發布)…

POJO、DTO和VO:Java應用中的三種關鍵對象詳解

在軟件開發特別是Java開發中,常常會遇到POJO、DTO和VO這三類對象。它們在不同場景下扮演著重要角色,有助于優化代碼結構、增強系統安全性和提升性能。本文將全面解析這三者的定義、區別及常見使用場景,幫助你更好地理解和應用。 1. POJO&…

leetcode付費題 353. 貪吃蛇游戲解題思路

貪吃蛇游戲試玩:https://patorjk.com/games/snake/ 問題描述 設計一個貪吃蛇游戲,要求實現以下功能: 初始化游戲:給定網格寬度、高度和食物位置序列移動操作:根據指令(上、下、左、右)移動蛇頭規則: 蛇頭碰到邊界或自身身體時游戲結束(返回-1)吃到食物時蛇身長度增加…

NLP學習路線圖(十三):正則表達式

在自然語言處理(NLP)的浩瀚宇宙中,原始文本數據如同未經雕琢的璞玉。而文本預處理,尤其是其中至關重要的正則表達式技術,正是將這塊璞玉轉化為精美玉器的核心工具集。本文將深入探討正則表達式在NLP文本預處理中的原理…

計算機網絡(4)——網絡層

1.概述 1.1 網絡層服務 (1) 網絡層為不同主機(Host)之間提供了一種邏輯通信機制 (2)每個主機和路由器都運行網絡層協議 發送方:將來自傳輸層的消息封裝到數據報(datagram)中接收方:向傳輸層交付數據段(segment) 1.2 網絡層核心功能 路由選擇(routing…