使用Docker Compose

来自泡泡学习笔记
BrainBs讨论 | 贡献2023年8月18日 (五) 09:17的版本 (创建页面,内容为“ Docker Compose是一个帮助你定义和共享多容器应用程序的工具。使用Compose,你可以创建一个YAML文件来定义服务,并且通过一个简单的命令,你可以启动或关闭所有服务。 使用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

定义应用程序服务

你使用下面的命令启动数据库服务。

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

  1. 通常,在镜像定义附近会看到command命令,尽管没有顺序要求。将命令添加到你的compose.yaml文件中。
services:
  app:
    image: node:18-alpine
    command: sh -c "yarn install && yarn run dev"

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

  1. 接下来,通过使用working_dir和volumes定义,迁移工作目录(-w /app)和卷映射(-v “$(pwd):/app”)。

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

  1. 最后,你需要使用环境变量键迁移环境变量的定义。
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
  1. 接下来,定义卷映射。当你使用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:
  1. 最后,你需要指定环境变量。

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:

  1. 此时,你的完整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文件中没有定义网络的原因)。

  1. 使用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)。

  1. 此时,你应该能够在浏览器中打开http://localhost:3000,看到应用程序正在运行。

在Docker仪表板中查看应用程序堆栈

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

展开堆栈,你会看到在Compose文件中定义的两个容器。名称也更具描述性,遵循<service-name>-<replica-number>的模式。因此,你可以很容易地快速查看哪个容器是你的应用程序,哪个容器是MySQL数据库。

关闭应用程序堆栈

当你准备关闭应用程序堆栈时,只需运行docker compose down命令,或在Docker仪表板中点击整个应用程序的垃圾桶图标。容器将停止,网络将被删除。

警告:默认情况下,compose文件中的命名卷在运行docker compose down时不会被删除。如果你想删除这些卷,需要添加–volumes标志。

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