Docker教程 · 2024年11月11日

使用 Docker 组合

使用 Docker 组合

是一个帮助您定义和共享多容器应用程序的工具。使用 Compose,您可以创建一个 YAML 文件来定义服务,并且使用单个命令就可以启动或拆除所有内容。

使用 Compose 的一大优点是您可以在文件中定义应用程序堆栈,将其保存在项目存储库的根目录中(现在是版本控制的),并轻松地让其他人为您的项目做出贡献。有人只需要克隆您的存储库并使用 Compose 启动应用程序。事实上,您现在可能会在 GitHub/GitLab 上看到不少项目正是这样做的。

在该getting-started-app目录中,创建一个名为compose.yaml.


├── getting-started-app/ │ ├── Dockerfile │ ├── compose.yaml │ ├── node_modules/ │ ├── package.json │ ├── spec/ │ ├── src/ │ └── yarn.lock

在 中,您使用以下命令来启动应用程序服务。


$ docker run -dp 127.0.0.1:3000:3000 \  -w /app -v "$(pwd):/app" \  --network todo-app \  -e MYSQL_HOST=mysql \  -e MYSQL_USER=root \  -e MYSQL_PASSWORD=secret \  -e MYSQL_DB=todos \  node:18-alpine \  sh -c "yarn install && yarn run dev" 

您现在将在compose.yaml文件中定义此服务。

  1. 在文本或代码编辑器中打开compose.yaml,然后首先定义要作为应用程序一部分运行的第一个服务(或容器)的名称和图像。该名称将自动成为网络别名,这在定义 MySQL 服务时非常有用。

    services:  app:  image: node:18-alpine
  2. 通常,您会看到command接近image定义的内容,但没有订购要求。将其添加command到您的compose.yaml文件中。

    services:  app:  image: node:18-alpine  command: sh -c "yarn install && yarn run dev"
  3. 现在通过定义服务来迁移-p 127.0.0.1:3000:3000命令的一部分。ports

    services:  app:  image: node:18-alpine  command: sh -c "yarn install && yarn run dev"  ports:  - 127.0.0.1:3000:3000
  4. 接下来,使用和定义迁移工作目录 ( -w /app) 和卷映射 ( ) 。-v "$(pwd):/app"working_dirvolumes

    Docker Compose 卷定义的优点之一是您可以使用当前目录的相对路径。

    services:  app:  image: node:18-alpine  command: sh -c "yarn install && yarn run dev"  ports:  - 127.0.0.1:3000:3000  working_dir: /app  volumes:  - ./:/app
  5. 最后,您需要使用密钥迁移环境变量定义environment

    services:  app:  image: node:18-alpine  command: sh -c "yarn install && yarn run dev"  ports:  - 127.0.0.1:3000:3000  working_dir: /app  volumes:  - ./:/app  environment:  MYSQL_HOST: mysql  MYSQL_USER: root  MYSQL_PASSWORD: secret  MYSQL_DB: todos

现在,是时候定义 MySQL 服务了。您用于该容器的命令如下:


$ docker run -d \  --network todo-app --network-alias mysql \  -v todo-mysql-data:/var/lib/mysql \  -e MYSQL_ROOT_PASSWORD=secret \  -e MYSQL_DATABASE=todos \  mysql:8.0 
  1. 首先定义新服务并为其命名,mysql以便它自动获取网络别名。还要指定要使用的图像。

     services:  app:  # The app service definition  mysql:  image: mysql:8.0
  2. 接下来,定义卷映射。当您使用 运行容器时docker run,Docker 会自动创建命名卷。但是,使用 Compose 运行时不会发生这种情况。您需要在顶级volumes:部分定义卷,然后在服务配置中指定挂载点。只需仅提供卷名称,即可使用默认选项。

    services:  app:  # The app service definition  mysql:  image: mysql:8.0  volumes:  - todo-mysql-data:/var/lib/mysql  volumes:  todo-mysql-data:
  3. 最后,您需要指定环境变量。

    services:  app:  # The app service definition  mysql:  image: mysql:8.0  volumes:  - todo-mysql-data:/var/lib/mysql  environment:  MYSQL_ROOT_PASSWORD: secret  MYSQL_DATABASE: todos  volumes:  todo-mysql-data:

此时,您的完整内容compose.yaml应如下所示:


services:  app:  image: node:18-alpine  command: sh -c "yarn install && yarn run dev"  ports:  - 127.0.0.1:3000:3000  working_dir: /app  volumes:  - ./:/app  environment:  MYSQL_HOST: mysql  MYSQL_USER: root  MYSQL_PASSWORD: secret  MYSQL_DB: todos   mysql:  image: mysql:8.0  volumes:  - todo-mysql-data:/var/lib/mysql  environment:  MYSQL_ROOT_PASSWORD: secret  MYSQL_DATABASE: todos  volumes:  todo-mysql-data:

现在您已经有了compose.yaml文件,就可以开始申请了。

  1. 确保容器的其他副本没有首先运行。用于docker ps列出容器并docker rm -f <ids>删除它们。

  2. 使用命令启动应用程序堆栈docker compose up。添加 -d标志以在后台运行所有内容。

    $ docker compose up -d 

    当您运行上一个命令时,您应该看到如下输出:

    Creating network "app_default" with the default driver Creating volume "app_todo-mysql-data" with default driver Creating app_app_1 ... done Creating app_mysql_1 ... done

    您会注意到 Docker Compose 创建了卷以及网络。默认情况下,Docker Compose 会自动专门为应用程序堆栈创建一个网络(这就是您没有在 Compose 文件中定义网络的原因)。

  3. 使用命令查看日志docker compose logs -f。您将看到每个服务的日志交织到单个流中。当您想要观察与计时相关的问题时,这非常有用。该-f标志位于日志后面,因此会在生成时为您提供实时输出。

    如果您已经运行该命令,您将看到如下所示的输出:

    mysql_1 | 2019-10-03T03:07:16.083639Z 0 [Note] mysqld: ready for connections. mysql_1 | Version: '8.0.31' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL) app_1 | Connected to mysql db at host mysql app_1 | Listening on port 3000

    服务名称显示在行的开头(通常是彩色的)以帮助区分消息。如果要查看特定服务的日志,可以将服务名称添加到日志命令的末尾(例如 docker compose logs -f app)。

  4. 此时,您应该能够在浏览器中通过 打开应用程序并看到它正在运行。

如果您查看 Docker 仪表板,您会看到有一个名为getting-started-app 的组。这是 Docker Compose 中的项目名称,用于将容器分组在一起。默认情况下,项目名称只是项目所在目录的名称 compose.yaml

如果展开堆栈,您将看到在 Compose 文件中定义的两个容器。这些名称也更具描述性,因为它们遵循<service-name>-<replica-number>.因此,很容易快速查看您的应用程序是哪个容器以及 mysql 数据库是哪个容器。

当您准备好将其全部拆除时,只需运行docker compose down整个应用程序或点击 Docker 仪表板上的垃圾桶即可。容器将停止,网络将被删除。

警告

默认情况下,当您运行 时,不会删除 compose 文件中的命名卷docker compose down。如果要删除卷,则需要添加该--volumes标志。

当您删除应用程序堆栈时,Docker 仪表板不会删除卷。

在本部分中,您了解了 Docker Compose 以及它如何帮助您简化定义和共享多服务应用程序的方式。

相关信息:

接下来,您将了解一些可用于改进 Dockerfile 的最佳实践。