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.
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
Docker Soạ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.
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 (
Để 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-compose
Và docker
, 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 chomake
.
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 ảnhapi
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.
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
.
Chạy vùng chứa thời gian
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ứatimescale
.
Chạy bash trong vùng chứa thang thời gian
make db-shell
- Lối vàopsql
trong một thùng chứatimescale
để thực thi các truy vấn SQL đối với cơ sở dữ liệu.
Chạy psql trong vùng chứa timescaledb
make stop
- dừng các thùng chứa.
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ặcmake down c=api
.
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ànhmake 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
Gởi bạn đọc! Làm thế nào để bạn tự động hóa Docker Compose?
Nguồn: www.habr.com