Docker - Compose



Docker Compose 是一种专门设计用于简化多容器 Docker 应用程序管理的工具。它使用 YAML 文件来描述应用程序所需的的服务、网络和卷的定义。

基本上,通过 **docker-compose.yml** 文件,我们定义每个容器的配置:构建上下文、环境变量、要公开的端口以及服务之间的关系。运行所有定义的服务可以通过一个命令 **docker-compose up** 来完成,确保它们能够协同工作。

Docker Compose 的关键概念

Docker Compose 引入了一些必要的关键概念,以便有效地理解和使用该工具。这些概念包括用 YAML 编写的 Docker Compose 文件的架构、服务、网络、卷和环境变量。让我们讨论一下每个概念。

Docker Compose 文件机制(YAML)

通常,Docker Compose 文件将是一个使用 YAML 的 docker-compose.yml 文件。该文件描述了应用程序可能需要的关于服务、网络和卷的配置。它提供了一个指南,用于启动应用程序将在其下运行的环境。理解此文件的结构对于有效地使用 Docker Compose 至关重要。

YAML 文件的关键元素

  • **版本** - 这定义了 Docker Compose 文件的格式,以确保与不同的 Docker Compose 功能兼容。
  • **服务** - 包含构成应用程序的所有服务的列表(容器)。每个服务都使用无数的配置选项进行描述。
  • **网络** - 它将指定用于容器间通信的自定义网络,并可能指定配置选项和网络驱动程序。
  • **卷** - 声明用于允许持久存储的共享卷。卷可以在服务之间共享,或用于在容器生命周期之外存储数据。

示例

version: '3.8'
services:
   web:
      image: nginx:latest
      ports:
         - "80:80"
      volumes:
         - web-data:/var/www/html
      networks:
         - webnet

   database:
      image: mysql:latest
      environment:
         MYSQL_ROOT_PASSWORD: example
      volumes:
         - db-data:/var/lib/mysql
      networks:
         - webnet

networks:
   webnet:
      driver: bridge

volumes:
   web-data:
   db-data:
Docker Compose File Mechanism (YAML)

Docker Compose 服务

Docker Compose 中的服务表示构成用户应用程序的容器。每个服务都在 `docker-compose.yml` 文件的 `services` 部分中定义,并具有其配置,例如要使用的 Docker 镜像、环境中的变量、端口、卷和网络设置。

关键服务配置选项

  • **镜像** - 此字段指定应用于服务的 Docker 镜像。
  • **构建** - 指定构建上下文的目录,从而允许指定创建镜像或不从注册表中拉取镜像。
  • **端口** - 将主机端口映射到容器。
  • **卷** - 将卷附加到您的服务以进行持久存储。
  • **环境** - 服务环境变量。
  • **Depends_on** - 定义服务依赖项,以便它们按适当的顺序启动。

示例

services:
   app:
      image: myapp:latest
      build: .
      ports:
         - "8080:80"
      volumes:
         - app-data:/usr/src/app
      environment:
         - NODE_ENV=production
      depends_on:
         - db

   db:
      image: postgres:latest
      environment:
         POSTGRES_PASSWORD: example

Docker Compose 网络

Docker Compose 网络允许服务之间进行通信。默认情况下,Docker Compose 为 **docker-compose.yml** 中描述的所有服务定义了一个单一网络。但是,您可以定义自己的自定义网络以更好地控制服务间通信。

最佳网络配置选项

  • **驱动程序** - 这指定要用于网络的驱动程序(例如,桥接、覆盖)。
  • **driver_opts** - 网络驱动程序的选项。
  • **ipam** - 指定 IP 地址管理配置,如子网和 IP 范围。

示例

networks:
   frontend:
      driver: bridge
   backend:
      driver: bridge

services:
   web:
      networks:
         - frontend

   api:
      networks:
         - frontend
         - backend

   db:
      networks:
         - backend

Docker Compose 卷

Docker Compose 使用卷来持久化 Docker 容器创建或使用的的数据。**docker-compose.yml** 文件中的 **volumes** 部分定义了附加到服务的所有卷,用于以其生命周期存在于容器之外的方式存储数据。

关键卷配置选项

  • **外部** - 指示卷是否在 Docker Compose 外部创建。
  • **驱动程序** - 指定要使用的卷驱动程序。
  • **Driver_opts** - 配置卷驱动程序的选项。

示例

volumes:
   db-data:
   app-data:
      external: true

services:
   database:
      image: postgres:latest
      volumes:
         - db-data:/var/lib/postgresql/data

   app:
      image: myapp:latest
      volumes:
         - app-data:/usr/src/app

Docker Compose 环境变量

环境变量可用于 Docker Compose 中,以将配置设置传递到服务中。这些变量可以在服务配置中作为 `environment` 部分的一部分进行定义,或从外部文件加载。

设置环境变量的基本方法

  • **内联** - 在服务定义中注册环境变量。
  • **env_file** - 此命令允许从外部文件加载环境变量。

示例

services:
   web:
      image: myapp:latest
      environment:
         - NODE_ENV=production
         - API_KEY=12345

   database:
      image: postgres:latest
      env_file:
         - .env

在 .env 文件中 -

POSTGRES_USER=myuser
POSTGRES_PASSWORD=mypassword
POSTGRES_DB=mydatabase

通过扎实地理解这些基本原理,开发人员能够很好地使用 Docker Compose 来管理和编排在 Docker 容器数量方面非常复杂和庞大的应用程序。

重要的 Docker Compose 命令

Docker Compose 是一个用于管理 Docker 应用程序的工具,它提供了有用的命令和操作,例如启动、停止、构建、运行或对一个或多个容器执行其他操作。在本节中,让我们了解必要的 Docker Compose 命令,并附带示例。

Docker Compose Up 命令

**docker-compose** up 命令启动并运行整个应用程序(如 **docker-compose.yml** 文件中定义的那样),同时创建并启动所有服务、网络和卷。此外,如果该服务的镜像从未构建过,它会构建必要的 Docker 镜像。

示例

$ docker-compose up
Docker Compose Up Command

Docker Compose Down 命令

命令 **`docker-compose down`** 停止并删除 `docker-compose.yml` 文件中定义的所有容器、网络和卷。因此,此命令有助于清理应用程序迄今为止占用的资源,从某种意义上说,您可以确保没有残留的容器或网络在某个地方继续运行。

$ docker-compose down
Docker Compose Down Command

Docker Build 命令

此命令用于为 `docker-compose.yml` 文件中定义的服务构建或重建 Docker 镜像。当 Dockerfile 或源代码发生更改时,它会运行;需要创建新的镜像。

示例

$ docker-compose build

Docker Compose Start、Stop、Restart 命令

  • **`docker-compose start`** 将启动已创建的容器,而无需重新创建它们,从而启动先前停止的服务。
  • **`docker-compose stop`** 停止当前正在运行的容器,而不会丢弃它们;因此,以后可以重新启动服务。
  • **`docker-compose restart`** 在您对环境或配置进行了更改并希望重新启动它们时非常有用。

示例

$ docker-compose start
$ docker-compose stop
$ docker-compose restart
Docker Compose Start, Stop, Restart Commands

Docker Compose Status 命令

**docker-compose ps** 命令显示 **docker-compose.yml** 文件中定义的所有服务的状况,指出容器的状况、名称、状态和端口。此命令用于检查服务的当前状态。

示例

$ docker-compose ps
Docker Compose Status Command

Docker Compose Logs 命令

命令 **`docker-compose logs`** 获取并显示定义 `docker-compose.yml` 中服务的日志的捆绑包。它对于调试和监控应用程序至关重要,因为这主要涉及执行容器的实时输出。

示例

$ docker-compose logs
Docker Compose Logs Command

Docker Compose Exec 命令

**docker-compose exec** 命令在正在运行的服务容器中运行任意命令。这对于在应用程序内运行系统命令或直接在容器内执行脚本非常方便。

示例

$ docker-compose exec <service_name> <command>
$ docker-compose exec web bash
Docker Compose Exec Command

结论

总之,Docker Compose 是一个不可或缺的工具,用于管理多容器 Docker 应用程序,它既可以简化基本设置,又可以为更复杂的场景提供强大的功能。

无论您是在本地开发、部署到生产环境还是与 CI/CD 管道集成,Docker Compose 都提供了灵活性和控制力,以便有效地管理容器化应用程序。

关于 Docker Compose 的常见问题

1. Docker Compose 如何处理服务之间的依赖关系?

当在 yml 文件中使用 **depends_on** 属性时,Docker Compose 会自动解决服务之间的依赖关系。如果一个服务依赖于另一个服务(例如,Web 服务器和数据库),Compose 会先启动被依赖的服务,确保依赖项启动并运行,然后再启动依赖的服务。这意味着无需手动干预,并且应用程序的启动过程非常流畅。

2. 我可以在生产环境中使用 Docker Compose 吗?

虽然 Docker Compose 主要用于开发和测试,但在生产环境中也可以使用,但需要注意一些问题。Compose 确实简化了应用程序的部署和扩展,但它缺乏大型生产环境所需的某些功能:例如负载均衡和滚动更新。在生产环境中,对于编排和管理大规模、高可用性的容器化应用程序,请考虑使用 Docker Swarm 或 Kubernetes 等工具。

广告