Docker Compose实战指南

news2026/4/28 10:25:39
本文基于 Docker Compose V2所有内容均来自 Docker 官方文档和生产环境实践。全文约 14800 字建议收藏后阅读。读完本文你将从 Docker Compose 新手成长为能够独立部署复杂多容器应用的专家。一、Docker Compose 核心概念与底层原理1.1 什么是 Docker ComposeDocker Compose 是 Docker 官方推出的多容器应用编排工具它允许你使用一个 YAML 文件来定义和运行多个 Docker 容器组成的应用程序。简单来说如果你需要同时运行一个 Web 应用、一个数据库、一个缓存和一个消息队列传统方式需要手动执行多个docker run命令并且还要处理它们之间的网络连接、依赖关系等问题。而 Docker Compose 让你可以在一个文件中定义所有这些服务然后用一条命令启动整个应用栈。Docker Compose 的核心价值一键部署一条命令启动/停止整个应用环境一致性开发、测试、生产环境使用相同的配置依赖管理自动处理服务之间的启动顺序和依赖关系可重复性相同的配置在任何地方都能得到相同的结果声明式配置描述想要什么而不是怎么做1.2 Docker Compose V1 vs V2为什么必须升级到 V2重要提醒Compose V1docker-compose命令已于 2023 年 7 月停止接收更新并且不再包含在新的 Docker Desktop 版本中。所有新的开发和部署都应该使用 Compose V2docker compose命令。特性Compose V1Compose V2命令格式docker-compose带连字符docker compose空格分隔实现语言PythonGo集成方式独立二进制文件Docker CLI 插件性能较慢显著提升特别是构建速度容器命名使用下划线分隔project_service_1使用连字符分隔project-service-1支持状态已弃用官方推荐持续更新BuildKit 支持有限原生支持默认启用升级方法Windows/macOS升级到最新版 Docker Desktop 即可自动获得 Compose V2Linux通过 Docker 官方仓库安装或手动下载二进制文件到$HOME/.docker/cli-plugins/目录1.3 Docker Compose 工作原理Docker Compose 本身不创建容器它只是一个客户端工具通过 Docker API 与 Docker Engine 通信将 Compose 文件中的声明转换为一系列 Docker API 调用。关键底层细节项目ProjectCompose 将一个应用视为一个项目默认使用当前目录的名称作为项目名称。你可以通过--project-name标志或COMPOSE_PROJECT_NAME环境变量覆盖。服务Service项目由多个服务组成每个服务对应一个或多个相同配置的容器。网络隔离Compose 会为每个项目创建一个独立的桥接网络同一项目中的所有服务默认都连接到这个网络并且可以通过服务名称互相访问。数据卷管理Compose 会自动管理命名数据卷确保数据在容器重启或重建时不会丢失。1.4 Docker Compose 的适用场景与局限性适用场景开发环境快速搭建一致的开发环境测试环境自动化测试的环境准备小型到中型生产环境单节点部署CI/CD 流水线构建和测试应用演示和原型快速展示应用功能局限性仅支持单节点部署不支持多节点集群没有内置的服务发现和负载均衡需要配合反向代理没有滚动更新和蓝绿部署功能需要手动实现不适合超大规模应用部署注意对于大规模生产环境应该使用 Kubernetes 而不是 Docker Compose。但对于 90% 的中小型应用Docker Compose 已经足够强大且简单易用。二、docker-compose.yml 文件详解Compose Specification2.1 文件格式与基本结构Compose 文件使用 YAML 格式编写默认文件名是compose.yaml或docker-compose.yml两者都支持推荐使用compose.yaml。重要更新自 Docker Compose v1.27 起version字段已被弃用。现在所有新的 Compose 文件都应该省略version字段直接使用最新的 Compose Specification。基本结构# 顶级元素services必需 services: # 服务1定义 service-name-1: # 服务配置 image: nginx:alpine ports: - 80:80 # 服务2定义 service-name-2: # 服务配置 build: . depends_on: - service-name-1 # 顶级元素networks可选 networks: # 自定义网络定义 my-network: driver: bridge # 顶级元素volumes可选 volumes: # 自定义数据卷定义 my-volume: # 顶级元素configs可选 configs: # 配置文件定义 my-config: file: ./config.conf # 顶级元素secrets可选 secrets: # 敏感信息定义 my-secret: file: ./secret.txt2.2 services 顶级元素详解services是 Compose 文件中唯一必需的顶级元素用于定义应用中的所有服务。每个服务对应一个或多个容器。2.2.1 基本配置image指定服务使用的镜像。services: nginx: image: nginx:1.25-alpine # 推荐使用具体版本不要使用 latestcontainer_name指定容器名称。services: nginx: image: nginx:alpine container_name: my-nginx # 自定义容器名称注意如果指定了container_name则该服务不能进行扩容scale因为容器名称必须是唯一的。command覆盖容器默认的 CMD 指令。services: app: image: node:20-alpine command: npm start # 字符串形式 # 或者数组形式推荐避免 shell 解析问题 command: [npm, start]entrypoint覆盖容器默认的 ENTRYPOINT 指令。services: app: image: node:20-alpine entrypoint: [/app/entrypoint.sh]working_dir设置容器内的工作目录。services: app: image: node:20-alpine working_dir: /appuser指定运行容器内进程的用户。services: app: image: node:20-alpine user: 1000:1000 # UID:GID2.2.2 构建配置build指定从 Dockerfile 构建镜像。# 简单形式指定上下文路径 services: app: build: . # 使用当前目录下的 Dockerfile 构建 # 完整形式 services: app: build: context: ./app # 构建上下文路径 dockerfile: Dockerfile.prod # 指定 Dockerfile 名称 args: # 构建参数 NODE_ENV: production VERSION: 1.0.0 target: production # 多阶段构建的目标阶段 cache_from: # 构建缓存源 - myapp:latest network: host # 构建时使用的网络重要提示构建上下文是 Docker 守护进程可以访问的文件和目录的集合。Docker 会将上下文中的所有文件发送给守护进程因此应该尽量减小上下文大小将不需要的文件添加到.dockerignore中。2.2.3 端口配置ports将容器端口映射到主机端口。services: nginx: image: nginx:alpine ports: - 80:80 # 主机端口:容器端口 - 443:443 - 127.0.0.1:8080:80 # 只绑定到 localhost - 8000-8010:8000-8010 # 端口范围映射 - 9000 # 随机映射主机端口到容器 9000 端口expose暴露端口给同一网络中的其他服务但不映射到主机。services: db: image: postgres:16-alpine expose: - 5432 # 同一网络中的服务可以通过 db:5432 访问2.2.4 环境变量配置environment设置环境变量。services: db: image: postgres:16-alpine environment: # 数组形式 - POSTGRES_DBmyapp - POSTGRES_USERpostgres - POSTGRES_PASSWORDsecret # 或者对象形式推荐 POSTGRES_DB: myapp POSTGRES_USER: postgres POSTGRES_PASSWORD: secretenv_file从文件中加载环境变量。services: app: image: node:20-alpine env_file: - .env # 默认加载 - .env.production # 额外的环境文件最佳实践永远不要在 Compose 文件中硬编码敏感信息如密码、API 密钥等。应该使用.env文件并将.env添加到.gitignore中。对于高度敏感的数据应该使用 Docker Secrets。2.2.5 数据卷配置volumes挂载数据卷或主机目录到容器。services: db: image: postgres:16-alpine volumes: # 命名数据卷推荐由 Docker 管理 - postgres_data:/var/lib/postgresql/data # 绑定挂载主机目录 - ./config:/etc/postgresql/config:ro # 只读挂载 - ./logs:/var/log/postgresql:rw # 读写挂载默认 # tmpfs 挂载临时文件系统存储在内存中 - type: tmpfs target: /tmp tmpfs: size: 100M # 必须在顶级 volumes 中声明命名数据卷 volumes: postgres_data:三种挂载类型对比类型语法特点适用场景命名数据卷volume_name:/container/pathDocker 管理性能好数据持久化数据库数据、应用状态绑定挂载/host/path:/container/path主机目录直接挂载开发时方便开发环境代码挂载、配置文件tmpfstype: tmpfs内存中存储速度快数据不持久临时文件、缓存2.2.6 网络配置networks指定服务连接的网络。services: web: image: nginx:alpine networks: - frontend - backend app: image: node:20-alpine networks: - backend db: image: postgres:16-alpine networks: - backend networks: frontend: backend:重要默认情况下Compose 会创建一个名为{project_name}_default的网络所有服务都会连接到这个网络。只有当你需要网络隔离时才需要自定义网络。network_mode指定网络模式。services: app: image: node:20-alpine network_mode: bridge # 默认 # network_mode: host # 使用主机网络 # network_mode: none # 禁用网络 # network_mode: service:web # 共享另一个服务的网络命名空间2.2.7 依赖关系与启动顺序depends_on指定服务之间的依赖关系决定启动顺序。services: web: image: nginx:alpine depends_on: - app - db app: image: node:20-alpine depends_on: - db - redis db: image: postgres:16-alpine redis: image: redis:7-alpine非常重要的注意事项depends_on只保证容器的启动顺序不保证服务的就绪顺序。也就是说它只会等待容器启动而不会等待容器内的应用程序完全启动并准备好接受请求。例如上面的配置中app服务会在db和redis容器启动后立即启动但此时 PostgreSQL 可能还在初始化过程中无法接受数据库连接导致app服务启动失败。解决方案应用层重试在应用程序中实现数据库连接重试逻辑健康检查使用healthcheck配合depends_on的条件语法等待脚本使用wait-for-it.sh等工具等待依赖服务就绪健康检查配合 depends_on推荐services: app: image: node:20-alpine depends_on: db: condition: service_healthy redis: condition: service_healthy db: image: postgres:16-alpine healthcheck: test: [CMD-SHELL, pg_isready -U postgres] interval: 5s timeout: 5s retries: 5 redis: image: redis:7-alpine healthcheck: test: [CMD, redis-cli, ping] interval: 5s timeout: 5s retries: 52.2.8 重启策略restart指定容器的重启策略。services: app: image: node:20-alpine restart: no # 默认不重启 # restart: always # 总是重启 # restart: on-failure # 仅在失败时重启 # restart: unless-stopped # 除非手动停止否则总是重启**生产环境推荐使用restart: unless-stopped**这样容器在崩溃或 Docker 重启时会自动重启但如果你手动停止了容器它不会自动重启。2.2.9 健康检查healthcheck配置容器的健康检查用于判断容器内的应用是否正常运行。services: web: image: nginx:alpine healthcheck: test: [CMD, curl, -f, http://localhost/health] interval: 30s # 检查间隔 timeout: 10s # 超时时间 retries: 3 # 重试次数 start_period: 30s # 启动后等待多久开始检查 disable: false # 是否禁用健康检查test 命令的三种形式[CMD, command, arg1, arg2]直接执行命令不通过 shell[CMD-SHELL, command arg1 arg2]通过 shell 执行命令command arg1 arg2等同于[CMD-SHELL, command arg1 arg2]2.2.10 资源限制deploy.resources配置容器的资源限制和预留。services: app: image: node:20-alpine deploy: resources: limits: # 资源上限 cpus: 1.0 # 最多使用 1 个 CPU 核心 memory: 512M # 最多使用 512MB 内存 reservations: # 资源预留 cpus: 0.25 # 预留 0.25 个 CPU 核心 memory: 128M # 预留 128MB 内存生产环境必须配置资源限制防止单个容器占用所有主机资源导致其他服务无法运行。2.3 networks 顶级元素详解networks用于定义自定义网络。默认情况下Compose 会创建一个桥接网络但你可以自定义网络的驱动、IP 地址范围等。networks: frontend: driver: bridge # 默认驱动 driver_opts: com.docker.network.bridge.enable_icc: true # 启用容器间通信 backend: driver: bridge ipam: # IP 地址管理 config: - subnet: 172.20.0.0/16 gateway: 172.20.0.1 external-network: external: true # 使用已存在的外部网络 name: my-existing-network # 外部网络的实际名称2.4 volumes 顶级元素详解volumes用于定义命名数据卷。volumes: postgres_data: driver: local # 默认驱动 driver_opts: type: none o: bind device: /data/postgres # 绑定到主机指定目录 redis_data: external: true # 使用已存在的外部数据卷 name: my-existing-redis-volume2.5 configs 与 secrets 顶级元素详解configs和secrets用于管理配置文件和敏感信息避免将它们硬编码在镜像或 Compose 文件中。configs 示例services: nginx: image: nginx:alpine configs: - source: nginx-config target: /etc/nginx/nginx.conf mode: 0444 configs: nginx-config: file: ./nginx.conf # 从文件加载配置secrets 示例services: db: image: postgres:16-alpine secrets: - postgres-password environment: POSTGRES_PASSWORD_FILE: /run/secrets/postgres-password secrets: postgres-password: file: ./postgres-password.txt # 从文件加载密码注意在单机 Docker 环境中secrets 只是简单地将文件挂载到容器的/run/secrets/目录并没有加密。但它仍然比硬编码密码要好因为密码不会出现在 Compose 文件或镜像中。2.6 变量替换与 .env 文件Docker Compose 支持在 Compose 文件中使用环境变量进行变量替换。基本语法services: db: image: postgres:${POSTGRES_VERSION:-16}-alpine environment: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}变量修饰符${VAR:-default}如果 VAR 未设置或为空使用 default${VAR-default}如果 VAR 未设置使用 default${VAR:?error}如果 VAR 未设置或为空抛出错误并退出${VAR?error}如果 VAR 未设置抛出错误并退出.env 文件Compose 会自动从当前目录下的.env文件加载环境变量。# .env 文件示例 POSTGRES_VERSION16 POSTGRES_DBmyapp POSTGRES_USERpostgres POSTGRES_PASSWORDsupersecretpassword最佳实践提供一个.env.example文件作为模板包含所有必需的环境变量将.env添加到.gitignore中不要提交到版本控制使用不同的.env文件对应不同的环境.env.dev,.env.prod使用${VAR:?error}语法验证必需的环境变量实现快速失败三、Docker Compose 常用命令详解3.1 基本生命周期命令docker compose up创建并启动所有服务。# 前台运行显示所有日志 docker compose up # 后台运行守护进程模式 docker compose up -d # 启动前重新构建镜像 docker compose up --build # 强制重新创建所有容器 docker compose up --force-recreate # 只启动指定的服务 docker compose up -d web dbdocker compose down停止并删除所有服务容器、网络。# 停止并删除容器和网络 docker compose down # 同时删除数据卷谨慎使用会丢失所有数据 docker compose down -v # 同时删除镜像 docker compose down --rmi all # 删除孤立的容器不在 Compose 文件中定义的容器 docker compose down --remove-orphansdocker compose start/stop/restart启动、停止或重启已存在的服务。# 启动所有服务 docker compose start # 启动指定服务 docker compose start web # 停止所有服务 docker compose stop # 停止指定服务 docker compose stop db # 重启所有服务 docker compose restart # 重启指定服务 docker compose restart app3.2 查看与调试命令docker compose ps列出所有服务及其状态。# 列出运行中的服务 docker compose ps # 列出所有服务包括已停止的 docker compose ps -adocker compose logs查看服务日志。# 查看所有服务的日志 docker compose logs # 查看指定服务的日志 docker compose logs web # 实时跟踪日志 docker compose logs -f # 显示最后 N 行日志 docker compose logs --tail100 # 显示日志时间戳 docker compose logs -tdocker compose exec在运行中的容器内执行命令。# 在 app 容器中启动 bash docker compose exec app bash # 以 root 用户执行命令 docker compose exec -u root app bash # 执行一次性命令 docker compose exec db psql -U postgres myappdocker compose run运行一个一次性的服务容器。# 运行 app 服务并执行 npm test docker compose run app npm test # 运行时不启动依赖服务 docker compose run --no-deps app npm test # 运行后自动删除容器 docker compose run --rm app npm testdocker compose exec vs docker compose runexec在已经运行的容器中执行命令run创建一个新的容器并执行命令执行完后容器会停止3.3 构建与镜像命令docker compose build构建服务镜像。# 构建所有服务的镜像 docker compose build # 构建指定服务的镜像 docker compose build app # 不使用缓存构建 docker compose build --no-cache # 构建并拉取最新的基础镜像 docker compose build --pulldocker compose pull拉取服务使用的镜像。# 拉取所有服务的镜像 docker compose pull # 拉取指定服务的镜像 docker compose pull dbdocker compose push推送服务镜像到镜像仓库。# 推送所有服务的镜像 docker compose push # 推送指定服务的镜像 docker compose push app3.4 其他常用命令docker compose config验证并查看合并后的 Compose 配置。# 验证配置是否正确 docker compose config # 查看合并后的完整配置 docker compose config --no-interpolatedocker compose top显示服务容器中运行的进程。# 显示所有服务的进程 docker compose top # 显示指定服务的进程 docker compose top appdocker compose stats显示服务容器的资源使用情况。# 显示所有服务的资源使用情况 docker compose stats # 显示指定服务的资源使用情况 docker compose stats app dbdocker compose scale扩容服务。# 将 app 服务扩容到 3 个实例 docker compose up --scale app3 -d # 或者 docker compose scale app3注意如果服务指定了container_name或ports映射到固定主机端口则不能进行扩容。docker compose watch自动监控文件变化并重新构建和重启服务Compose V2.22。# 启动文件监控 docker compose watch这是开发环境的一个非常有用的功能可以实现代码热重载。四、实战案例从简单到复杂的应用部署4.1 案例一最简单的 Nginx 静态网站文件结构. ├── docker-compose.yml └── html └── index.htmldocker-compose.ymlservices: nginx: image: nginx:1.25-alpine ports: - 80:80 volumes: - ./html:/usr/share/nginx/html:ro restart: unless-stoppedhtml/index.html!DOCTYPE html html head titleHello Docker Compose/title /head body h1Hello Docker Compose!/h1 /body /html启动命令docker compose up -d访问http://localhost即可看到页面。4.2 案例二Node.js PostgreSQL Redis 应用文件结构. ├── .env ├── docker-compose.yml └── app ├── Dockerfile ├── package.json └── server.js.envPOSTGRES_DBmyapp POSTGRES_USERpostgres POSTGRES_PASSWORDsupersecretpassword REDIS_URLredis://redis:6379 DATABASE_URLpostgres://postgres:supersecretpassworddb:5432/myappdocker-compose.ymlservices: app: build: ./app ports: - 3000:3000 environment: DATABASE_URL: ${DATABASE_URL} REDIS_URL: ${REDIS_URL} depends_on: db: condition: service_healthy redis: condition: service_healthy restart: unless-stopped deploy: resources: limits: cpus: 1.0 memory: 512M db: image: postgres:16-alpine environment: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: [CMD-SHELL, pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}] interval: 5s timeout: 5s retries: 5 restart: unless-stopped redis: image: redis:7-alpine volumes: - redis_data:/data healthcheck: test: [CMD, redis-cli, ping] interval: 5s timeout: 5s retries: 5 restart: unless-stopped volumes: postgres_data: redis_data:app/DockerfileFROM node:20-alpine WORKDIR /app COPY package*.json ./ RUN npm ci --onlyproduction COPY . . EXPOSE 3000 CMD [node, server.js]启动命令docker compose up -d4.3 案例三带 Nginx 反向代理和 HTTPS 的完整应用文件结构. ├── .env ├── docker-compose.yml ├── nginx │ ├── Dockerfile │ └── nginx.conf ├── certs │ ├── fullchain.pem │ └── privkey.pem └── app ├── Dockerfile └── ...docker-compose.ymlservices: nginx: build: ./nginx ports: - 80:80 - 443:443 volumes: - ./certs:/etc/nginx/certs:ro depends_on: - app restart: unless-stopped networks: - frontend - backend app: build: ./app environment: DATABASE_URL: ${DATABASE_URL} REDIS_URL: ${REDIS_URL} depends_on: db: condition: service_healthy redis: condition: service_healthy restart: unless-stopped networks: - backend deploy: resources: limits: cpus: 1.0 memory: 512M db: image: postgres:16-alpine environment: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: [CMD-SHELL, pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}] interval: 5s timeout: 5s retries: 5 restart: unless-stopped networks: - backend redis: image: redis:7-alpine volumes: - redis_data:/data healthcheck: test: [CMD, redis-cli, ping] interval: 5s timeout: 5s retries: 5 restart: unless-stopped networks: - backend networks: frontend: backend: volumes: postgres_data: redis_data:nginx/nginx.confevents {} http { server { listen 80; server_name example.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name example.com; ssl_certificate /etc/nginx/certs/fullchain.pem; ssl_certificate_key /etc/nginx/certs/privkey.pem; location / { proxy_pass http://app:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } }4.4 案例四多环境配置开发/生产使用多个 Compose 文件实现不同环境的配置。基础配置docker-compose.ymlservices: app: build: ./app environment: DATABASE_URL: ${DATABASE_URL} REDIS_URL: ${REDIS_URL} db: image: postgres:16-alpine environment: POSTGRES_DB: ${POSTGRES_DB} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} volumes: - postgres_data:/var/lib/postgresql/data redis: image: redis:7-alpine volumes: - redis_data:/data volumes: postgres_data: redis_data:开发环境覆盖docker-compose.override.yml默认自动加载services: app: ports: - 3000:3000 volumes: - ./app:/app - /app/node_modules environment: NODE_ENV: development command: npm run dev db: ports: - 5432:5432 redis: ports: - 6379:6379生产环境覆盖docker-compose.prod.ymlservices: nginx: image: nginx:1.25-alpine ports: - 80:80 - 443:443 volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - ./certs:/etc/nginx/certs:ro depends_on: - app restart: unless-stopped app: environment: NODE_ENV: production restart: unless-stopped deploy: resources: limits: cpus: 1.0 memory: 512M db: restart: unless-stopped healthcheck: test: [CMD-SHELL, pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}] interval: 5s timeout: 5s retries: 5 redis: restart: unless-stopped healthcheck: test: [CMD, redis-cli, ping] interval: 5s timeout: 5s retries: 5启动开发环境docker compose up -d启动生产环境docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d五、高级特性与最佳实践5.1 使用 Profiles 管理可选服务Profiles 允许你定义哪些服务在特定环境下应该启动。services: app: image: node:20-alpine # 总是启动 db: image: postgres:16-alpine # 总是启动 redis: image: redis:7-alpine profiles: [with-redis] # 只有指定 with-redis profile 时才启动 adminer: image: adminer:latest ports: - 8080:8080 profiles: [debug] # 只有指定 debug profile 时才启动启动命令# 只启动 app 和 db docker compose up -d # 启动 app、db 和 redis docker compose --profile with-redis up -d # 启动所有服务 docker compose --profile * up -d5.2 使用 extends 共享配置extends允许你从另一个 Compose 文件或同一文件中的另一个服务继承配置。# base.yml services: base-app: build: ./app environment: NODE_ENV: production restart: unless-stopped deploy: resources: limits: cpus: 1.0 memory: 512M# docker-compose.yml services: app1: extends: file: base.yml service: base-app environment: APP_NAME: app1 app2: extends: file: base.yml service: base-app environment: APP_NAME: app25.3 日志配置最佳实践配置日志驱动和日志轮转services: app: image: node:20-alpine logging: driver: json-file # 默认驱动 options: max-size: 10m # 单个日志文件最大大小 max-file: 3 # 最多保留 3 个日志文件生产环境推荐配置x-logging: default-logging driver: json-file options: max-size: 10m max-file: 3 services: app: image: node:20-alpine logging: *default-logging db: image: postgres:16-alpine logging: *default-logging redis: image: redis:7-alpine logging: *default-logging5.4 安全最佳实践不要以 root 用户运行容器services: app: image: node:20-alpine user: 1000:1000 # 使用非 root 用户使用只读文件系统services: app: image: node:20-alpine read_only: true tmpfs: - /tmp - /app/tmp删除不必要的 capabilitiesservices: app: image: node:20-alpine cap_drop: - ALL不要暴露不必要的端口使用具体的镜像标签不要使用 latest定期更新基础镜像扫描镜像漏洞5.5 性能优化最佳实践使用多阶段构建减小镜像大小合理配置资源限制使用命名数据卷而不是绑定挂载避免在容器中运行多个进程使用缓存加速构建使用 .dockerignore 减小构建上下文六、生产环境部署与运维6.1 生产环境部署清单在将应用部署到生产环境之前请确保你已经完成了以下检查[ ] 所有服务都配置了restart: unless-stopped[ ] 所有关键服务都配置了健康检查[ ] 所有服务都配置了资源限制[ ] 所有持久化数据都使用了命名数据卷[ ] 没有硬编码任何敏感信息[ ] 日志配置了轮转[ ] 应用运行在非 root 用户下[ ] 只暴露了必要的端口[ ] 配置了 HTTPS[ ] 有备份策略[ ] 有监控和告警6.2 备份与恢复备份数据卷# 创建备份容器将数据卷内容打包 docker run --rm \ -v myapp_postgres_data:/data \ -v $(pwd):/backup \ alpine tar czf /backup/postgres_backup_$(date %Y%m%d).tar.gz -C /data .恢复数据卷# 停止相关服务 docker compose stop db # 创建恢复容器将备份内容解压到数据卷 docker run --rm \ -v myapp_postgres_data:/data \ -v $(pwd):/backup \ alpine tar xzf /backup/postgres_backup_20260420.tar.gz -C /data # 启动服务 docker compose start db6.3 滚动更新Docker Compose 本身不支持真正的滚动更新但你可以通过以下方式实现类似的效果# 构建新镜像 docker compose build app # 启动新的容器实例 docker compose up -d --scale app2 --no-recreate # 等待新容器健康检查通过 sleep 30 # 停止旧容器 docker compose stop app-old # 删除旧容器 docker compose rm -f app-old # 缩容回原来的数量 docker compose up -d --scale app1 --no-recreate对于更复杂的更新需求建议使用 Kubernetes。6.4 监控与告警使用 docker stats 监控资源使用docker compose stats使用 Prometheus Grafana 进行全面监控services: prometheus: image: prom/prometheus:latest ports: - 9090:9090 volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml restart: unless-stopped grafana: image: grafana/grafana:latest ports: - 3000:3000 volumes: - grafana_data:/var/lib/grafana restart: unless-stopped volumes: grafana_data:七、常见问题排查与解决方案7.1 端口冲突问题错误信息Error response from daemon: driver failed programming external connectivity on endpoint ...: Bind for 0.0.0.0:80 failed: port is already allocated解决方案查找占用端口的进程sudo lsof -i :80停止占用端口的进程或者修改 Compose 文件中的端口映射7.2 服务启动顺序问题问题描述应用服务在数据库服务准备好之前就启动了导致连接失败。解决方案使用健康检查配合depends_on的条件语法推荐在应用程序中实现重试逻辑使用等待脚本7.3 数据丢失问题问题描述执行docker compose down后数据库数据丢失。原因没有使用命名数据卷而是使用了匿名数据卷。解决方案始终使用命名数据卷存储持久化数据不要轻易使用docker compose down -v它会删除所有数据卷定期备份数据7.4 镜像拉取失败问题解决方案检查网络连接配置镜像加速器登录到私有镜像仓库检查镜像名称和标签是否正确7.5 权限问题错误信息Permission denied: /app/data解决方案确保容器内的用户对挂载的目录有读写权限使用user指令指定与主机目录权限匹配的 UID 和 GID修改主机目录的权限八、总结Docker Compose 是一个非常强大且简单易用的多容器应用编排工具。它通过声明式的配置文件让你可以轻松地定义、运行和管理复杂的多容器应用。 希望本文能够帮助你全面掌握 Docker Compose让你的开发和部署工作更加高效和轻松。如果你觉得本文对你有帮助欢迎点赞、收藏和分享。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2536955.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…