详解 docker-compose.yaml 配置文件

docker-compose.yaml 是用于定义和运行多容器 Docker 应用的配置文件。下面,我们将详细解释您提供的 docker-compose.yaml 文件,包括各个服务的作用、配置,以及它们与 .env 文件之间的关系。


文件概览

  • 自动生成:此配置文件是通过 generate_docker_compose 自动生成的,建议不要直接修改它,而是修改 .env.exampledocker-compose-template.yaml,然后重新生成。
  • 环境变量:文件中大量使用了环境变量,这些变量通常在 .env 文件中定义。
  • 服务定义:包含了多个服务,包括应用程序、数据库、缓存、向量数据库等。

共享环境变量

x-shared-env: &shared-api-worker-env
  VARIABLE_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.0
    restart: always
    environment:
      <<: *shared-api-worker-env
      MODE: api
      # 其他特定于 API 服务的环境变量
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started
    volumes:
      - ./volumes/app/storage:/app/api/storage
    networks:
      - 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.0
    restart: always
    environment:
      <<: *shared-api-worker-env
      MODE: worker
      # 其他特定于 Worker 服务的环境变量
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started
    volumes:
      - ./volumes/app/storage:/app/api/storage
    networks:
      - ssrf_proxy_network
      - default
  • 作用:运行 Celery Worker,处理异步任务和消息队列。
  • 环境变量
    • 使用共享环境变量。
    • MODE: worker:指定运行模式为 Worker。
  • 其他配置:与 API 服务类似。

3. Web 前端服务

  web:
    image: langgenius/dify-web:1.4.0
    restart: always
    environment:
      CONSOLE_API_URL: ${CONSOLE_API_URL:-}
      APP_API_URL: ${APP_API_URL:-}
      # 其他前端环境变量
  • 作用:运行前端 Web 应用,提供用户界面。
  • 环境变量
    • 配置前端应用所需的各类 URL 和设置。
  • 注意:没有指定卷或网络,默认使用。

4. 数据库服务(PostgreSQL)

  db:
    image: postgres:15-alpine
    restart: always
    environment:
      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/data
    healthcheck:
      test: [ 'CMD', 'pg_isready', '-h', 'db', '-U', '${PGUSER:-postgres}', '-d', '${POSTGRES_DB:-dify}' ]
      interval: 1s
      timeout: 3s
      retries: 60
  • 作用:运行 PostgreSQL 数据库,为应用提供数据存储。
  • 环境变量
    • POSTGRES_PASSWORD:数据库密码,应在 .env 文件中设置为安全的值。
    • POSTGRES_DB:数据库名称,默认为 dify
  • 命令:以自定义参数启动 PostgreSQL,配置最大连接数、共享缓冲区大小等。
  • 卷映射:将主机的 ./volumes/db/data 目录挂载到容器内的 /var/lib/postgresql/data

5. Redis 缓存

  redis:
    image: redis:6-alpine
    restart: always
    environment:
      REDISCLI_AUTH: ${REDIS_PASSWORD:-your_redis_password}
    volumes:
      - ./volumes/redis/data:/data
    command: 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.12
    restart: always
    environment:
      API_KEY: ${SANDBOX_API_KEY:-your_sandbox_api_key}
      # 其他 Sandbox 配置
    volumes:
      - ./volumes/sandbox/dependencies:/dependencies
      - ./volumes/sandbox/conf:/conf
    networks:
      - 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-local
    restart: always
    environment:
      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/storage
    depends_on:
      db:
        condition: service_healthy
  • 作用:提供插件管理和运行的后台服务。
  • 环境变量
    • 配置数据库、端口、密钥等。
  • 卷映射:挂载存储目录。
  • 端口映射:将主机和容器的调试端口进行映射。

8. SSRF 代理服务器

  ssrf_proxy:
    image: ubuntu/squid:latest
    restart: always
    volumes:
      - ./ssrf_proxy/squid.conf.template:/etc/squid/squid.conf.template
      - ./ssrf_proxy/docker-entrypoint.sh:/docker-entrypoint-mount.sh
    entrypoint: [ '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:latest
    restart: always
    volumes:
      - ./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
      - web
    ports:
      - '${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.0
    profiles:
      - ''
      - weaviate
    restart: always
    volumes:
      - ./volumes/weaviate:/var/lib/weaviate
    environment:
      PERSISTENCE_DATA_PATH: ${WEAVIATE_PERSISTENCE_DATA_PATH:-/var/lib/weaviate}
      # 其他 Weaviate 配置
  • 作用:提供 Weaviate 向量数据库服务,用于存储和检索向量数据。
  • 环境变量
    • 配置数据路径、认证方式等。
  • 卷映射
    • 挂载数据目录。

Qdrant 向量数据库

  qdrant:
    image: langgenius/qdrant:v1.7.3
    profiles:
      - qdrant
    restart: always
    volumes:
      - ./volumes/qdrant:/qdrant/storage
    environment:
      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: bridge
    internal: true
  milvus:
    driver: bridge
  opensearch-net:
    driver: bridge
    internal: 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_PASSWORDREDIS_PASSWORD)仅供测试,实际部署时应更改为强密码。
  • API 密钥:所有涉及密钥的环境变量(如 SECRET_KEYSANDBOX_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

四、详细说明

  1. 镜像拉取(Pull):在执行 docker compose up -d 命令时,Docker 会根据 docker-compose.yml 文件中定义的服务,从 Docker Hub 或私有镜像仓库中拉取所需的镜像。上表列出了每个服务对应的镜像拉取耗时。

  2. 网络创建(Network Create):Docker Compose 会为应用程序创建默认的网络环境,以便各个容器之间能够相互通信。这里创建了两个网络:

    • docker_ssrf_proxy_network
    • docker_default
  3. 容器启动(Container Start):拉取镜像并创建网络后,Docker Compose 会根据配置启动容器。上表列出了各个容器的启动状态和耗时。

    • 状态为 Started 表示容器已成功启动。
    • 状态为 Healthy 表示容器已启动并通过了健康检查。

五、注意事项

  • 依赖关系:某些服务可能依赖于其他服务,例如数据库服务可能需要先于应用程序服务启动。
  • 健康检查docker-db-1 容器的状态为 Healthy,表示该容器包含健康检查配置,Docker 在确认其健康状态后才标记为 Healthy。
  • 启动顺序:容器的启动顺序可能会影响服务的可用性,确保关键服务已成功启动并处于健康状态。

在这里插入图片描述

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐