ソフトウェア開発業界は数年ごとにパラダイムシフトを経験します。 これらの現象の XNUMX つは、マイクロサービスの概念に対する関心の高まりとして認識できます。 マイクロサービスは最新のテクノロジーではありませんが、文字通りその人気が急上昇したのはつい最近のことです。
大規模なモノリシック サービスは現在、独立した自律的なマイクロサービスに置き換えられています。 マイクロサービスは、単一の非常に特殊な目的を果たすアプリケーションと考えることができます。 たとえば、リレーショナル DBMS、Express アプリケーション、Solr サービスなどです。
最近では、マイクロサービスを使用せずに新しいソフトウェア システムを開発することは考えにくいです。 そしてこの状況は、今度は Docker プラットフォームにつながります。
デッカー
プラットフォーム
ドッカーの作成
Технология
Docker Compose を使用する場合、YAML ファイルを使用してアプリケーション サービスを構成し、相互のやり取りを整理します。 したがって、Docker Compose は、複数コンテナーの Docker アプリケーションを記述および実行するためのツールです。
ホスト システム上で実行される XNUMX つのコンテナ
GNUメイク
プログラム make
, 本質的には、ソース コードからのプログラムとライブラリの構築を自動化するためのツールです。 一般的に言えることは、 make
任意のコマンドを実行して、入力マテリアルを何らかの出力形式、または何らかの目標に変換するプロセスに適用されます。 私たちの場合、コマンドは docker-compose
抽象的な目標に変換されます (
番組に伝えるには make
何が欲しいかについては、ファイルが必要です Makefile
.
Внашем Makefile
通常のコマンドが含まれます docker
и docker-compose
、多くの問題を解決するように設計されています。 つまり、コンテナーの組み立て、コンテナーの開始、停止、再起動、コンテナーへのユーザー ログインの整理、コンテナー ログの操作、および他の同様の問題の解決について話しています。
Docker Compose の一般的な使用例
次のコンポーネントを持つ通常の Web アプリケーションを想像してみましょう。
- TimescaleDB データベース (Postgres)。
- Express.js アプリケーション。
- Ping (単なるコンテナであり、特別なことは何も行いません)。
このアプリケーションには 3 つの Docker コンテナと XNUMX つのファイルが必要です docker-compose
には、これらのコンテナを管理するための手順が含まれています。 各コンテナには異なるタッチポイントがあります。 たとえば、コンテナの場合 timescale
データベースを扱うのとほぼ同じ方法で作業できるようになります。 つまり、次のアクションを実行できるようになります。
- Postgres シェルにログインします。
- テーブルのインポートとエクスポート。
- 創造
pg_dump
テーブルまたはデータベース。
Express.jsアプリケーションコンテナ、 expressjs
、次の機能がある場合があります。
- システム ログから新しいデータを提供します。
- 特定のコマンドを実行するには、シェルにログインします。
コンテナとの対話
Docker Compose を使用してコンテナ間の通信を設定したら、それらのコンテナと通信します。 Docker Compose システム内には次のコマンドがあります。 docker-compose
、サポートオプション -f
、ファイルをシステムに転送できるようになります。 docker-compose.yml
.
このオプションの機能を使用すると、システムとの対話をファイル内で言及されているコンテナーのみに制限できます。 docker-compose.yml
.
コマンドを使用した場合のコンテナーとの対話がどのようなものかを見てみましょう。 docker-compose
。 シェルにログインする必要があると仮定すると、 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=
コマンドのスコープを XNUMX つのコンテナーに制限できます。
後に Makefile
準備ができたら、次のように使用できます。
make help
— 利用可能なすべてのコマンドのリストを発行します。make
.
使用可能なコマンドに関するヘルプ
make build
- 画像を組み立てるDockerfile
。 この例では既存の画像を使用しましたtimescale
иping
。 でもイメージはapi
現地で集めたいと思っています。 これはまさにこのコマンドの実行後に行われることです。
Dockerコンテナの構築
make start
— すべてのコンテナを起動します。 コンテナを XNUMX つだけ起動するには、次のようなコマンドを使用できます。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