每隔几年,软件开发行业就会经历一次范式转变。 其中一个现象可以被认为是对微服务概念日益增长的兴趣。 尽管微服务并不是最新的技术,但直到最近它的受欢迎程度才真正飙升。
大型单体服务现在正在被独立、自治的微服务所取代。 微服务可以被认为是服务于单一且非常特定的目的的应用程序。 例如,它可以是关系 DBMS、Express 应用程序、Solr 服务。
如今,很难想象在不使用微服务的情况下开发新的软件系统。 这种情况反过来又将我们引向了 Docker 平台。
码头工人
平台
Docker撰写
技术
使用 Docker Compose 时,YAML 文件用于配置应用程序服务并组织它们之间的交互。 因此,Docker Compose 是一个用于描述和运行多容器 Docker 应用程序的工具。
主机系统上运行的两个容器
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-compose
和 docker
,可能看起来像这样:
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
.
有关可用命令的帮助
make build
- 组装图像Dockerfile
。 在我们的示例中,我们使用现有图像timescale
иping
。 但图像api
我们想在当地收集。 这正是执行此命令后将要做的事情。
构建 Docker 容器
make start
— 启动所有容器。 要仅启动一个容器,您可以使用如下命令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=timescale
илиmake 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 Compose?
来源: habr.com