每隔幾年,軟體開發產業就會經歷一次典範轉移。 其中一個現象可以被認為是對微服務概念日益增長的興趣。 儘管微服務並不是最新的技術,但直到最近它的受歡迎程度才真正飆升。
大型單體服務現在正被獨立、自治的微服務所取代。 微服務可以被認為是服務於單一且非常特定的目的的應用程式。 例如,它可以是關係式 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
,這簡化了協作並減少了錯誤。
聚苯乙烯 在我們的
親愛的讀者! 如何自動化 Docker Compose?
來源: www.habr.com