詳解 docker-compose.yaml
配置文件
docker-compose.yaml
是用于定義和運行多容器 Docker 應用的配置文件。下面,我們將詳細解釋您提供的 docker-compose.yaml
文件,包括各個服務的作用、配置,以及它們與 .env
文件之間的關系。
文件概覽
- 自動生成:此配置文件是通過
generate_docker_compose
自動生成的,建議不要直接修改它,而是修改.env.example
或docker-compose-template.yaml
,然后重新生成。 - 環境變量:文件中大量使用了環境變量,這些變量通常在
.env
文件中定義。 - 服務定義:包含了多個服務,包括應用程序、數據庫、緩存、向量數據庫等。
共享環境變量
x-shared-env: &shared-api-worker-envVARIABLE_NAME: ${VARIABLE_NAME:-默認值}
- 用途:使用 YAML 的錨點和引用機制,定義了一組共享的環境變量,供多個服務使用。
- 示例:
DB_USERNAME: ${DB_USERNAME:-postgres}
- 意味著如果環境變量
DB_USERNAME
未設置,則使用默認值postgres
。
環境變量的使用
- 引用方式:
${VARIABLE_NAME:-默認值}
- 如果環境變量存在,則使用其值;
- 如果不存在,則使用提供的默認值。
- 來源:這些環境變量通常在
.env
文件中定義,當運行docker-compose up
時,Docker Compose 會自動加載.env
文件。 - 注意:一些敏感信息(如密碼、密鑰)在示例中有默認值,實際使用時應在
.env
文件中更改為安全的值。
服務定義
1. API 服務
services:api:image: langgenius/dify-api:1.4.0restart: alwaysenvironment:<<: *shared-api-worker-envMODE: api# 其他特定于 API 服務的環境變量depends_on:db:condition: service_healthyredis:condition: service_startedvolumes:- ./volumes/app/storage:/app/api/storagenetworks:- ssrf_proxy_network- default
- 作用:運行后端 API 服務,提供應用的核心功能。
- 環境變量:
- 使用了共享環境變量
*shared-api-worker-env
。 MODE: api
:指定運行模式為 API 服務。
- 使用了共享環境變量
- 依賴:
db
(數據庫服務)必須健康啟動。redis
(緩存)必須已啟動。
- 卷映射:
- 將主機的
./volumes/app/storage
目錄掛載到容器內的/app/api/storage
,用于存儲用戶文件。
- 將主機的
- 網絡:
- 連接到
ssrf_proxy_network
和默認網絡。
- 連接到
2. Worker 服務
worker:image: langgenius/dify-api:1.4.0restart: alwaysenvironment:<<: *shared-api-worker-envMODE: worker# 其他特定于 Worker 服務的環境變量depends_on:db:condition: service_healthyredis:condition: service_startedvolumes:- ./volumes/app/storage:/app/api/storagenetworks:- ssrf_proxy_network- default
- 作用:運行 Celery Worker,處理異步任務和消息隊列。
- 環境變量:
- 使用共享環境變量。
MODE: worker
:指定運行模式為 Worker。
- 其他配置:與 API 服務類似。
3. Web 前端服務
web:image: langgenius/dify-web:1.4.0restart: alwaysenvironment:CONSOLE_API_URL: ${CONSOLE_API_URL:-}APP_API_URL: ${APP_API_URL:-}# 其他前端環境變量
- 作用:運行前端 Web 應用,提供用戶界面。
- 環境變量:
- 配置前端應用所需的各類 URL 和設置。
- 注意:沒有指定卷或網絡,默認使用。
4. 數據庫服務(PostgreSQL)
db:image: postgres:15-alpinerestart: alwaysenvironment:PGUSER: ${PGUSER:-postgres}POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-your_password_here}POSTGRES_DB: ${POSTGRES_DB:-dify}PGDATA: ${PGDATA:-/var/lib/postgresql/data/pgdata}command: >postgres -c 'max_connections=${POSTGRES_MAX_CONNECTIONS:-100}'-c 'shared_buffers=${POSTGRES_SHARED_BUFFERS:-128MB}'# 其他 PostgreSQL 配置volumes:- ./volumes/db/data:/var/lib/postgresql/datahealthcheck:test: [ 'CMD', 'pg_isready', '-h', 'db', '-U', '${PGUSER:-postgres}', '-d', '${POSTGRES_DB:-dify}' ]interval: 1stimeout: 3sretries: 60
- 作用:運行 PostgreSQL 數據庫,為應用提供數據存儲。
- 環境變量:
POSTGRES_PASSWORD
:數據庫密碼,應在.env
文件中設置為安全的值。POSTGRES_DB
:數據庫名稱,默認為dify
。
- 命令:以自定義參數啟動 PostgreSQL,配置最大連接數、共享緩沖區大小等。
- 卷映射:將主機的
./volumes/db/data
目錄掛載到容器內的/var/lib/postgresql/data
。
5. Redis 緩存
redis:image: redis:6-alpinerestart: alwaysenvironment:REDISCLI_AUTH: ${REDIS_PASSWORD:-your_redis_password}volumes:- ./volumes/redis/data:/datacommand: redis-server --requirepass ${REDIS_PASSWORD:-your_redis_password}healthcheck:test: [ 'CMD', 'redis-cli', 'ping' ]
- 作用:運行 Redis,提供緩存和消息隊列功能。
- 環境變量:
REDIS_PASSWORD
:Redis 密碼,應在.env
文件中設置。
- 命令:啟動 Redis 服務,并設置密碼。
- 卷映射:將數據目錄掛載到主機。
6. Sandbox 服務
sandbox:image: langgenius/dify-sandbox:0.2.12restart: alwaysenvironment:API_KEY: ${SANDBOX_API_KEY:-your_sandbox_api_key}# 其他 Sandbox 配置volumes:- ./volumes/sandbox/dependencies:/dependencies- ./volumes/sandbox/conf:/confnetworks:- ssrf_proxy_network
- 作用:Dify Sandbox,提供安全的代碼執行環境。
- 環境變量:
API_KEY
:Sandbox 服務的 API 密鑰,應設置為強密鑰。
- 網絡:
- 連接到
ssrf_proxy_network
,限制外部訪問,增強安全性。
- 連接到
7. 插件守護進程(Plugin Daemon)
plugin_daemon:image: langgenius/dify-plugin-daemon:0.0.10-localrestart: alwaysenvironment:DB_DATABASE: ${DB_PLUGIN_DATABASE:-dify_plugin}SERVER_PORT: ${PLUGIN_DAEMON_PORT:-5002}# 其他插件守護進程配置ports:- "${EXPOSE_PLUGIN_DEBUGGING_PORT:-5003}:${PLUGIN_DEBUGGING_PORT:-5003}"volumes:- ./volumes/plugin_daemon:/app/storagedepends_on:db:condition: service_healthy
- 作用:提供插件管理和運行的后臺服務。
- 環境變量:
- 配置數據庫、端口、密鑰等。
- 卷映射:掛載存儲目錄。
- 端口映射:將主機和容器的調試端口進行映射。
8. SSRF 代理服務器
ssrf_proxy:image: ubuntu/squid:latestrestart: alwaysvolumes:- ./ssrf_proxy/squid.conf.template:/etc/squid/squid.conf.template- ./ssrf_proxy/docker-entrypoint.sh:/docker-entrypoint-mount.shentrypoint: [ 'sh', '-c', "..." ]environment:HTTP_PORT: ${SSRF_HTTP_PORT:-3128}# 其他 SSRF 代理配置networks:- ssrf_proxy_network- default
- 作用:防止服務器端請求偽造(SSRF)攻擊,保護內部服務。
- 配置:
- 使用 Squid 代理,限制網絡訪問。
- 網絡:
- 使用內部網絡
ssrf_proxy_network
,隔離服務。
- 使用內部網絡
9. Nginx 反向代理
nginx:image: nginx:latestrestart: alwaysvolumes:- ./nginx/nginx.conf.template:/etc/nginx/nginx.conf.template# 其他配置文件和目錄entrypoint: [ 'sh', '-c', "..." ]environment:NGINX_SERVER_NAME: ${NGINX_SERVER_NAME:-_}NGINX_HTTPS_ENABLED: ${NGINX_HTTPS_ENABLED:-false}# 其他 Nginx 配置depends_on:- api- webports:- '${EXPOSE_NGINX_PORT:-80}:${NGINX_PORT:-80}'- '${EXPOSE_NGINX_SSL_PORT:-443}:${NGINX_SSL_PORT:-443}'
- 作用:作為反向代理,轉發請求到 API 和 Web 服務。
- 環境變量:
- 配置服務器名稱、SSL 設置、端口等。
- 卷映射:
- 掛載配置模板和 SSL 證書目錄。
- 端口映射:
- 將主機的 80 和 443 端口映射到容器內的 Nginx 端口。
向量數據庫服務
Weaviate 向量數據庫
weaviate:image: semitechnologies/weaviate:1.19.0profiles:- ''- weaviaterestart: alwaysvolumes:- ./volumes/weaviate:/var/lib/weaviateenvironment:PERSISTENCE_DATA_PATH: ${WEAVIATE_PERSISTENCE_DATA_PATH:-/var/lib/weaviate}# 其他 Weaviate 配置
- 作用:提供 Weaviate 向量數據庫服務,用于存儲和檢索向量數據。
- 環境變量:
- 配置數據路徑、認證方式等。
- 卷映射:
- 掛載數據目錄。
Qdrant 向量數據庫
qdrant:image: langgenius/qdrant:v1.7.3profiles:- qdrantrestart: alwaysvolumes:- ./volumes/qdrant:/qdrant/storageenvironment:QDRANT_API_KEY: ${QDRANT_API_KEY:-your_qdrant_api_key}
- 作用:提供 Qdrant 向量數據庫服務。
- 環境變量:
QDRANT_API_KEY
:Qdrant 的 API 密鑰。
- 卷映射:
- 掛載存儲目錄。
其他向量數據庫
- pgvector:基于 PostgreSQL 的向量數據庫擴展。
- Chroma:用于處理向量數據的數據庫。
- Milvus:高性能的向量數據庫。
- OpenSearch:分布式搜索和分析引擎,可用于向量搜索。
網絡和卷定義
網絡
networks:ssrf_proxy_network:driver: bridgeinternal: truemilvus:driver: bridgeopensearch-net:driver: bridgeinternal: true
- 說明:
- 定義了多個網絡,用于隔離和連接不同的服務。
internal: true
表示該網絡無法從外部訪問,增強安全性。
卷
volumes:oradata:dify_es01_data:
- 說明:
- 定義了命名卷,用于持久化數據。
- 例如,
oradata
用于 Oracle 數據庫的數據存儲。
與 .env
文件的關系
- 環境變量加載:
docker-compose.yaml
中的環境變量通過引用${VARIABLE_NAME:-默認值}
,從.env
文件中獲取值。 - 敏感信息配置:如數據庫密碼、API 密鑰等,應在
.env
文件中設置,且不要將.env
文件提交到版本控制系統。 - 配置靈活性:通過修改
.env
文件,可以方便地更改配置,而無需直接修改docker-compose.yaml
。
安全注意事項
- 修改默認密碼:示例中的密碼(如
POSTGRES_PASSWORD
、REDIS_PASSWORD
)僅供測試,實際部署時應更改為強密碼。 - API 密鑰:所有涉及密鑰的環境變量(如
SECRET_KEY
、SANDBOX_API_KEY
)應設置為安全的隨機值。 - SSL 證書:如果啟用了 HTTPS,應將 SSL 證書放在指定的目錄,并正確配置相關環境變量。
總結
此 docker-compose.yaml
文件定義了一個復雜的多容器應用環境,包括應用程序后端、前端、數據庫、緩存、向量數據庫、插件系統等。通過使用環境變量和共享配置,可以方便地管理各個服務的配置。
在部署和運行此應用時,請注意:
- 配置
.env
文件:根據實際情況修改.env
文件中的變量值,特別是敏感信息。 - 啟動服務:使用
docker compose up -d
啟動所有服務。 - 檢查服務狀態:可以使用
docker compose ps
查看所有服務的運行狀態。
提示:由于配置文件涉及大量內容,以上解釋涵蓋了主要服務和配置項,如需更詳細的說明,請根據特定服務查閱相關官方文檔。例如,Weaviate、Qdrant、Milvus 等向量數據庫的詳細配置和使用方法,應參考其官方指南。
docker compose up -d
以下是根據你提供的 docker compose up -d 命令輸出:
一、鏡像拉取信息
服務(Service) | 操作(Action) | 耗時(Duration) |
---|---|---|
web | Pulled | 21.6s |
weaviate | Pulled | 114.4s |
db | Pulled | 38.6s |
ssrf_proxy | Pulled | 32.4s |
api | Pulled | 173.6s |
worker | Pulled | 173.6s |
sandbox | Pulled | 58.2s |
nginx | Pulled | 37.5s |
plugin_daemon | Pulled | 162.9s |
redis | Pulled | 51.2s |
二、網絡創建信息
網絡名稱(Network) | 操作(Action) | 耗時(Duration) |
---|---|---|
docker_ssrf_proxy_network | Created | 0.1s |
docker_default | Created | 0.1s |
三、容器啟動信息
容器名稱(Container) | 狀態(Status) | 耗時(Duration) |
---|---|---|
docker-web-1 | Started | 1.9s |
docker-sandbox-1 | Started | 1.9s |
docker-ssrf_proxy-1 | Started | 2.2s |
docker-redis-1 | Started | 2.1s |
docker-db-1 | Healthy | 5.5s |
docker-weaviate-1 | Started | 1.8s |
docker-plugin_daemon-1 | Started | 5.1s |
docker-worker-1 | Started | 5.3s |
docker-api-1 | Started | 5.4s |
docker-nginx-1 | Started | 6.1s |
四、詳細說明
-
鏡像拉取(Pull):在執行
docker compose up -d
命令時,Docker 會根據docker-compose.yml
文件中定義的服務,從 Docker Hub 或私有鏡像倉庫中拉取所需的鏡像。上表列出了每個服務對應的鏡像拉取耗時。 -
網絡創建(Network Create):Docker Compose 會為應用程序創建默認的網絡環境,以便各個容器之間能夠相互通信。這里創建了兩個網絡:
docker_ssrf_proxy_network
docker_default
-
容器啟動(Container Start):拉取鏡像并創建網絡后,Docker Compose 會根據配置啟動容器。上表列出了各個容器的啟動狀態和耗時。
- 狀態為 Started 表示容器已成功啟動。
- 狀態為 Healthy 表示容器已啟動并通過了健康檢查。
五、注意事項
- 依賴關系:某些服務可能依賴于其他服務,例如數據庫服務可能需要先于應用程序服務啟動。
- 健康檢查:
docker-db-1
容器的狀態為 Healthy,表示該容器包含健康檢查配置,Docker 在確認其健康狀態后才標記為 Healthy。 - 啟動順序:容器的啟動順序可能會影響服務的可用性,確保關鍵服務已成功啟動并處于健康狀態。