Docker?Compose從入門到實(shí)踐的完全指南
1. Docker Compose 簡(jiǎn)介與核心價(jià)值
Docker Compose 是一個(gè)用于定義和運(yùn)行多容器 Docker 應(yīng)用程序的工具。通過一個(gè) YAML 文件來配置應(yīng)用的服務(wù),只需簡(jiǎn)單命令就能創(chuàng)建和啟動(dòng)所有服務(wù)。
核心優(yōu)勢(shì):
- 簡(jiǎn)化多容器管理:通過單一文件管理多個(gè)關(guān)聯(lián)容器
- 開發(fā)環(huán)境標(biāo)準(zhǔn)化:團(tuán)隊(duì)共享相同的環(huán)境配置
- 快速環(huán)境搭建:一條命令啟動(dòng)復(fù)雜應(yīng)用棧
- 服務(wù)依賴管理:自動(dòng)處理服務(wù)間的依賴關(guān)系
- 配置即代碼:版本控制環(huán)境配置
典型應(yīng)用場(chǎng)景:
- 開發(fā)環(huán)境搭建
- 自動(dòng)化測(cè)試環(huán)境
- 單主機(jī)部署
- 微服務(wù)應(yīng)用演示
2. Compose 文件結(jié)構(gòu)與版本
2.1 基本文件結(jié)構(gòu)
version: "3.8" # 指定Compose文件格式版本
services: # 容器服務(wù)定義
webapp:
image: nginx:alpine
ports:
- "80:80"
database:
image: postgres:13
environment:
POSTGRES_PASSWORD: example
volumes: # 持久化卷定義
db-data:
版本選擇建議:
- 新項(xiàng)目使用 3.8+ 版本
- 需要 swarm 部署時(shí)使用 3.x 版本
- 舊系統(tǒng)兼容考慮 2.4 版本
2.2 版本演進(jìn)對(duì)比
| 特性 | 2.x 系列 | 3.x 系列 |
|---|---|---|
| Swarm 模式支持 | 有限支持 | 完整支持 |
| GPU 支持 | 不支持 | 3.7+ 支持 |
| 擴(kuò)展字段 | 不支持 | 3.4+ 支持 |
| 服務(wù)依賴 | depends_on 基本 | 增強(qiáng)的健康檢查依賴 |
3. 核心服務(wù)配置詳解
3.1 鏡像與構(gòu)建
使用現(xiàn)有鏡像:
services:
redis:
image: redis:6.2-alpine
基于 Dockerfile 構(gòu)建:
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile.dev
args:
NODE_ENV: development
image: my-webapp:1.0
參數(shù)說明:
- context:構(gòu)建上下文路徑
- dockerfile:指定 Dockerfile 文件名
- args:構(gòu)建時(shí)變量傳遞
3.2 端口映射
services:
web:
ports:
- "80:80" # 主機(jī)端口:容器端口
- "443:443/tcp" # 指定協(xié)議
- "3000-3005:3000-3005" # 端口范圍
- "9090" # 僅暴露容器端口
最佳實(shí)踐:
- 開發(fā)環(huán)境使用明確端口映射
- 生產(chǎn)環(huán)境謹(jǐn)慎暴露端口
- 考慮使用反向代理管理入口
3.3 環(huán)境變量配置
.env 文件:
DB_USER=admin DB_PASS=secret
Compose 文件引用:
services:
db:
environment:
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASS}
env_file:
- ./db.env
優(yōu)先級(jí)規(guī)則:
- environment 顯式定義
- env_file 文件定義
- 容器內(nèi)已有環(huán)境變量
3.4 數(shù)據(jù)持久化
services:
database:
volumes:
- db-data:/var/lib/postgresql/data
- ./logs:/app/logs
volumes:
db-data:
driver: local
掛載類型對(duì)比:
- 命名卷:docker 管理,適合生產(chǎn)數(shù)據(jù)
- 主機(jī)路徑:開發(fā)調(diào)試方便
- 臨時(shí)卷:內(nèi)存存儲(chǔ),高性能臨時(shí)數(shù)據(jù)
4. 網(wǎng)絡(luò)配置策略
4.1 默認(rèn)網(wǎng)絡(luò)行為
services:
web:
networks:
- frontend
api:
networks:
- frontend
- backend
networks:
frontend:
backend:
driver: bridge
自動(dòng)生成規(guī)則:
- 默認(rèn)創(chuàng)建 項(xiàng)目名_default 網(wǎng)絡(luò)
- 相同網(wǎng)絡(luò)內(nèi)的服務(wù)可通過服務(wù)名互訪
- 隔離不同項(xiàng)目的網(wǎng)絡(luò)環(huán)境
4.2 自定義網(wǎng)絡(luò)配置
networks:
app-net:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/24
gateway: 172.20.0.1
attachable: true
高級(jí)選項(xiàng):
- internal: true 創(chuàng)建隔離網(wǎng)絡(luò)
- enable_ipv6: true 啟用 IPv6
- labels 添加元數(shù)據(jù)
5. 服務(wù)依賴與健康檢查
5.1 依賴控制
services:
web:
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
db:
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 3s
retries: 5
依賴條件類型:
- service_started:服務(wù)容器啟動(dòng)
- service_healthy:通過健康檢查
- service_completed_successfully:一次性任務(wù)成功
5.2 健康檢查配置
healthcheck: test: ["CMD", "curl", "-f", "http://localhost/health"] interval: 30s timeout: 10s retries: 3 start_period: 5s
檢查方式:
- CMD:直接執(zhí)行命令
- CMD-SHELL:通過 shell 執(zhí)行
- 禁用:disable: true
6. 常用命令實(shí)戰(zhàn)
6.1 基礎(chǔ)命令
# 啟動(dòng)所有服務(wù)(后臺(tái)模式) docker-compose up -d # 查看運(yùn)行狀態(tài) docker-compose ps # 停止服務(wù) docker-compose stop # 停止并刪除容器 docker-compose down # 重建服務(wù) docker-compose up -d --build
6.2 調(diào)試命令
# 查看服務(wù)日志 docker-compose logs -f web ???????# 執(zhí)行一次性命令 docker-compose run --rm web python manage.py migrate # 進(jìn)入運(yùn)行中容器 docker-compose exec db psql -U postgres
6.3 擴(kuò)展操作
# 水平擴(kuò)展服務(wù)實(shí)例 docker-compose up -d --scale web=3 # 查看服務(wù)資源使用 docker-compose top # 驗(yàn)證配置文件 docker-compose config
7. 生產(chǎn)環(huán)境最佳實(shí)踐
7.1 安全配置
services:
db:
read_only: true
tmpfs: /run
security_opt:
- no-new-privileges:true
user: "1000:1000"
安全建議:
- 避免使用 root 用戶
- 限制內(nèi)存和 CPU
- 設(shè)置只讀文件系統(tǒng)
- 禁用特權(quán)升級(jí)
7.2 資源約束
services:
worker:
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
memory: 256M
restart_policy:
condition: on-failure
max_attempts: 3關(guān)鍵配置:
- CPU 限制 (cpus)
- 內(nèi)存限制 (memory)
- 重啟策略
- 容器更新順序
7.3 多環(huán)境配置
base.yml:
services:
app:
image: my-app
env_file: .env
override.yml:
services:
app:
environment:
DEBUG: "true"
ports:
- "8080:80"
啟動(dòng)命令:
docker-compose -f base.yml -f override.yml up
8. 完整示例分析
微服務(wù)應(yīng)用示例
version: "3.8"
services:
frontend:
build: ./frontend
ports:
- "3000:3000"
depends_on:
- api
networks:
- app-net
api:
build: ./backend
environment:
DB_URL: postgres://user:pass@db:5432/app
volumes:
- ./backend:/app
networks:
- app-net
- db-net
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: pass
POSTGRES_USER: user
POSTGRES_DB: app
volumes:
- db-data:/var/lib/postgresql/data
networks:
- db-net
healthcheck:
test: ["CMD-SHELL", "pg_isready -U user -d app"]
interval: 5s
networks:
app-net:
db-net:
internal: true
volumes:
db-data:
架構(gòu)特點(diǎn):
- 前端服務(wù)暴露 3000 端口
- API 服務(wù)連接數(shù)據(jù)庫(kù)
- 數(shù)據(jù)庫(kù)使用獨(dú)立內(nèi)部網(wǎng)絡(luò)
- 數(shù)據(jù)持久化存儲(chǔ)
- 健康檢查確保依賴順序
9. 總結(jié)與進(jìn)階建議
9.1 核心要點(diǎn)回顧
編排能力:Compose 簡(jiǎn)化了多容器應(yīng)用的管理
聲明式配置:YAML 文件定義完整應(yīng)用棧
環(huán)境一致性:實(shí)現(xiàn)開發(fā)-測(cè)試-生產(chǎn)環(huán)境一致
資源控制:精確管理服務(wù)資源分配
服務(wù)發(fā)現(xiàn):內(nèi)置 DNS 解析簡(jiǎn)化服務(wù)通信
9.2 進(jìn)階學(xué)習(xí)建議
與 Swarm/K8s 集成:
docker stack deploy -c compose.yml myapp
使用擴(kuò)展字段:
x-logging: &default-logging
options:
max-size: "10m"
max-file: "3"
性能調(diào)優(yōu):
- 合理設(shè)置 ulimits
- 優(yōu)化卷驅(qū)動(dòng)選擇
- 配置 OOM 殺手策略
監(jiān)控方案:
services:
prometheus:
image: prom/prometheus
ports:
- "9090:9090"
通過掌握 Docker Compose,您已經(jīng)具備了高效管理容器化應(yīng)用的能力。建議從簡(jiǎn)單項(xiàng)目開始實(shí)踐,逐步應(yīng)用到復(fù)雜生產(chǎn)環(huán)境,最終實(shí)現(xiàn)基礎(chǔ)設(shè)施即代碼的現(xiàn)代化運(yùn)維模式。
到此這篇關(guān)于Docker Compose從入門到實(shí)踐的完全指南的文章就介紹到這了,更多相關(guān)Docker Compose使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
最詳細(xì)的docker中安裝并配置redis(圖文詳解)
這篇文章主要介紹了最詳細(xì)的docker中安裝并配置redis(圖文詳解),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
在docker環(huán)境中實(shí)現(xiàn)配置hosts
這篇文章主要介紹了在docker環(huán)境中實(shí)現(xiàn)配置hosts,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04
騰訊云服務(wù)器docker開啟端口后無法訪問的解決方法
本文主要介紹了騰訊云服務(wù)器docker開啟端口后無法訪問的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
Docker安裝Redis容器的實(shí)現(xiàn)步驟
本文主要介紹了Docker安裝Redis容器的實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
使用docker compose搭建一個(gè)elk系統(tǒng)的方法
這篇文章主要介紹了使用docker-compose搭建一個(gè)elk系統(tǒng)的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08
Docker?AIGC等大模型深度學(xué)習(xí)環(huán)境搭建步驟最新詳細(xì)版

