Docker Compose: Đơn giản hóa công việc của bạn bằng cách sử dụng Makefiles

Cứ sau vài năm, ngành phát triển phần mềm lại trải qua một sự thay đổi mô hình. Một trong những hiện tượng này có thể được nhận thấy là sự quan tâm ngày càng tăng đối với khái niệm microservice. Mặc dù microservice không phải là công nghệ mới nhất nhưng chỉ gần đây mức độ phổ biến của nó mới tăng vọt theo đúng nghĩa đen.

Các dịch vụ nguyên khối lớn hiện đang được thay thế bằng các dịch vụ vi mô độc lập, tự chủ. Một microservice có thể được coi là một ứng dụng phục vụ một mục đích duy nhất và rất cụ thể. Ví dụ: nó có thể là DBMS quan hệ, ứng dụng Express, dịch vụ Solr.

Docker Compose: Đơn giản hóa công việc của bạn bằng cách sử dụng Makefiles

Ngày nay, thật khó để tưởng tượng việc phát triển một hệ thống phần mềm mới mà không sử dụng microservice. Và tình huống này lại dẫn chúng ta đến nền tảng Docker.

phu bến tàu

nền tảng phu bến tàu, trong việc phát triển và triển khai microservice, gần như đã trở thành một tiêu chuẩn công nghiệp. Trên trang web của dự án, bạn có thể biết rằng Docker là nền tảng container độc lập duy nhất cho phép các tổ chức dễ dàng tạo bất kỳ ứng dụng nào cũng như phân phối và chạy chúng trong mọi môi trường - từ đám mây lai đến hệ thống biên.

Docker Soạn

Технология Docker Soạn được thiết kế để cấu hình các ứng dụng nhiều container. Dự án Docker Compose có thể chứa số lượng vùng chứa Docker tùy theo nhu cầu của người tạo dự án.

Khi làm việc với Docker Compose, tệp YAML được sử dụng để định cấu hình các dịch vụ ứng dụng và tổ chức tương tác giữa chúng với nhau. Do đó, Docker Compose là một công cụ để mô tả và chạy các ứng dụng Docker nhiều vùng chứa.

Docker Compose: Đơn giản hóa công việc của bạn bằng cách sử dụng Makefiles
Hai container chạy trên một hệ thống máy chủ

GNU tạo

Chương trình make, về cơ bản là một công cụ để tự động hóa việc xây dựng chương trình và thư viện từ mã nguồn. Nói chung, chúng ta có thể nói rằng make áp dụng cho bất kỳ quy trình nào liên quan đến việc thực hiện các lệnh tùy ý để chuyển đổi một số nguyên liệu đầu vào thành dạng đầu ra nào đó, thành mục tiêu nào đó. Trong trường hợp của chúng tôi, các lệnh docker-compose sẽ được chuyển thành các mục tiêu trừu tượng (Mục tiêu điện thoại).

Để kể cho chương trình make về những gì chúng tôi muốn từ nó, chúng tôi cần một tập tin Makefile.

Trong của chúng tôi Makefile sẽ chứa các lệnh thông thường docker и docker-compose, được thiết kế để giải quyết nhiều vấn đề. Cụ thể, chúng ta đang nói về việc lắp ráp một vùng chứa, về việc khởi động, dừng nó, khởi động lại nó, về việc tổ chức đăng nhập của người dùng vào vùng chứa, về cách làm việc với nhật ký vùng chứa và cách giải quyết các vấn đề tương tự khác.

Các trường hợp sử dụng điển hình của Docker Compose

Hãy tưởng tượng một ứng dụng web thông thường có các thành phần sau:

  • Cơ sở dữ liệu TimescaleDB (Postgres).
  • Ứng dụng Express.js.
  • Ping (chỉ là container, không có tác dụng gì đặc biệt).

Ứng dụng này sẽ cần 3 Docker container và một file docker-compose, chứa hướng dẫn quản lý các vùng chứa này. Mỗi vùng chứa sẽ có các điểm tiếp xúc khác nhau. Ví dụ, với một thùng chứa timescale nó sẽ có thể hoạt động gần giống như cách chúng làm việc với cơ sở dữ liệu. Cụ thể, nó cho phép bạn thực hiện các hành động sau:

  • Đăng nhập vào vỏ Postgres.
  • Nhập và xuất các bảng.
  • sự sáng tạo pg_dump bảng hoặc cơ sở dữ liệu.

Vùng chứa ứng dụng Express.js, expressjs, có thể có các khả năng sau:

  • Cung cấp dữ liệu mới từ nhật ký hệ thống.
  • Đăng nhập vào shell để thực hiện một số lệnh nhất định.

Tương tác với Container

Sau khi chúng ta thiết lập liên lạc giữa các vùng chứa bằng Docker Compose, đã đến lúc liên lạc với các vùng chứa đó. Trong hệ thống Docker Compose có một lệnh docker-compose, tùy chọn hỗ trợ -f, cho phép bạn chuyển một tập tin vào hệ thống docker-compose.yml.

Sử dụng các khả năng của tùy chọn này, bạn chỉ có thể giới hạn tương tác với hệ thống ở những vùng chứa được đề cập trong tệp docker-compose.yml.

Chúng ta hãy xem tương tác với các container trông như thế nào khi sử dụng lệnh docker-compose. Nếu chúng ta tưởng tượng rằng chúng ta cần đăng nhập vào shell psql, thì các lệnh tương ứng có thể trông như thế này:

docker-compose -f docker-compose.yml exec timescale psql -Upostgres

Lệnh tương tự không được sử dụng để thực thi docker-composedocker, có thể trông như thế này:

docker exec -it  edp_timescale_1 psql -Upostgres

Xin lưu ý rằng trong những trường hợp như vậy, tốt nhất nên sử dụng lệnh docker, và đội docker-compose, vì điều này giúp loại bỏ nhu cầu nhớ tên vùng chứa.

Cả hai lệnh trên đều không khó lắm. Nhưng nếu chúng ta sử dụng một "trình bao bọc" ở dạng Makefile, nó sẽ cung cấp cho chúng ta một giao diện dưới dạng các lệnh đơn giản và chính nó sẽ gọi các lệnh dài tương tự, khi đó có thể đạt được kết quả tương tự như sau:

make db-shell

Một điều khá rõ ràng là việc sử dụng Makefile làm cho việc làm việc với các thùng chứa dễ dàng hơn nhiều!

Ví dụ làm việc

Dựa trên sơ đồ dự án trên, chúng tôi sẽ tạo tệp sau 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

Để quản lý cấu hình Docker Compose và tương tác với các thùng chứa mà nó mô tả, chúng tôi sẽ tạo tệp sau 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

Hầu hết các lệnh được mô tả ở đây áp dụng cho tất cả các vùng chứa, nhưng sử dụng tùy chọn c= cho phép bạn giới hạn phạm vi của lệnh trong một vùng chứa.

Sau khi Makefile sẵn sàng, bạn có thể sử dụng nó như thế này:

  • make help - đưa ra danh sách tất cả các lệnh có sẵn cho make.

Docker Compose: Đơn giản hóa công việc của bạn bằng cách sử dụng Makefiles
Trợ giúp về các lệnh có sẵn

  • make build - lắp ráp một hình ảnh từ Dockerfile. Trong ví dụ của chúng tôi, chúng tôi đã sử dụng hình ảnh hiện có timescale и ping. Nhưng hình ảnh api chúng tôi muốn thu thập tại địa phương. Đây chính xác là những gì sẽ được thực hiện sau khi thực hiện lệnh này.

Docker Compose: Đơn giản hóa công việc của bạn bằng cách sử dụng Makefiles
Xây dựng vùng chứa Docker

  • make start — khởi chạy tất cả các container. Để khởi chạy chỉ một vùng chứa, bạn có thể sử dụng lệnh như make start c=timescale.

Docker Compose: Đơn giản hóa công việc của bạn bằng cách sử dụng Makefiles
Chạy vùng chứa thời gian

Docker Compose: Đơn giản hóa công việc của bạn bằng cách sử dụng Makefiles
Chạy một thùng chứa ping

  • make login-timescale - đăng nhập vào phiên bash của vùng chứa timescale.

Docker Compose: Đơn giản hóa công việc của bạn bằng cách sử dụng Makefiles
Chạy bash trong vùng chứa thang thời gian

  • make db-shell - Lối vào psql trong một thùng chứa timescale để thực thi các truy vấn SQL đối với cơ sở dữ liệu.

Docker Compose: Đơn giản hóa công việc của bạn bằng cách sử dụng Makefiles
Chạy psql trong vùng chứa timescaledb

  • make stop - dừng các thùng chứa.

Docker Compose: Đơn giản hóa công việc của bạn bằng cách sử dụng Makefiles
Dừng một container thời gian

  • make down - dừng và tháo các thùng chứa. Để xóa một vùng chứa cụ thể, bạn có thể sử dụng lệnh này để chỉ định vùng chứa mong muốn. Ví dụ - make down c=timescale hoặc make down c=api.

Docker Compose: Đơn giản hóa công việc của bạn bằng cách sử dụng Makefiles
Dừng và xóa tất cả các container

Kết quả

Mặc dù Docker Compose cung cấp cho chúng ta một bộ lệnh phong phú để quản lý vùng chứa, nhưng đôi khi những lệnh này có thể trở nên dài và khó nhớ.

Phương pháp sử dụng Makefile đã giúp chúng tôi thiết lập khả năng tương tác nhanh chóng và dễ dàng với các vùng chứa từ một tệp docker-compose.yml. Cụ thể, chúng ta đang nói về những điều sau đây:

  • Nhà phát triển chỉ tương tác với các vùng chứa dự án được mô tả trong docker-compose.yml, công việc không bị cản trở bởi các vùng chứa đang chạy khác.
  • Trong trường hợp quên một lệnh nào đó, bạn có thể thực hiện lệnh make help và nhận trợ giúp về các lệnh có sẵn.
  • Bạn không cần phải nhớ danh sách dài các đối số để thực hiện các hành động như lấy các mục nhật ký mới nhất hoặc đăng nhập vào hệ thống. Ví dụ: một lệnh như docker-compose -f docker-compose.yml exec timescale psql -Upostgres biến thành make db-shell.
  • hồ sơ Makefile Bạn có thể linh hoạt thích ứng với nó khi dự án phát triển. Ví dụ: có thể dễ dàng thêm lệnh để tạo bản sao lưu cơ sở dữ liệu hoặc thực hiện bất kỳ hành động nào khác.
  • Nếu một nhóm lớn các nhà phát triển sử dụng cùng một Makefile, điều này hợp lý hóa việc cộng tác và giảm thiểu lỗi.

PS Trong của chúng tôi thương trường có một hình ảnh phu bến tàu, có thể được cài đặt chỉ bằng một cú nhấp chuột. Bạn có thể kiểm tra hoạt động của container tại VPS. Tất cả khách hàng mới được tặng 3 ngày dùng thử miễn phí.

Gởi bạn đọc! Làm thế nào để bạn tự động hóa Docker Compose?

Docker Compose: Đơn giản hóa công việc của bạn bằng cách sử dụng Makefiles

Nguồn: www.habr.com

Thêm một lời nhận xét