Docker——Docker Compose总结

简介

  Docker Compose 是一种工具,用于帮助定义和共享多容器应用程序。 通过 Compose,你可以创建 YAML 文件来定义服务,并且只需一个命令,就可以启动或清理所有内容。

  使用 Compose 的巨大优点是,你可以在文件中定义应用程序堆栈,使其位于项目存储库的根目录下(它现在受版本控制),并方便其他人参与你的项目。 其他人只需克隆你的存储库即可开始撰写应用。 事实上,你可能会看到 GitHub/GitLab 上的很多项目现在都是这样做的。

那么,如何开始?

Docker Compose的使用步骤

1、安装 Docker Compose

  如果你为 Windows 或 Mac 安装了 Docker Desktop,则你已拥有 Docker Compose! Play-with-Docker 实例也已安装 Docker Compose。 如果你使用的是 Linux 计算机,则需要按照此处的说明安装 Docker Compose。
安装教程

  安装后,你应该能够运行以下内容并查看版本信息。

docker-compose version

2、创建 Compose 文件

  在应用项目的根目录中,创建名为 docker-compose.yml 的文件。

  在 Compose 文件中,我们将首先定义架构版本。 在大多数情况下,最好使用支持的最新版本。 你可以查看 Compose 文件参考获取当前架构版本和兼容性矩阵。

version: "3.7"

  接下来,定义要作为应用程序的一部分运行的服务(或容器)列表。

version: "3.7"

services:

  现在,你将开始一次将服务迁移到 Compose 文件中。

3、定义应用服务

  请记住,这是用于定义应用容器的命令(在 Windows PowerShell 中,请将 ` 字符替换为 \)。

docker run -dp 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:12-alpine \
  sh -c "yarn install && yarn run dev"

  首先,定义容器的服务项和映像。 你可为服务选择任何名称。 该名称将自动成为网络别名,这在定义 MySQL 服务时非常有用。

version: "3.7"

services:
  app:
    image: node:12-alpine

  通常,你会看到命令接近 image 定义,尽管对排序没有要求。 接下来,将其移到该文件中。

version: "3.7"

services:
  app:
    image: node:12-alpine
    command: sh -c "yarn install && yarn run dev"

  通过为服务定义 ports 来迁移命令的 -p 3000:3000 部分。 你将在此使用短语法,但此处还提供了更详细的长语法。

version: "3.7"

services:
  app:
    image: node:12-alpine
    command: sh -c "yarn install && yarn run dev"
    ports:
      - 3000:3000

  接下来,使用 working_dir 和 volumes 定义迁移工作目录 (-w /app) 和卷映射 (-v ${PWD}:/app)。 卷还有短语法和长语法。

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

version: "3.7"

services:
  app:
    image: node:12-alpine
    command: sh -c "yarn install && yarn run dev"
    ports:
      - 3000:3000
    working_dir: /app
    volumes:
      - ./:/app

  最后,使用 environment 键迁移环境变量定义。

version: "3.7"

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

  定义 MySQL 服务
  现在,可以定义 MySQL 服务了。 用于该容器的命令如下(在 Windows PowerShell 中,请将 \ 字符替换为 `):

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:5.7

  首先,定义新服务并将其命名为 mysql,以便它自动获取网络别名。 同时指定要使用的映像。

version: "3.7"

services:
  app:
    # The app service definition
  mysql:
    image: mysql:5.7

  接下来,定义卷映射。 使用 docker run 运行容器时,会自动创建命名卷。 但是,使用 Compose 运行时,则不会。 你需要在最上面的 volumes: 部分定义卷,然后在服务配置中指定装载点。只需仅提供卷名,即可使用默认选项。 不过,还有很多可用选项。

version: "3.7"

services:
  app:
    # The app service definition
  mysql:
    image: mysql:5.7
    volumes:
      - todo-mysql-data:/var/lib/mysql

volumes:
  todo-mysql-data:

  最后,只需指定环境变量。

version: "3.7"

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

volumes:
  todo-mysql-data:

  此时,完整的 docker-compose.yml 应如下所示:

version: "3.7"

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

  mysql:
    image: mysql:5.7
    volumes:
      - todo-mysql-data:/var/lib/mysql
    environment: 
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: todos

volumes:
  todo-mysql-data:

4、运行应用程序堆栈

  现在你已经有了 docker-compose.yml 文件,启动它吧!

  首先,确保应用和数据库的其他副本未运行(docker ps 和 docker rm -f <ids>)

  使用 docker-compose up 命令启动应用程序堆栈。 添加 -d 标志以在后台运行所有内容。 或者,你可以右键单击 Compose 文件,然后选择 VS Code 侧边栏上的“启动”选项。

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 会自动创建一个专门针对应用程序堆栈的网络(这就是为什么你在 Compose 文件中没有定义网络)。

  使用 docker-compose logs -f 命令查看日志。 你将看到来自每个服务的日志交汇形成一个流。 当你想要关注与时间相关的问题时,这非常有用。 -f 标志指示“跟踪”日志,因此会在生成时显示实时输出。

  如果尚未这样做,你会看到如下所示的输出:

mysql_1  | 2019-10-03T03:07:16.083639Z 0 [Note] mysqld: ready for connections.
mysql_1  | Version: '5.7.27'  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)。

提示

  在启动应用前等待 DB 当应用启动时,它实际上会等待 MySQL 启动并准备就绪,然后再尝试连接到它。Docker 没有任何内置支持,无法等待另一个容器完全启动、运行并准备就绪,然后再启动另一个容器。 对于基于节点的项目,你可以使用 wait-port 依赖项。 其他语言/框架有类似的项目。

  此时,你应能够打开应用并看到它正在运行。 嗨! 你只需要一个命令!

全部清理

  当你准备好全部清理时,只需运行 docker-compose down,或者在 VS Code Docker 扩展的容器列表中,右键单击应用程序,然后选择“停止”。 容器将停止,网络将删除。

警告

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

  清理后,你可以切换到另一个项目,运行 docker-compose up,并准备好参与该项目! 真的没有比这更简单的了!

概括

  在本部分中,你了解了 Docker Compose,以及它如何帮助显著简化多服务应用程序的定义和共享。 你通过将所使用的命令转换为适当的 Compos 格式,创建了 Compos 文件。

猜你喜欢

转载自blog.csdn.net/m0_52000372/article/details/120101857