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=timescalemake 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,這簡化了協作並減少了錯誤。

聚苯乙烯 在我們的 市場 有一個圖像 碼頭工人,一鍵安裝。 您可以在以下位置檢查容器的運作: VPS。 所有新客戶均可免費獲得 3 天的測試時間。

親愛的讀者! 如何自動化 Docker Compose?

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

來源: www.habr.com

添加評論