当前位置:首页 > 技术 > 正文内容

Docker Compose 概述与使用

访客 技术 2026年9月25日 13

概述

Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YAML 文件来配置应用程序所需的所有服务。然后,使用一个命令,就可以从 YAML 文件配置中创建并启动所有服务。

它可以简化多容器应用的管理,使得开发、测试和部署应用更加方便。

安装

虽然 Docker Compose 是 Docker 的一个项目,但它并不随 Docker 一起自动安装。你需要在安装 Docker 后,再单独安装 Docker Compose。

从 Docker v20.10.0 开始,Docker Compose v2 已经作为 docker compose 子命令集成到 Docker 中。

在大多数 Linux 发行版上,你可以使用以下命令来安装 Docker Compose:

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

要安装其他版本的 Compose,请替换 1.29.2。

创建软链:

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

测试是否安装成功:

docker-compose --version

在 Windows 上,Docker Compose 已经包含在 Docker Desktop 中,所以你不需要单独安装。

使用方法

使用 Docker Compose 需要一个 YAML 格式的配置文件,通常命名为 docker-compose.yml。在这个文件中,你可以定义你的应用的服务、网络和卷。

之后在 docker-compose.yml 所在的目录下执行 Docker Compose 命令。

docker-compose.yml 的示例如下:

version: '3'
services:
  web:
    build: .
    ports:
     - "5000:5000"
  redis:
    image: "redis:alpine"

在这个示例中,web 和 redis 是两个服务,web 服务会从当前目录的 Dockerfile 构建镜像,并映射宿主机和容器的 5000 端口。redis 服务则使用了 Docker Hub 上的公开 redis:alpine 镜像。

要运行这个 Compose 文件,你可以使用 docker-compose up 命令。这个命令会启动并运行你的整个应用。

常用命令

# 查看 Docker Compose 版本
docker compose version

# 启动所有服务(前台运行)
docker compose up

# 启动所有服务(后台运行)
docker compose up -d

# 停止并删除容器、网络、卷等
docker compose down

# 停止并删除容器、网络、卷,同时删除镜像
docker compose down --rmi all

# 停止并删除容器、网络、卷,同时删除未使用的镜像
docker compose down --rmi local

# 启动特定服务
docker compose up [service-name]

# 停止特定服务
docker compose stop [service-name]

# 启动已停止的服务
docker compose start [service-name]

# 重启服务
docker compose restart [service-name]

# 杀死容器(强制停止)
docker compose kill [service-name]

# 显示运行的容器状态
docker compose ps

# 显示所有容器状态(包括停止的)
docker compose ps -a

# 进入容器执行命令
docker compose exec [service-name] [command]

# 构建服务镜像
docker compose build

# 不使用缓存构建镜像
docker compose build --no-cache

# 重新构建服务镜像
docker compose build --force-rm

# 推送镜像到仓库
docker compose push [service-name]

# 拉取镜像
docker compose pull [service-name]

# 查看服务日志
docker compose logs [service-name]

# 实时查看服务日志
docker compose logs -f [service-name]

# 查看特定时间后的日志
docker compose logs --since [timestamp] [service-name]

# 查看最后 n 行日志
docker compose logs --tail [n] [service-name]

# 显示容器资源使用情况
docker compose top

# 显示容器统计信息
docker compose stats

# 扩展服务实例数量
docker compose up -d --scale [service-name]=[number]

# 设置服务副本数
docker compose up -d --scale web=3 --scale worker=2

# 验证 compose 文件语法
docker compose config

# 输出解析后的 compose 文件
docker compose config --services

# 列出配置中的所有镜像
docker compose config --images

# 暂停服务
docker compose pause [service-name]

# 恢复暂停的服务
docker compose unpause [service-name]

# 在服务中运行一次性命令
docker compose run [service-name] [command]

# 复制文件到容器
docker compose cp [source] [container]:[destination]

# 显示端口映射
docker compose port [service-name] [private-port]

# 使用特定的 compose 文件
docker compose -f docker-compose.prod.yml up -d

# 使用多个 compose 文件
docker compose -f docker-compose.yml -f docker-compose.override.yml up -d

# 使用环境变量文件
docker compose --env-file .env.production up -d

配置文件说明

docker-compose.yml 是 Docker Compose 的配置文件,用于定义应用的服务、网络和卷。以下是一个 docker-compose.yml 文件的主要组成部分:

version: '3'  # Docker Compose 文件的版本
services:  # 定义应用的服务
  web:  # 服务名称
    build: .  # 构建服务的 Dockerfile 所在的路径
    ports:  # 端口映射
     - "5000:5000"  # 宿主机端口:容器端口
  redis:  # 另一个服务名称
    image: "redis:alpine"  # 使用的 Docker 镜像
  • version: Docker Compose 文件的版本。版本决定了你可以使用的功能和语法。
  • services: 定义应用的服务。每个服务都是一个容器。
  • build: 指定 Dockerfile 所在的路径,用于构建 Docker 镜像。
  • image: 指定要使用的 Docker 镜像。
  • ports: 端口映射。格式为 <宿主机端口>:<容器端口>。

服务配置示例

version: '3'
services:
  web:
    build: 
      context: .
      dockerfile: Dockerfile
    image: my-web:latest
    container_name: my-web-container
    command: ["python", "app.py"]
    environment:
      - APP_ENV=production
    volumes:
      - ./data:/var/data
    ports:
      - "5000:5000"
    networks:
      - mynetwork
    depends_on:
      - db
  db:
    image: postgres:latest
    volumes:
      - db-data:/var/lib/postgresql/data
networks:
  mynetwork:
volumes:
  db-data:
  • build: 用于指定 Dockerfile 的路径,或者一个包含 context 和 dockerfile 的对象。
  • image: 用于指定服务使用的镜像。
  • container_name: 用于指定容器的名称。
  • command: 用于覆盖默认的启动命令。
  • environment: 用于设置环境变量。
  • volumes: 用于挂载卷。
  • ports: 用于映射端口。
  • networks: 用于指定网络。
  • depends_on: 用于指定服务的依赖关系。

环境变量

用于设置环境变量。这些环境变量在容器启动时被添加到容器中,可以被容器内运行的应用程序访问。

services:
  web:
    image: my-web:latest
    environment:
      - VAR1=value1
      - VAR2=value2

也可以使用一个环境变量文件 .env,然后在 docker-compose.yml 文件中使用 env_file 子配置来指定这个文件:

services:
  web:
    image: my-web:latest
    env_file:
      - .env

网络

通过定义网络,你可以控制容器之间的通信。例如,你可以将数据库和后端服务放在同一个网络中,而将前端服务放在另一个网络中,这样前端服务就无法直接访问数据库,增加了安全性。

version: '3'
services:
  web:
    image: nginx:alpine
    networks:
      - mynetwork
networks:
  mynetwork:

在这个例子中,创建了一个名为 mynetwork 的网络,并将 web 服务连接到这个网络。

卷

用于将宿主机上的文件映射存储到容器的指定目录。宿主机的源文件或挂载点的文件修改了对应的一方也会立即反映到宿主机上,这是因为实际上是在宿主机和容器之间共享了同一份文件或目录。(所以是不需要重启服务就可以做出同样的更改)

version: '3'
services:
  web:
    image: nginx:alpine
    volumes:
      - volume1:/path/in/container1
      - volume2:/path/in/container2/xgss.txt
volumes:
  volume1:/path/in/linux1
  volume2:/path/in/linux2/xgss.txt

或

version: '3'
services:
  web:
    image: nginx:alpine
    volumes:
      - /path/in/linux1:/path/in/container1
      - /path/in/linux2/xgss.txt:/path/in/container2/xgss.txt

在这个例子中,web 服务有两个挂载目录:volume1 挂载到容器的 /path/in/container1,volume2 挂载到容器的 /path/in/container2。

重启策略

restart 子配置用于设置容器的重启策略。这决定了在容器退出时 Docker 应该如何处理它。以下是可用的选项:

  • no: 这是默认设置,容器在退出时不会自动重启。
  • always: 容器在退出时总是会自动重启,无论退出代码是什么。(用户明确使用 docker stop 或 docker kill 命令停止容器后也会重启)
  • on-failure: 只有在容器以非零状态退出时,Docker 才会自动重启它。(我们说一个容器以非零状态退出,我们是指在容器中运行的主进程已经结束,并且返回了一个非零的退出状态。这通常意味着在容器中运行的程序遇到了错误或异常情况,导致它不能正常运行。)
  • unless-stopped: 容器在退出时总是会自动重启,除非用户明确地停止了它。(使用 docker stop 或 docker kill 命令停止了容器后不会自动重启)
services:
  web:
    image: my-web:latest
    restart: on-failure

日志记录

logging 子配置用于定义容器的日志记录配置。这包括日志驱动(driver)和驱动的配置选项(options)。

logging 子配置定义的日志策略不会影响容器内使用的日志框架如 logback 的日志记录。

会记录容器的所有标准输出(STDOUT)和标准错误(STDERR)日志。这包括你的应用程序写入 STDOUT 和 STDERR 的所有内容。(比如我们部署的 web 项目,控制台输出的内容都会记录到这个日志文件中)

重启容器日志文件不会消失,新的日志会继续追加到同一个日志文件中,除非你设置了日志文件的最大大小和文件数量,超过这个限制时,旧的日志文件会被删除。

删除并重新创建了容器(例如,通过 docker-compose down 和 docker-compose up),那么旧的日志文件会被删除,因为 Docker 会为新的容器创建新的日志文件。

services:
  web:
    image: my-web:latest
    logging:
      driver: json-file
      options:
        max-size: "200k"
        max-file: "10"

我们为 web 服务的容器设置了 json-file 日志驱动,并配置了两个选项:max-size 和 max-file。这意味着日志文件的最大大小为 200KB,且最多保留 10 个日志文件。

可用的日志驱动包括 json-file、syslog、journald、gelf、fluentd、awslogs、splunk、etwlogs、gcplogs 和 logentries。

Docker 提供了多种日志驱动,每种驱动都有其特定的用途和特性:

  • json-file: 这是 Docker 的默认日志驱动。它将日志写入 JSON 文件。
  • syslog: 这个驱动将日志发送到系统的 syslog 服务。这对于集成到系统的日志系统非常有用。
  • journald: 这个驱动将日志发送到 systemd 的 journald 服务。
  • gelf: 这个驱动将日志发送到 Graylog2 服务器。
  • fluentd: 这个驱动将日志发送到 Fluentd 服务器,这是一个开源的数据收集器。
  • awslogs: 这个驱动将日志发送到 Amazon CloudWatch Logs 服务。
  • splunk: 这个驱动将日志发送到 Splunk 日志分析平台。
  • etwlogs: 这个驱动将日志发送到 Windows 的 Event Tracing for Windows (ETW) 服务。
  • gcplogs: 这个驱动将日志发送到 Google Cloud Platform (GCP) 的 Stackdriver Logging 服务。
  • logentries: 这个驱动将日志发送到 Logentries 日志分析平台。

选择哪种日志驱动取决于你的特定需求和环境。例如,如果你正在使用 AWS 平台,那么 awslogs 可能是一个好选择。如果你正在使用 GCP,那么 gcplogs 可能更好。

可以使用 docker logs 命令来查看容器的日志。例如,如果你的服务名为 web,你可以使用以下命令来查看它的日志:

docker-compose logs web

如果你使用的是 json-file 日志驱动(这是 Docker 的默认设置),日志文件通常是宿主机的 /var/lib/docker/containers/<container-id>/<container-id>-json.log。

注意:这里的 container-id 是容器 ID 的全称,docker ps 命令看到的容器 ID 是全称的前 12 位。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。