Docker Compose:使用 Makefile 简化您的工作

每隔几年,软件开发行业就会经历一次范式转变。 其中一个现象可以被认为是对微服务概念日益增长的兴趣。 尽管微服务并不是最新的技术,但直到最近它的受欢迎程度才真正飙升。

大型单体服务现在正在被独立、自治的微服务所取代。 微服务可以被认为是服务于单一且非常特定的目的的应用程序。 例如,它可以是关系 DBMS、Express 应用程序、Solr 服务。

Docker Compose:使用 Makefile 简化您的工作

如今,很难想象在不使用微服务的情况下开发新的软件系统。 这种情况反过来又将我们引向了 Docker 平台。

码头工人

平台 码头工人在微服务的开发和部署中,几乎已经成为一个行业标准。 在项目网站上,您可以发现 Docker 是唯一独立的容器化平台,允许组织轻松创建任何应用程序,以及在任何环境(从混合云到边缘系统)中分发和运行它们。

Docker撰写

技术 Docker撰写 专为配置多容器应用程序而设计。 Docker Compose 项目可以包含项目创建者需要的任意数量的 Docker 容器。

使用 Docker Compose 时,YAML 文件用于配置应用程序服务并组织它们之间的交互。 因此,Docker Compose 是一个用于描述和运行多容器 Docker 应用程序的工具。

Docker Compose:使用 Makefile 简化您的工作
主机系统上运行的两个容器

GNU 制造

程序 make,本质上是一个从源代码自动构建程序和库的工具。 一般来说,我们可以说 make 适用于任何涉及执行任意命令以将某些输入材料转换为某种输出形式、达到某个目标的过程。 在我们的例子中,命令 docker-compose 将转化为抽象目标(电话目标).

来告诉节目 make 关于我们想要从中得到什么,我们需要一个文件 Makefile.

在我们的 Makefile 将包含常规命令 docker и docker-compose,旨在解决许多问题。 也就是说,我们正在讨论组装容器、启动、停止、重新启动容器、组织用户登录到容器、使用容器日志以及解决其他类似问题。

Docker Compose 的典型用例

让我们想象一个具有以下组件的常规 Web 应用程序:

  • TimescaleDB 数据库 (Postgres)。
  • Express.js 应用程序。
  • Ping(只是一个容器,没有做任何特殊的事情)。

该应用程序需要 3 个 Docker 容器和一个文件 docker-compose,其中包含管理这些容器的说明。 每个容器都有不同的接触点。 例如,用一个容器 timescale 其工作方式将与数据库的工作方式大致相同。 也就是说,它允许您执行以下操作:

  • 登录 Postgres shell。
  • 表的导入和导出。
  • 创建 pg_dump 表或数据库。

Express.js 应用程序容器, expressjs,可能具有以下能力:

  • 提供系统日志中的最新数据。
  • 登录到 shell 来执行某些命令。

与容器交互

一旦我们使用 Docker Compose 在容器之间建立了通信,就可以与这些容器进行通信了。 在 Docker Compose 系统中有一个命令 docker-compose, 支持选项 -f,它允许您将文件传输到系统 docker-compose.yml.

使用此选项的功能,您可以将与系统的交互仅限于文件中提到的那些容器 docker-compose.yml.

我们来看看使用命令时与容器的交互是什么样的 docker-compose。 如果我们想象我们需要登录到 shell psql,那么相应的命令可能如下所示:

docker-compose -f docker-compose.yml exec timescale psql -Upostgres

不使用执行的相同命令 docker-composedocker,可能看起来像这样:

docker exec -it  edp_timescale_1 psql -Upostgres

请注意,在这种情况下,最好使用命令 docker,和命令 docker-compose,因为这样就无需记住容器名称。

上面的两个命令都不是那么困难。 但如果我们使用以下形式的“包装器” Makefile,这将为我们提供一个简单命令形式的接口,并且本身会调用类似的长命令,那么可以像这样实现相同的结果:

make db-shell

很明显,使用 Makefile 使使用容器变得更加容易!

工作示例

根据上面的项目图,我们将创建以下文件 docker-compose.yml:

version: '3.3'
services:
    api:
        build: .
        image: mywebimage:0.0.1
        ports:
            - 8080:8080
        volumes:
            - /app/node_modules/
        depends_on:
            - timescale
        command: npm run dev
        networks:
            - webappnetwork
    timescale:
        image: timescale/timescaledb-postgis:latest-pg11
        environment:
          - POSTGRES_USER=postgres
          - POSTGRES_PASSWORD=postgres
        command: ["postgres", "-c", "log_statement=all", "-c", "log_destination=stderr"]
        volumes:
          - ./create_schema.sql:/docker-entrypoint-initdb.d/create_schema.sql
        networks:
           - webappnetwork
    ping:
       image: willfarrell/ping
       environment:
           HOSTNAME: "localhost"
           TIMEOUT: 300
networks:
   webappnetwork:
       driver: bridge

为了管理 Docker Compose 配置并与其描述的容器交互,我们将创建以下文件 Makefile:

THIS_FILE := $(lastword $(MAKEFILE_LIST))
.PHONY: help build up start down destroy stop restart logs logs-api ps login-timescale login-api db-shell
help:
        make -pRrq  -f $(THIS_FILE) : 2>/dev/null | awk -v RS= -F: '/^# File/,/^# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | sort | egrep -v -e '^[^[:alnum:]]' -e '^$@$$'
build:
        docker-compose -f docker-compose.yml build $(c)
up:
        docker-compose -f docker-compose.yml up -d $(c)
start:
        docker-compose -f docker-compose.yml start $(c)
down:
        docker-compose -f docker-compose.yml down $(c)
destroy:
        docker-compose -f docker-compose.yml down -v $(c)
stop:
        docker-compose -f docker-compose.yml stop $(c)
restart:
        docker-compose -f docker-compose.yml stop $(c)
        docker-compose -f docker-compose.yml up -d $(c)
logs:
        docker-compose -f docker-compose.yml logs --tail=100 -f $(c)
logs-api:
        docker-compose -f docker-compose.yml logs --tail=100 -f api
ps:
        docker-compose -f docker-compose.yml ps
login-timescale:
        docker-compose -f docker-compose.yml exec timescale /bin/bash
login-api:
        docker-compose -f docker-compose.yml exec api /bin/bash
db-shell:
        docker-compose -f docker-compose.yml exec timescale psql -Upostgres

此处描述的大多数命令适用于所有容器,但使用选项 c= 允许您将命令的范围限制到一个容器。

Makefile 准备好了,你可以像这样使用它:

  • make help — 发出所有可用命令的列表 make.

Docker Compose:使用 Makefile 简化您的工作
有关可用命令的帮助

  • make build - 组装图像 Dockerfile。 在我们的示例中,我们使用现有图像 timescale и ping。 但图像 api 我们想在当地收集。 这正是执行此命令后将要做的事情。

Docker Compose:使用 Makefile 简化您的工作
构建 Docker 容器

  • make start — 启动所有容器。 要仅启动一个容器,您可以使用如下命令 make start c=timescale.

Docker Compose:使用 Makefile 简化您的工作
运行时间刻度容器

Docker Compose:使用 Makefile 简化您的工作
运行 ping 容器

  • make login-timescale — 登录容器的 bash 会话 timescale.

Docker Compose:使用 Makefile 简化您的工作
在时间刻度容器中运行 bash

  • make db-shell - 进入 psql 在一个容器中 timescale 对数据库执行 SQL 查询。

Docker Compose:使用 Makefile 简化您的工作
在 timescaledb 容器中运行 psql

  • make stop — 停止容器。

Docker Compose:使用 Makefile 简化您的工作
停止时间刻度容器

  • make down — 停止并移除容器。 要删除特定容器,您可以使用此命令指定所需的容器。 例如 - make down c=timescale или make down c=api.

Docker Compose:使用 Makefile 简化您的工作
停止并删除所有容器

结果

尽管 Docker Compose 为我们提供了一组丰富的用于管理容器的命令,但有时这些命令可能会变得很长且难以记住。

使用方法 Makefile 帮助我们通过文件与容器建立快速、轻松的交互 docker-compose.yml。 也就是说,我们正在讨论以下内容:

  • 开发人员仅与中描述的项目容器交互 docker-compose.yml,工作不会受到其他正在运行的容器的干扰。
  • 如果忘记某个命令,可以执行该命令 make help 并获取有关可用命令的帮助。
  • 您不必记住一长串参数来执行诸如获取最新日志条目或登录系统之类的操作。 例如,像这样的命令 docker-compose -f docker-compose.yml exec timescale psql -Upostgres 轮流到 make db-shell.
  • 文件 Makefile 您可以随着项目的发展灵活地适应它。 例如,可以轻松添加命令来创建数据库备份或执行任何其他操作。
  • 如果一个大型开发团队使用相同的 Makefile,这简化了协作并减少了错误。

PS 在我们的 市场 有一个图像 码头工人,一键安装。 您可以在以下位置检查容器的运行情况: VPS。 所有新客户均可免费获得 3 天的测试时间。

亲爱的读者! 如何自动化 Docker Compose?

Docker Compose:使用 Makefile 简化您的工作

来源: habr.com

添加评论