{"msg":"操作成功","code":200,"data":{"createBy":"admin","createTime":"2021-05-28 09:01:01","updateBy":"admin","updateTime":"2025-09-12 14:42:59","remark":null,"id":62,"articleTitle":"Docker（八）Docker-compose容器编排","articleUrl":"docker_compose","articleThumbnail":"https://www.asumimoe.com/imgfiles/20220906/713782e83c4e4b9bbf2d588c2789e07d.jpg","articleFlag":"0","draftStatus":"1","reprintStatement":"1","articleSummary":"Compose允许用户通过一个单独的docker-compose.yml模板文件（YAML  格式）来定义一组相关联的应用容器为一个项目（project）。   Docker-Compose项目由Python编写，调用Docker服务提供的API来对容器进行管理。因此，只要所操作的平台支持Docker  API，就可以在其上利用Compose来进行编排管理。","articleContent":"## Docker-Compose介绍\n\n### 1.简介\n\nDocker-Compose项目是Docker官方的开源项目，负责实现对Docker容器集群的快速编排。   Docker-Compose将所管理的容器分为三层，分别是工程（project），服务（service）以及容器（container）。Docker-Compose运行目录下的所有文件（docker-compose.yml，extends文件或环境变量文件等）组成一个工程，若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务，每个服务中定义了容器运行的镜像，参数，依赖。一个服务当中可包括多个容器实例，Docker-Compose并没有解决负载均衡的问题，因此需要借助其它工具实现服务发现及负载均衡。   Docker-Compose的工程配置文件默认为docker-compose.yml，可通过环境变量COMPOSE_FILE或-f参数自定义配置文件，其定义了多个有依赖关系的服务及每个服务运行的容器。   使用一个Dockerfile模板文件，可以让用户很方便的定义一个单独的应用容器。在工作中，经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目，除了Web服务容器本身，往往还需要再加上后端的数据库服务容器，甚至还包括负载均衡容器等。  Compose允许用户通过一个单独的docker-compose.yml模板文件（YAML  格式）来定义一组相关联的应用容器为一个项目（project）。   Docker-Compose项目由Python编写，调用Docker服务提供的API来对容器进行管理。因此，只要所操作的平台支持Docker  API，就可以在其上利用Compose来进行编排管理。\n\n### 2.安装\n\n官方网站https://docs.docker.com/compose/install/\n\n1. 下载docker-compose\n\n   ```shell\n   curl -L \"https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)\" -o /usr/local/bin/docker-compose\n   ```\n\n2. 增加执行权限\n\n   ```shell\n   chmod +x /usr/local/bin/docker-compose\n   ```\n\n3. 创建链接\n\n   ```shell\n   ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose\n   ```\n\n4. 验证\n\n   ```shell\n   docker-compose --version\n   docker-compose version 1.24.1, build 4667896b\n   ```\n\n## Docker-compose常用命令\n\n### 1.Docker-compose命令格式\n\n```shell\ndocker-compose [-f <arg>...] [options] [COMMAND] [ARGS...]\n```\n\n命令选项如下\n\n```shell\n-f --file # FILE指定Compose模板文件，默认为docker-compose.yml\n-p --project-name NAME # 指定项目名称，默认使用当前所在目录为项目名\n--verbose # 输出更多调试信息\n-v，-version # 打印版本并退出\n--log-level LEVEL # 定义日志等级(DEBUG, INFO, WARNING, ERROR, CRITICAL)\n```\n\n### 2.docker-compose up\n\n```shell\ndocker-compose up [options] [--scale SERVICE=NUM...] [SERVICE...]\n选项包括：\n-d # 在后台运行服务容器\n-no-color # 不是有颜色来区分不同的服务的控制输出\n-no-deps #　不启动服务所链接的容器\n--force-recreate # 强制重新创建容器，不能与-no-recreate同时使用\n–no-recreate # 如果容器已经存在，则不重新创建，不能与–force-recreate同时使用\n–no-build # 不自动构建缺失的服务镜像\n–build # 在启动容器前构建服务镜像\n–abort-on-container-exit # 停止所有容器，如果任何一个容器被停止，不能与-d同时使用\n-t, –timeout TIMEOUT # 停止容器时候的超时（默认为10秒）\n–remove-orphans # 删除服务中没有在compose文件中定义的容器\n```\n\n### 3.docker-compose ps\n\n```shell\ndocker-compose  ps [options] [SERVICE...]\n列出项目中所有在运行的容器\n```\n\n### 4.docker-compose start/stop\n\n```shell\ndocker-compose start/stop [SERVICE...]\n启动/停止已经存在的服务容器。\n```\n\n### 5.docker-compose -h\n\n```undefined\ndocker-compose -h\n查看帮助\n```\n\n### 6.docker-compose down\n\n```shell\ndocker-compose down [options]\n停止和删除容器、网络、卷、镜像。\n选项包括：\n–rmi type，删除镜像，类型必须是：all，删除compose文件中定义的所有镜像；local，删除镜像名为空的镜像\n-v, –volumes # 删除已经在compose文件中定义的和匿名的附在容器上的数据卷\n–remove-orphans # 删除服务中没有在compose中定义的容器\ndocker-compose down # 停用移除所有容器以及网络相关\n```\n\n### 7.docker-compose logs\n\n```shell\ndocker-compose logs [options] [SERVICE...]\n查看服务容器的输出。默认情况下，docker-compose将对不同的服务输出使用不同的颜色来区分。可以通过–no-color来关闭颜色。\ndocker-compose logs # 查看服务容器的输出 \n-f # 跟踪日志输出\n```\n\n### 8.docker-compose bulid\n\n```shell\ndocker-compose build [options] [--build-arg key=val...] [SERVICE...]\n构建（重新构建）项目中的服务容器。\n选项包括：\n–pull # 始终尝试通过拉取操作来获取更新版本的镜像\n-m, –memory # MEM为构建的容器设置内存大小\n–build-arg key=val # 为服务设置build-time变量，服务容器一旦构建后，将会带上一个标记名。可以随时在项目目录下运行docker-compose build来重新构建服务\n```\n\n### 9.docker-compose pull\n\n```shell\ndocker-compose pull [options] [SERVICE...]\n拉取服务依赖的镜像。\n选项包括：\n–ignore-pull-failures # 忽略拉取镜像过程中的错误\n–parallel # 多个镜像同时拉取\n–quiet # 拉取镜像过程中不打印进度信息\ndocker-compose pull # 拉取服务依赖的镜像\n```\n\n### 10.docker-compose restart\n\n```shell\ndocker-compose restart [options] [SERVICE...]\n重启项目中的服务。\n选项包括：\n-t, –timeout TIMEOUT # 指定重启前停止容器的超时（默认为10秒）\ndocker-compose restart # 重启项目中的服务 \n```\n\n### 11.docker-compose rm\n\n```bash\ndocker-compose rm [options] [SERVICE...]\n删除所有（停止状态的）服务容器。\n选项包括：\n–f, –force # 强制直接删除，包括非停止状态的容器\n-v # 删除容器所挂载的数据卷\ndocker-compose rm # 删除所有（停止状态的）服务容器。推荐先执行docker-compose stop命令来停止容器。\n```\n\n### 12.docker-compose pause/unpause\n\n```shell\ndocker-compose pause/unpause [SERVICE...]\n暂停一个服务容器/恢复处于暂停状态的容器\n```\n\n### 13.docker-compose kill\n\n```bash\ndocker-compose kill [options] [SERVICE...]\n通过发送SIGKILL信号来强制停止服务容器。 \n支持通过-s参数来指定发送的信号，例如通过如下指令发送SIGINT信号：\ndocker-compose kill -s SIGINT\n```\n\n### 14.docker-compose config\n\n```shell\ndocker-compose config [options]\n验证并查看compose文件配置。\n选项包括：\n-q, –quiet # 只验证配置，不输出。 当配置正确时，不输出任何内容，当文件配置错误，输出错误信息\n–services # 打印服务名，一行一个\n–volumes # 打印数据卷名，一行一个\n```\n\n### 15.docker-compose create\n\n```shell\ndocker-compose create [options] [SERVICE...]\n为服务创建容器。\n选项包括：\n–force-recreate # 重新创建容器，即使配置和镜像没有改变，不兼容–no-recreate参数\n–no-recreate # 如果容器已经存在，不需要重新创建，不兼容–force-recreate参数\n–no-build # 不创建镜像，即使缺失\n–build # 创建容器前，生成镜像\n```\n\n### 16.docker-compose exec\n\n```shell\ndocker-compose exec [options] SERVICE COMMAND [ARGS...]\n选项包括：\n-d # 分离模式，后台运行命令。\n–privileged # 获取特权。\n–user USER  # 指定运行的用户。\n-T  # 禁用分配TTY，默认docker-compose exec分配TTY。\n–index=index # 当一个服务拥有多个容器时，可通过该参数登陆到该服务下的任何服务，例如：docker-compose exec –index=1 web /bin/bash，web服务中包含多个容器\n```\n\n### 17.docker-compose port\n\n```shell\ndocker-compose port [options] SERVICE PRIVATE_PORT\n显示某个容器端口所映射的公共端口。\n选项包括：\n–protocol=proto # 指定端口协议，TCP（默认值）或者UDP\n–index=index # 如果同意服务存在多个容器，指定命令对象容器的序号（默认为1）\n```\n\n## Docker-compose模板文件\n\n### 1.基本文件结构\n\n一个典型的 Docker Compose YAML 文件包含以下主要部分：\n\n```yaml\nversion: '3.8'  # 指定 Compose 文件格式版本\n\nservices:   # 定义服务的容器\n  web:      # 服务名称\n    # 服务配置\n\n  database:\n    # 服务配置\n\nnetworks:  # 定义网络\n  # 网络配置\n\nvolumes:   # 定义数据卷\n  # 卷配置\n\nconfigs:   # 定义配置（Swarm 模式下常用）\n  # 配置\n\nsecrets:   # 定义密钥（Swarm 模式下常用）\n  # 密钥配置\n```\n\n### 版本说明\n\n| 版本 | 说明         | 重要特性               |\n| ---- | ------------ | ---------------------- |\n| 2.x  | 旧版本格式   | 支持有限功能           |\n| 3.x  | 当前推荐版本 | 支持大部分 Docker 功能 |\n| 3.8  | 最新稳定版本 | 完整功能支持           |\n\n### 2.Services（服务）配置详解\n\n#### 1）镜像与构建配置\n\n```yaml\nservices:\n  webapp:\n    # 使用现有镜像\n    image: nginx:latest\n    \n    # 或者从 Dockerfile 构建\n    build:\n      context: .  # Dockerfile 所在目录\n      dockerfile: Dockerfile.dev  # 指定 Dockerfile 文件名\n      args:  # 构建参数\n        - BUILD_ENV=production\n      target: builder  # 多阶段构建的目标阶段\n```\n\n#### 2）端口映射\n\n```yaml\nservices:\n  webapp:\n    ports:\n      - \"80:80\"           # 主机端口:容器端口\n      - \"443:443\"         # 另一个端口映射\n      - \"3000\"            # 仅暴露容器端口，主机随机端口\n      - \"127.0.0.1:8080:80\"  # 绑定到特定主机IP\n```\n\n#### 3）环境变量配置\n\n```yaml\nservices:\n  webapp:\n    environment:\n      - NODE_ENV=production\n      - DATABASE_URL=postgresql://user:pass@db:5432/mydb\n      - REDIS_URL=redis://redis:6379\n    \n    # 或者使用环境变量文件\n    env_file:\n      - .env\n      - .env.production\n```\n\n#### 4）数据卷挂载\n\n```yaml\nservices:\n  webapp:\n    volumes:\n      # 命名卷\n      - db-data:/var/lib/mysql\n      \n      # 绑定挂载（主机路径:容器路径）\n      - ./app:/usr/src/app\n      \n      # 只读挂载\n      - ./config:/etc/config:ro\n      \n      # 匿名卷（不推荐）\n      - /tmp\n```\n\n#### 5）网络配置\n\n```yaml\nservices:\n  webapp:\n    networks:\n      - frontend\n      - backend\n    \n    # 自定义网络别名\n    networks:\n      frontend:\n        aliases:\n          - web\n          - webapp.example.com\n```\n\n#### 6）依赖与启动顺序\n\n```yaml\nservices:\n  webapp:\n    depends_on:\n      - database\n      - redis\n    \n    # 健康检查依赖（等待服务健康后再启动）\n    depends_on:\n      database:\n        condition: service_healthy\n      redis:\n        condition: service_started\n```\n\n#### 7）资源限制\n\n```yaml\nservices:\n  webapp:\n    deploy:  # 仅在 Swarm 模式下生效\n      resources:\n        limits:\n          cpus: '0.50'\n          memory: 512M\n        reservations:\n          cpus: '0.25'\n          memory: 256M\n    \n    # 非 Swarm 模式的资源限制\n    mem_limit: 512m\n    mem_reservation: 256m\n    cpus: \"0.5\"\n```\n\n#### 8）重启策略\n\n```yaml\nservices:\n  webapp:\n    restart: unless-stopped  # 总是重启 | 失败时重启 | 不重启 | 除非手动停止\n    \n    # 或者使用 Swarm 模式下的配置\n    deploy:\n      restart_policy:\n        condition: on-failure\n        delay: 5s\n        max_attempts: 3\n        window: 120s\n```\n\n### 3.Networks（网络）配置\n\n```yaml\nnetworks:\n  # 默认网络（自动创建）\n  default:\n    driver: bridge\n\n  # 自定义网络\n  frontend:\n    driver: bridge\n    driver_opts:\n      com.docker.network.driver.mtu: 1450\n    ipam:\n      driver: default\n      config:\n        - subnet: \"172.28.0.0/16\"\n          gateway: \"172.28.5.254\"\n\n  backend:\n    driver: overlay  # Swarm 模式下的覆盖网络\n    internal: true   # 内部网络，不对外暴露\n    attachable: true # 允许其他容器附加到此网络\n```\n\n### 4.Volumes（数据卷）配置\n\n```yaml\nvolumes:\n  # 默认卷（使用默认驱动）\n  db-data:\n  \n  # 自定义配置的卷\n  app-data:\n    driver: local\n    driver_opts:\n      type: nfs\n      o: addr=192.168.1.100,rw\n      device: \":/path/to/nfs/share\"\n  \n  # 外部已存在的卷\n  existing-volume:\n    external: true\n    name: my-existing-volume\n```\n\n### 完整示例\n\n下面是一个完整的 Docker Compose 文件示例：\n\n```yaml\nversion: '3.8'\n\nservices:\n  web:\n    build: .\n    ports:\n      - \"8000:8000\"\n    volumes:\n      - .:/code\n      - logvolume01:/var/log\n    environment:\n      - NODE_ENV=development\n    depends_on:\n      - redis\n      - db\n    networks:\n      - frontend\n      - backend\n\n  redis:\n    image: redis:alpine\n    ports:\n      - \"6379\"\n    networks:\n      - backend\n    healthcheck:\n      test: [\"CMD\", \"redis-cli\", \"ping\"]\n      interval: 10s\n      timeout: 5s\n      retries: 3\n\n  db:\n    image: postgres:13\n    volumes:\n      - db-data:/var/lib/postgresql/data\n    environment:\n      - POSTGRES_DB=mydb\n      - POSTGRES_USER=user\n      - POSTGRES_PASSWORD=pass\n    networks:\n      - backend\n    deploy:\n      resources:\n        limits:\n          memory: 1G\n\n  nginx:\n    image: nginx:alpine\n    ports:\n      - \"80:80\"\n    volumes:\n      - ./nginx.conf:/etc/nginx/nginx.conf\n    depends_on:\n      - web\n    networks:\n      - frontend\n\nvolumes:\n  db-data:\n  logvolume01:\n\nnetworks:\n  frontend:\n    driver: bridge\n  backend:\n    driver: bridge\n    internal: true\n```","categoryId":9,"viewCount":677,"categoryName":"Docker","author":"球接子","authorAvatar":null,"tagIds":[9],"tagNames":["Docker"]}}