Docker Compose使用手册之场景、文件与命令详解
一、什么是 Docker Compose
Docker Compose 是 Docker 官方的开源项目,使用 Python 编写,调用 Docker 服务的 API 来管理和编排容器。官方定义为:定义和运行多个 Docker 容器的应用。
在 Docker Compose 中,有两个重要概念:
- 服务(Service):一个应用的容器,通常包括多个运行相同镜像的容器实例。
- 项目(Project):由一组相关的应用容器组成的完整业务单元,在
docker-compose.yml文件中定义。整个docker-compose.yml文件定义了一个项目。
Compose 的默认管理对象是 项目,通过子命令对项目中的一组容器进行简化的生命周期管理。
通过 compose 可以方便的管理多个服务。

二、为什么需要 Docker Compose
Docker 是一个轻量化的应用程序,官方推荐每个 Docker 容器只运行一个进程。
- 如果一个应用需要 MySQL、Nginx 等环境,那么我们需要为应用、数据库和 Nginx 分别创建独立的 Docker 容器,并逐一启动它们。
- 设想一下,构建好 Docker 后,每次启动应用都需要执行至少三次
docker run,或者编写脚本来实现,这会显得非常繁琐。 - 此外,这些容器是分散独立的,不方便管理和维护镜像。既然这些容器都是为了同一个应用提供服务,那么将它们放在一起管理显得更为合理。这时,Docker Compose 就能帮助解决这类问题。
三、Docker Compose 使用步骤 / 核心功能
步骤
- 安装 Docker 和 Docker Compose:确保已经安装了 Docker 和 Docker Compose。
- 创建
docker-compose.yml文件:在项目根目录下创建一个docker-compose.yml文件,定义服务、网络和卷等配置。 - 定义服务:在
docker-compose.yml中定义每个服务(容器),包括镜像、环境变量、端口映射等。 - 启动服务:使用命令
docker-compose up启动所有服务,-d参数可以让容器在后台运行。 - 停止服务:使用命令
docker-compose down停止并删除所有容器。 - 查看日志:使用
docker-compose logs查看容器的日志输出。
核心功能
- 多容器管理:可以轻松定义和管理多个服务(容器)。
- 一键启动与停止:通过命令启动或停止所有容器,简化操作。
- 服务依赖:自动处理服务之间的启动顺序。
- 配置管理:通过环境变量和
.env文件管理配置。 - 数据持久化:支持使用卷(Volumes)持久化数据。
- 扩展服务:可以轻松扩展服务实例数量,处理负载。
四、Docker Compose 的使用场景
开发环境:在开发过程中,Docker Compose 可以用来快速搭建多容器的开发环境,例如将数据库、缓存服务器、Web 应用等服务组合在一起,开发者可以通过一条命令启动或停止整个环境。
测试环境:用于构建和管理临时的测试环境,确保不同服务之间的协作和集成测试在统一的环境中进行。可以确保每次测试时环境的一致性。
本地开发与调试:在本地开发中,Docker Compose 允许开发者同时运行多个依赖服务(如数据库、消息队列等),无需手动启动每个容器,便于开发和调试。
微服务架构:在微服务架构中,Docker Compose 可以用来管理多个微服务及其依赖服务(如数据库、API 网关等),通过 Compose 配置文件统一管理和部署。
多环境部署:Docker Compose 支持为不同的环境(如开发、测试、生产)配置不同的服务和设置,帮助实现环境间的一致性和迁移。
CI/CD 流水线:在持续集成/持续部署(CI/CD)过程中,Docker Compose 可用于自动化构建、测试和部署多容器应用,简化流程,保证环境一致性。
本地模拟生产环境:在本地机器上使用 Docker Compose 模拟生产环境中的复杂服务拓扑,帮助开发者在开发阶段提前发现潜在问题。
五、Docker Compose 文件(docker-compose.yml)
文件语法版本
目前,官方支持三大版本:Version 1、Version 2 和 Version 3,其中 Version 1 已被废弃。当前最新版本为 3.8,要求 Docker Engine 版本至少为 19.03.0。本课程将基于 3.8 版本的 Compose 文件语法进行讲解,其他版本的详细内容可以参考官方文档。
文件基本结构及常见指令
YAML 示例:
version: "3.8" # 定义当前使用的 Docker Compose 语法版本
services: # 服务定义,支持多个服务
servicename: # 服务名称,内部 bridge 网络中使用的 DNS 名称。非集群模式下相当于 Docker run 命令中的名称。
image: # 必选项,指定容器镜像
command: # 可选项,覆盖镜像的默认启动命令
environment: # 可选项,等同于 docker run 中的 --env 参数,用于设置环境变量
volumes: # 可选项,等同于 docker run 中的 -v 参数,用于数据卷挂载
networks: # 可选项,等同于 docker run 中的 --network 参数,指定容器网络
ports: # 可选项,等同于 docker run 中的 -p 参数,指定端口映射
expose: # 可选项,指定容器暴露的端口
build: # 可选项,指定构建镜像的路径
depends_on: # 可选项,定义服务间的依赖关系
env_file: # 可选项,定义外部环境变量文件常见字段格式语法
image: 指定容器运行的镜像。支持多种格式:
image: redis image: redis:5 image: redis@sha256:0ed5d5928d4737458944eb604cc8509e245c3e19d02ad83935398bc4b991aac7 image: library/redis image: my_private.registry:5000/redis
command: 覆盖容器启动时的默认命令:
command: ["bundle", "exec", "thin", "-p", "3000"] command: bundle exec thin -p 3000
entrypoint: 覆盖容器的默认 entrypoint:
entrypoint: /code/entrypoint.sh entrypoint: - php - -d - zend_extension=/usr/local/lib/php/extensions/no-debug-nonzts-20100525/xdebug.so - -d - memory_limit=-1 - vendor/bin/phpunit
environment: 设置环境变量,可以使用数组或字典格式:
environment: RACK_ENV: development SHOW: "true"
或者数组格式:
environment: - RACK_ENV=development - SHOW=true
networks: 配置容器使用的网络:
services:
frontend:
image: awesome/webapp
networks:
- front-tier
- back-tier
monitoring:
image: awesome/monitoring
networks:
- admin
backend:
image: awesome/backend
networks:
back-tier:
aliases:
- database
volumes: 将主机的数据卷或文件挂载到容器中:
services:
db:
image: postgres:latest
volumes:
- "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
- "/localhost/data:/var/lib/postgresql/data"
ports: 配置端口映射:
ports:
- target: 80
published: 8080
host_ip: 127.0.0.1
protocol: tcp
mode: host
expose: 暴露容器内部端口,但不进行端口映射:
expose: - "3000" - "8000"
build: 指定构建镜像的上下文路径:
version: "3.7"
services:
webapp:
build: ./dir
depends_on: 设置服务依赖关系,确保服务按顺序启动:
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
可以根据服务健康状态设置条件:
services:
web:
build: .
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
env_file: 从文件中加载环境变量,可以是多个文件:
env_file: - .env - ./common.env - ./apps/web.env - /opt/secrets.env
示例:使用healthcheck配置容器健康检查
version: "3.8"
services:
web:
image: nginx:1.24.0
environment:
TEST: 1
depends_on:
mysql:
condition: service_healthy
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: "bit@123"
volumes:
- /data/maxhou/mysqldata/varlib/:/var/lib/mysql
healthcheck:
test: mysql --user=root --password='bit@123' -e "SELECT 1;"
interval: 10s
timeout: 5s
retries: 10
六、Dockers Compose 命令清单
常见 Docker Compose 命令 与 官方文档
启动和管理服务
docker-compose up:构建、(重新)创建、启动和附加到容器。docker-compose down:停止并移除容器、网络和卷。docker-compose start:启动已创建的容器。docker-compose stop:停止容器。docker-compose restart:重新启动服务容器。
构建和镜像管理
docker-compose build:构建或重新构建服务的镜像。docker-compose push:将构建的镜像推送到 Docker 注册表。
容器状态和日志
docker-compose ps:列出服务的容器状态。docker-compose logs:查看容器的输出日志。docker-compose exec:在运行中的容器内执行命令。docker-compose run:启动一个新容器并运行一次命令。
容器的其他操作
docker-compose exec:在运行中的容器中执行命令。docker-compose run:运行一个一次性的容器实例。docker-compose config:验证并查看 Compose 文件的配置。docker-compose top:列出正在运行的容器的进程信息。
资源管理
docker-compose scale:设置服务的容器数量(只适用于 Version 2 格式)。
官方文档
Docker Compose 的官方文档包含完整的命令清单、配置项说明以及示例,可以通过以下链接访问:
Docker Compose 命令文档:https://docs.docker.com/compose/reference/
该页面提供了所有 docker-compose 命令的详细说明,包括常用命令、选项和用法示例。
命令格式
对于 Docker Compose,大多数命令可以作用于整个项目,也可以针对项目中的特定服务或容器。如果没有特别说明,命令默认会影响整个项目,即项目中的所有服务。
docker compose 命令的基本格式为:
docker compose [OPTIONS] COMMAND [ARGS...]
常见选项说明:
-f, --file:指定 Compose 模板文件,默认为docker-compose.yml,可使用多个文件。-p, --project-name:指定项目名称,默认使用当前目录名称作为项目名。
常见选项 / 命令
常见选项
-f --file指定使用的Compose模板文件,默认为docker-compose.yml,可以多次指定-p, --project-name指定项目名称,默认使用“所在目录的名称”作为项目名
常见命令
Docker Compose 常见命令及选项说明
1. up
该命令会自动完成包括构建镜像、(重新)创建服务、启动服务并关联相关容器等操作,通常用于启动一个项目。
基本命令格式:
docker compose up [OPTIONS] [SERVICE...]
常见选项:
-d:在后台运行服务容器,推荐在生产环境中使用该选项。--force-recreate:强制重新创建容器,不能与--no-recreate同时使用。--no-recreate:如果容器已存在,则不重新创建,不能与--force-recreate同时使用。
2. down
停止所有容器,并删除容器和网络。
基本命令格式:
docker compose down [OPTIONS] [SERVICE...]
常见选项:
-v, --volumes:删除容器的同时删除与容器关联的卷(目录映射)。
3. run
在指定服务容器上执行相关命令。此命令用于启动服务容器并在其中执行命令。
基本命令格式:
docker compose run [OPTIONS] SERVICE [COMMAND] [ARGS...]
常见选项:
-d:后台运行容器。--name NAME:为容器指定一个名称。--entrypoint CMD:覆盖容器的默认启动命令。-e KEY=VAL:设置环境变量,支持多次使用来设置多个环境变量。-u,--user="":指定运行容器的用户名或 UID。--rm:运行命令后自动删除容器。-p,--publish=[]:映射容器端口到本地主机。
示例:
# 启动 ubuntu 服务容器,并执行 ping docker.com 命令 docker compose run ubuntu ping docker.com
下面是一个基本的 Docker Compose 操作案例,假设你的操作环境是 Ubuntu。
操作案例
下面演示如何创建一个包含 Nginx 和 MySQL 的多容器应用,并通过 docker-compose.yml 文件管理它们。我们可以根据需要扩展服务、配置网络和卷等。
1. 安装 Docker 和 Docker Compose
首先确保你的 Ubuntu 系统已经安装了 Docker 和 Docker Compose。你可以使用以下命令进行安装。
更新你的包列表并安装依赖:
sudo apt update sudo apt install apt-transport-https ca-certificates curl software-properties-common
安装 Docker:
curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh
安装 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
验证安装:
docker --version docker-compose --version
创建 Docker Compose 项目文件
假设我们要创建一个简单的项目,包含一个 Nginx 服务和一个 MySQL 数据库服务。
创建一个新目录:
mkdir myproject cd myproject
创建 docker-compose.yml 文件:
使用编辑器创建 docker-compose.yml 文件,该文件描述了我们的服务和配置。
version: '3'
services:
web:
image: nginx:latest
container_name: nginx-container
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
networks:
- mynetwork
db:
image: mysql:5.7
container_name: mysql-container
environment:
MYSQL_ROOT_PASSWORD: examplepassword
MYSQL_DATABASE: exampledb
volumes:
- mysql-data:/var/lib/mysql
networks:
- mynetwork
networks:
mynetwork:
volumes:
mysql-data:解释:
web 服务:使用 Nginx 镜像,映射本地的 8080 端口到容器的 80 端口。
db 服务:使用 MySQL 5.7 镜像,设置了数据库根密码 examplepassword 和数据库名 exampledb。
我们创建了一个网络 mynetwork 来让容器间通信,并为 MySQL 创建了一个数据卷 mysql-data 来持久化数据库数据。
创建 HTML 文件(可选):
如果你希望在浏览器中访问你的 Nginx 服务并显示内容,可以创建一个简单的 HTML 文件:
mkdir html echo "<h1>Hello from Docker Compose!</h1>" > html/index.html
3. 启动服务
在项目目录中,使用 docker compose up 命令来启动所有定义的服务。
docker compose up
如果你希望在后台运行容器,可以加上 -d 参数:
docker compose up -d
这个命令会:
- 下载
nginx和mysql镜像(如果尚未下载)。 - 创建并启动容器。
- 自动创建网络
mynetwork和卷mysql-data。
你可以用 docker ps 查看正在运行的容器:
docker ps
4. 访问 Nginx 服务
如果一切正常,你可以在浏览器中访问 Nginx 服务,打开 http://localhost:8080,你应该能够看到 “Hello from Docker Compose!” 的 HTML 内容。
5.查看容器日志
如果你想查看容器的日志,使用 docker compose logs 命令:
docker compose logs web
这将显示 Nginx 容器的日志。如果你想查看 MySQL 容器的日志,可以使用:
docker compose logs db
6.停止并删除服务
要停止并删除所有运行中的服务和容器,可以使用 docker compose down 命令:
docker compose down
如果你希望同时删除卷(例如 MySQL 的数据卷),可以使用 -v 选项:
docker compose down -v
七、常见问题
up、run 和 start 之间的区别
docker-compose up:用于启动或重新启动通过docker-compose.yml文件定义的所有服务。在默认模式下,会显示所有容器的日志。在“分离模式”(-d)下,容器会在后台启动,Compose 命令会退出,但容器继续运行。docker-compose run:用于运行“一次性”或“临时”任务,只会启动指定服务及其依赖的服务。常用于执行测试或管理任务,如从数据卷容器中删除或添加数据。run命令类似于docker run -ti,启动容器并进入交互式终端,执行完后根据进程的退出状态返回退出代码。docker-compose start:用于重新启动已存在但停止的容器。不会创建新容器,只会启动已存在的、被停止的服务容器。
如何在同一主机上运行 Compose 文件的多个副本
Compose 使用项目名称为项目中的所有容器和资源创建唯一标识符。要运行项目的多个副本,可以通过以下方式设置自定义项目名称:
这样可以在同一主机上启动多个独立的 Compose 项目实例。
- 使用
-p命令行选项来指定项目名称。 - 使用
COMPOSE_PROJECT_NAME环境变量来设置项目名称。
可以控制服务启动顺序吗?
可以通过在 docker-compose.yml 文件中使用 depends_on 来指定服务的启动顺序。可以结合 healthcheck 功能来确保服务在健康检查成功后再启动,从而实现更精确的启动控制。
到此这篇关于Docker Compose使用手册之场景、文件与命令详解的文章就介绍到这了,更多相关Docker Compose使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Windows10安装WSL2 Ubuntu20.04并设置docker环境的方法
这篇文章主要介绍了Windows10安装WSL2 Ubuntu20.04并设置docker环境的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-05-05
使用Docker compose编排Laravel应用的方法
本篇文章主要介绍了使用Docker compose编排Laravel应用的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-07-07
Docker查看镜像的Dockerfile(docker history和docker inspec
这篇文章主要给大家介绍了关于Docker查看镜像的Dockerfile的相关资料,文中主要运用的是docker history和docker inspect命令,文中通过代码介绍的非常详细,需要的朋友可以参考下2024-05-05
Docker部署nginx+php环境的全过程(简单可用!)
最近在学docker,顺便配置了一下docker中的nginx与php,发现网上的关于docker中配置nginx与php的资料很少,而且有的也很旧,没有太多的参考性,下面这篇文章主要给大家介绍了关于Docker部署nginx+php环境的相关资料,需要的朋友可以参考下2023-02-02


最新评论