Docker多容器編排Compose實戰(zhàn)案例
概念簡述
核心定義
Docker Compose 是一個用于定義和運行多容器 Docker 應用程序的工具。它允許您使用一個單獨的配置文件(通常是 .yml
格式)來配置應用程序的所有服務、網(wǎng)絡和卷,然后通過一條簡單的命令就能創(chuàng)建和啟動所有服務。
可以把它想象成一個自動化腳本或編排工具,專門用于在單臺主機上部署由多個容器組成的應用。
為什么要使用 Docker Compose?解決什么問題?
在理解 Compose 之前,先想想如果不用它,會多麻煩:
假設應用由以下服務組成:Web 應用、Redis 緩存服務、MySQL 數(shù)據(jù)庫服務,如果沒有 Docker Compose,你需要手動完成以下步驟:
- 創(chuàng)建一個 Docker 網(wǎng)絡讓容器可以通信。
- 單獨啟動 MySQL 容器,并指定網(wǎng)絡、卷、環(huán)境變量等。
- 單獨啟動 Redis 容器,并指定網(wǎng)絡、環(huán)境變量等。
- 構建你的 Web 應用的鏡像。
- 啟動 Web 應用容器,并鏈接到之前創(chuàng)建的網(wǎng)絡,設置環(huán)境變量指向 Redis 和 PostgreSQL 的容器名。
你需要記住并輸入一大堆 docker run
命令,這個過程非常繁瑣且容易出錯。
Docker Compose 解決了這個問題:
- 簡化流程:用一個文件(
docker-compose.yml
)描述整個應用棧的架構。 - 一鍵操作:通過一條命令(
docker compose up
)就能同時創(chuàng)建、啟動所有服務,并處理好它們之間的依賴關系。 - 配置即代碼:將你的應用基礎設施(服務、網(wǎng)絡、存儲)用配置文件管理起來,可以納入版本控制系統(tǒng),方便協(xié)作和追溯。
核心概念與工作流程
- 定義
docker-compose.yml
文件:- 這是 Docker Compose 的核心。你在這個 YAML 文件中定義你的應用所需的服務、網(wǎng)絡和卷。
- 服務:對應一個容器。你可以指定使用哪個鏡像、暴露哪些端口、掛載哪些卷、設置哪些環(huán)境變量、依賴哪些其他服務等。
- 網(wǎng)絡:定義容器之間通信的網(wǎng)絡。
- 卷:定義持久化數(shù)據(jù)存儲的位置。
- 執(zhí)行
docker compose up
命令:- 在包含
docker-compose.yml
文件的目錄下運行此命令。Compose 會: - 自動構建或拉取所需的鏡像。
- 按依賴順序創(chuàng)建并啟動所有定義的服務。
- 將所有服務的日志輸出聚合到一個流中,方便查看。
- 在包含
- 執(zhí)行
docker compose down
命令:- 當你想要停止并清理整個應用時,運行此命令。它會停止所有容器,并刪除創(chuàng)建的容器和網(wǎng)絡(默認情況下不刪除卷)。
總結:Docker Compose 的優(yōu)點
- 隔離環(huán)境:整個應用棧與主機環(huán)境完全隔離。
- 極簡配置:一個命令替代了大量復雜的
docker run
命令。 - 快速部署:極大地簡化了多容器應用的部署和測試流程,是開發(fā)、測試和 CI/CD 環(huán)境的理想選擇。
- 服務發(fā)現(xiàn):自動在服務之間創(chuàng)建網(wǎng)絡,并通過服務名進行DNS解析,使容器間通信變得非常簡單。
注意:Docker Compose 通常用于開發(fā)、測試和單機部署。對于生產(chǎn)環(huán)境中跨多臺主機的集群管理和編排,更強大的工具如 Kubernetes 或 Docker Swarm 更為合適。不過,Compose 文件可以作為學習這些更復雜工具的基礎。
配置文件格式
version
:指定Docker Compose文件的版本格式,不同版本支持的功能和語法有所不同,高版本兼容低版本services
: 服務,可以存在多個
servicename
: 服務名字,它也是內(nèi)部bridge網(wǎng)絡可以使用的DNS name,如果不是集群模式相當于docker run的時候指定的一個名稱,集群(Swarm)模式是多個容器的邏輯抽象
image
: 鏡像的名字(必選)
command
: 如果設置,則會覆蓋默認鏡像里的CMD命令
environment
: 等價于docker container run里的–env選項,設置環(huán)境變量
volumes
: 等價于docker container run里的-v選項,綁定數(shù)據(jù)卷
networks
: 等價于docker container run里的–network選項,指定網(wǎng)絡
ports
: 等價于docker container run里的-p選項,指定端口映射
expose
: 可選,指定容器暴露的端口
build
: 構建目錄
depends_on
: 服務依賴配置
env_file
: 環(huán)境變量文件
servicename2
:
image
:
command
:
networks
:
ports
:
servicename3
:
#…volumes
: # 可選,等價于 docker volume create
networks
: # 可選,等價于 docker network create
參數(shù)詳解
準備這樣一個目錄結構:
mycompose/ ├── prj1 │ └── docker-compose.yml ├── prj2 │ └── docker-compose.yml └── prj3 └── docker-compose.yml ......
image
功能:指定容器鏡像
示例:
- 創(chuàng)建prj1目錄:
mkdir prj1
- 在prj1中創(chuàng)建文件docker-compose.yml
cd prj1
touch docker-compose.yml
- 編輯docker-compose文件
vim docker-compose.yml
services: web: image: nginx:1.24.0
- 啟動配置
docker compose up
- 清除容器
docker compose down
接下來就不再詳細展示每個步驟,重點講解第3步文件的配置。
command
功能:覆蓋容器啟動的默認指令
格式:
command: ["bundle", "exec", "thin", "-p", "3000"] //或 command: bundle exec thin -p 3000
示例:
serveices: web: image: nginx:1.24.0 command: bundle exec thin -p 3000
這些內(nèi)容都寫在配置文件docker-compose.yml
里面
entrypoint
功能:覆蓋容器默認的 entrypoint
。
格式:
entrypoint: /code/entrypoint.sh
也可以是列表格式:
entrypoint: - php - -d - zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so - -d - memory_limit=-1 - vendor/bin/phpunit
示例:
services: web: image: nginx:1.24.0 entrypoint: - tail - -f - /etc/os-release
environment
environment
功能:
添加環(huán)境變量。您可以使用數(shù)組或字典、任何布爾值,布爾值需要用引號引起來,以確保 YML
解析器不會將其轉換為 True
或 False
。
格式:
# map 格式 environment: RACK_ENV: development SHOW: "true" USER_INPUT:
# 數(shù)組格式 environment: - RACK_ENV=development - SHOW=true - USER_INPUT=
示例:
services: web: image: nginx:1.24.0 environment: TEST: 1
networks
功能:配置容器網(wǎng)絡
示例:
services: web: image: nginx:1.24.0 networks: - web1 - web2 networks: web1: web2:
volume
功能:配置容器的存儲卷
#短語法 volumes: - "/localhost/postgres.sock:/var/run/postgres/postgres.sock" - "/localhost/data:/var/lib/postgresql/data" #完整語法 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
示例:
services: web: image: nginx:1.24.0 volumes: - /home/qsy/gitDocker/data/myvolumes:/usr/share/nginx/html/
ports
功能:配置容器的端口映射
#完整語法 ports: - target: 80 host_ip: 127.0.0.1 published: 8080 protocol: tcp mode: host - target: 80 host_ip: 127.0.0.1 #短語法 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"
示例:
services: web: image: nginx:1.24.0 ports: - 7070:80
expose
功能:暴露端口,但不映射到宿主機,只被連接的服務訪問。僅可以指定內(nèi)部端口為參數(shù).
格式/示例:
expose: - "3000" - "8000"
depends_on
功能:設置依賴關系
docker compose up
:以依賴性順序啟動服務。在以下示例中,先啟動db
和redis
,才會啟動web
。docker compose up SERVICE
:自動包含SERVICE
的依賴項。在以下示例中,docker compose up web
還將創(chuàng)建并啟動db
和redis
。docker compose stop
:按依賴關系順序停止服務。在以下示例中,web
在db
和redis
之前停止。
version: "3.7" services: web: build: . depends_on: - db - redis redis: image: redis db: image: postgres
env_file
從文件添加環(huán)境變量??梢允菃蝹€值或列表的多個值。
env_file: xxx.env
也可以是列表格式:
env_file: - ./.env - ./apps/web.env - /opt/secrets.env
docker compose指令
docker compose
指令與容器操作相似,只不過把容器改成了服務
命令格式:docker-compose
命令的基本的使用格式為
docker compose [OPTIONS] COMMAND [ARGS...]
命令清單:
- docker compose build - 構建服務
- docker compose config - 以規(guī)范格式顯示服務配置
- docker compose cp - 在本地系統(tǒng)和服務容器之間拷貝文件
- docker compose create - 創(chuàng)建服務的容器
- docker compose down - 停止所有容器并刪除容器
- docker compose events - 從服務器獲取實時事件
- docker compose exec - 在容器中執(zhí)行命令
- docker compose images - 列出所有容器使用的鏡像
- docker compose kill - 強制停止服務的容器
- docker compose logs - 顯示容器日志
- docker compose ls - 顯示所有項目
- docker compose pause - 暫停服務
- docker compose port - 列出所有的端口映射
- docker compose ps - 列出項目中目前的所有容器
- docker compose pull - 拉取服務鏡像
- docker compose push - 推送服務鏡像
- docker compose restart - 重啟服務
- docker compose rm - 刪除已停止的服務容器
- docker compose run - 在指定服務容器上執(zhí)行命令
- docker compose start - 啟動當前停止的容器
- docker compose stop - 停止當前運行的容器
- docker compose top - 顯示運行的進程
- docker compose unpause - 恢復服務
- docker compose up - 構建、創(chuàng)建、啟動和鏈接服務相關的容器(支持 --no-recreate 參數(shù)避免重新創(chuàng)建,-d 后臺運行)
- docker compose version - 查看版本信息
用法和功能與容器的相關指令類似,只是docker compose的操作對象是服務而已。
參考文章:Docker容器核心指令
關鍵命令選項
up
功能:
該命令的作用十分強大,它會嘗試自動完成包括構建鏡像、(重新)創(chuàng)建服務、啟動服務并關聯(lián)服務相關容器的一系列操作,可以直接通過該命令來啟動一個項目。
語法:
docker compose up [options] [service...]
選項說明:
-d
在后臺運行服務器,推薦在生產(chǎn)環(huán)境下使用該選項--force-recreate
強制重新創(chuàng)建容器,不能與--no-recreate
同時使用--no-recreate
如果容器已經(jīng)存在了,則不重新創(chuàng)建,不能與--force-recreate
同時使用
down
功能:停止所有容器,并刪除容器和網(wǎng)絡。
語法:
docker compose down [options] [SERVICE...]
選項說明:
-v, --volumes
:刪除容器同時刪除目錄映射。
run
功能:該命令可以在指定服務器上執(zhí)行相關的命令
語法:
# 例如:啟動一個 ubuntu 服務容器,并執(zhí)行 ping docker.com 命令 # docker compose run ubuntu ping docker.com docker compose run [options] SERVICE [COMMAND] [ARGS...]
與docker run的區(qū)別,該指令是用服務啟動容器,而不是鏡像
選項說明:
-d
后臺運行容器--name NAME
為容器指定一個名字--entrypoint CMD
覆蓋默認的容器啟動指令-e KEY=VAL
設置環(huán)境變量值,可多次使用選項來設置多個環(huán)境變量-u, --user=""
指定運行容器的用戶名或者 uid--rm
運行命令后自動刪除容器-p, --publish=[]
映射容器端口到本地主機
示例:
綜合案例
docker-compose.yml配置
啟動,會先啟動依賴的服務。
清理,與啟動相反,先清理主要的服務,然后清理依賴的服務。
到此這篇關于Docker多容器編排:Compose 實戰(zhàn)教程的文章就介紹到這了,更多相關Docker多容器Compose 實戰(zhàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
docker容器中登陸并操作postgresql的實現(xiàn)
本文主要介紹了docker容器中登陸并操作postgresql的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-02-02Docker搭建Jenkins實現(xiàn)自動部署的圖文教程
本文主要介紹了Docker搭建Jenkins實現(xiàn)自動部署教程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-05-05本地Docker安裝Postgres 12 + pgadmin的方法 (支持Apple M1)
這篇文章主要介紹了本地Docker安裝Postgres 12 + pgadmin的方法 (支持Apple M1),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03