使用 Docker Compose

Docker Compose 是一个工具,可帮助您定义和 共享多容器应用程序。使用 Compose,您可以创建一个 YAML 文件来定义服务 只需一个命令,您就可以启动或关闭所有内容。

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

创建 Compose 文件

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

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

定义应用服务

第 6 部分中,您使用以下命令启动应用程序服务。

$ 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 服务

现在,是时候定义 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因此,它会自动获取 Network 别名。此外,还要指定要使用的镜像。

    
    services:
      app:
        # The app service definition
      mysql:
        image: mysql:8.0
  2. 接下来,定义卷映射。当您使用docker run,Docker 会自动创建命名卷。然而,事实并非如此 在使用 Compose 运行时发生。您需要在 顶级volumes:部分,然后在 Service 中指定挂载点 config。通过仅提供卷名称,默认选项为 使用。

    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标志跟随 log 的 log 函数,因此会在生成实时输出时为您提供实时输出。

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

    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

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

  4. 此时,您应该能够在 http://localhost:3000 上的浏览器中打开您的应用程序并看到它正在运行。

在 Docker Desktop Dashboard 中查看应用程序堆栈

如果您查看 Docker Desktop Dashboard,您将看到一个名为 getting-started-app 的组。这是 Docker 中的项目名称 Compose 和 used 将容器组合在一起。默认情况下,项目名称只是compose.yaml位于。

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

全部拆除

当您准备好将其全部拆除时,只需运行docker compose down或者去 Docker Desktop Dashboard 上的垃圾桶 对于整个应用程序。容器将停止,网络将被删除。

警告

默认情况下,当您运行docker compose down.如果您想 删除卷,您需要添加--volumes旗。

当您删除应用程序堆栈时,Docker Desktop Dashboard 不会删除卷。

总结

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

相关信息:

后续步骤

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