Docker Compose:简化使用Makefile

每隔几年,软件开发行业就会发生一次范式转换。这些现象之一是对微服务概念的日益增长的兴趣。尽管微服务不是最新技术,但直到最近才真正普及。

如今,大型的整体服务已由独立的自治微服务取代。微服务可以被认为是服务于一个特定目的的应用程序。例如,它可以是关系DBMS,Express应用程序,Solr服务。 如今,很难想象没有使用微服务就可以开发新的软件系统。而这种情况又将我们引向了Docker平台。





码头工人


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

Docker撰写


Docker Compose 技术旨在配置多容器应用程序。Docker Compose项目可以包含该项目创建者所需的尽可能多的Docker容器。

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


主机系统上运行的两个容器

GNU Make


程序make本质上是一种用于从源代码自动组装程序和库的工具。通常,我们可以说它make适用于任何过程,包括执行任意命令以将某些源材料转换为某种结果形式,达到某种目标的过程。在我们的案例中,团队docker-compose将转换为抽象目标(Phony目标)。

为了告诉程序make我们想要什么,我们需要一个file Makefile

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

Docker Compose的典型用法


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

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

该应用程序将需要3个Docker容器和一个docker-compose包含用于管理这些容器的说明的文件每个容器将具有不同的交互点。例如,timescale您可以像处理数据库一样使用容器即,它允许您执行以下操作:

  • 登录到Postgres Shell。
  • 导入和导出表。
  • 创建一个pg_dump表或数据库。

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

  • 系统日志中新数据的输出。
  • 输入外壳程序以执行某些命令。

容器互动


在使用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-compose使用而是使用的相同命令docker可能如下所示:

docker exec -it  edp_timescale_1 psql -Upostgres

请注意,在这种情况下,最好不要使用command docker,而要使用command 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


可用命令帮助

  • make build-组装来自的图像Dockerfile在我们的示例中,我们使用了现有的图像timescaleping但是api我们想在本地收集图像这正是执行此命令后将要执行的操作。


Docker容器组装

  • make start-启动所有容器。要仅启动一个容器,可以使用form的命令make start c=timescale


启动时间表容器


启动ping容器

  • make login-timescale-进入容器的bash会话timescale


在时标容器中运行bash

  • make db-shell-登录psql到容器timescale以执行对数据库的SQL查询。


在timescaledb容器中运行psql

  • make stop -停止容器。


停止时间刻度容器

  • make down-停止并取出容器。要删除特定的容器,可以将此命令与指定的容器一起使用。例如- make down c=timescalemake down c=api


停止并删除所有容器

摘要


尽管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在我们的市场上有一个Docker映像只需单击一下即可安装。您可以在VPS上检查容器的操作所有新客户均可免费享受3天的测试。

亲爱的读者们!您如何使用Docker Compose自动化工作?

Source: https://habr.com/ru/post/undefined/


All Articles