Link Search Menu Expand Document

Docker Compose

Nội dung

  1. Cấu trúc Docker Compose
  2. Docker Compose Commands
  3. Scaling Docker Services

Một ứng dụng Microservices có thể gồm nhiều thành phần dịch vụ - service thực thi trên những Docker Containers khác nhau. Trong trường hợp đó, chúng ta khai báo services trong một file định dạng YAML và sử dụng công cụ Docker Compose để khởi động các Containers tương ứng. Tùy theo giá trị scale, mỗi service có thể thực thi trong một hoặc nhiều Containers.

Giao tiếp giữa Containers trong môi trường Docker dựa trên mô hình Container Network Model (CNM). Theo mô hình này, mỗi Container sử dụng một Network Sandbox có khả năng kết nối với nhiều networks khác nhau thông qua các endpoints. Những endpoints này tạo ra sự kết nối giữa các services hoạt động trên Containers trong cùng một network.

Các chức năng của network được cung cấp qua thành phần drivers. Tuỳ theo mục đích sử dụng, chúng ta có các loại drivers khác nhau, bao gồm:

  • bridge - sử dụng mặc định khi Containers hoạt động trên một Docker Host
  • host - khi containers cần sử dụng network stack từ Docker Host
  • overlay - áp dụng khi Containers chạy trên Docker Hosts khác nhau
  • none - khi muốn tắt chức năng networking của một Container

Compose Ouput

Mô hình CNM sử dụng plugins:

  • Network Driver: cung cấp API quản lý containers / networks
  • IPAM Driver: cung cấp API quản lý địa chỉ IP của Containers

Để hiểu rõ hơn về cấu trúc khai báo và cách thức sử dụng Docker Compose, chúng ta sẽ sử dụng microservice RemindersManagement của ứng dụng FriendReminders làm ví dụ minh hoạ.


Cấu trúc Docker Compose

Với ví dụ về quá trình thực thi microservice RemindersManagement trên containers, chúng ta đã sử dụng Docker Compose để kết hợp việc thực thi của các thành phần services khác nhau, bao gồm:

  • Reverse Proxy Nginx - nginx
  • Health Service - healthcheckserver
  • Health Database - healthcheckdbserver
  • RemindersManagement - remindersmgtservice

Docker Compose sử dụng docker-compose.yml để khai báo cấu trúc và quan hệ giữa các thành phần trong hệ thống. Nội dung docker-compose.yml được giải thích theo minh họa dưới đây:

Compose Ouput


Docker Compose Commands

Trong folder FriendReminders, chúng ta có thể sử dụng câu lệnh docker compose cho từng service hoặc toàn bộ services trong khai báo ứng dụng:

  • Build services trong Docker Compose
// docker-compose build [service_name]
docker-compose build
  • Build và thực thi services:
// docker-compose up [service_name] --build
docker-compose up --build

Tham số build sử dụng khi chúng ta muốn thực hiện quá trình build services.

Output của câu lệnh:

Creating network "friendreminders_webproxy" with driver "bridge"
Building remindersmgtservice
Step 1/15 : ARG VERSION=3.1-alpine3.12
Step 2/15 : FROM mcr.microsoft.com/dotnet/core/sdk:${VERSION} AS build
 ---> b003ab77b035
Step 3/15 : WORKDIR /app
 ---> Using cache
 ---> e99f63b93560
Step 4/15 : COPY *.csproj ./
 ---> Using cache
 ---> f685ca55fac9
Step 5/15 : RUN dotnet restore
 ---> Using cache
 ---> 3a9a18057efb
Step 6/15 : COPY . .
 ---> 28d50fed09a6
Step 7/15 : RUN dotnet publish -c release -o out
 ---> Running in cba5b6ee79c8
Microsoft (R) Build Engine version 16.7.0+7fb82e5b2 for .NET
Copyright (C) Microsoft Corporation. All rights reserved.

  Determining projects to restore...
  Restored /app/RemindersManagement.API.csproj (in 2.05 sec).
  RemindersManagement.API -> /app/bin/release/netcoreapp3.1/RemindersManagement.API.dll
  RemindersManagement.API -> /app/out/
Removing intermediate container cba5b6ee79c8
 ---> d7dad6d242d2

Step 8/15 : FROM mcr.microsoft.com/dotnet/core/aspnet:${VERSION}
 ---> 4d73ff5f1658
Step 9/15 : RUN adduser   --disabled-password   --home /app   --gecos '' app   && chown -R app /app
 ---> Using cache
 ---> f04b17817579
Step 10/15 : USER app
 ---> Using cache
 ---> 8372cafcbe8c
Step 11/15 : WORKDIR /app
 ---> Using cache
 ---> 90f191eae279
Step 12/15 : COPY --from=build /app/out .
 ---> Using cache
 ---> f9fc2071963c
Step 13/15 : ENV DOTNET_RUNNING_IN_CONTAINER=true   ASPNETCORE_URLS=http://+:8000
 ---> Using cache
 ---> f40db04de048
Step 14/15 : EXPOSE 8000
 ---> Using cache
 ---> 048a1c344f67
Step 15/15 : ENTRYPOINT ["dotnet", "RemindersManagement.API.dll"]
 ---> Using cache
 ---> b0e8b721edbc

Successfully built b0e8b721edbc
Successfully tagged friendreminders_remindersmgtservice:latest
Building nginx
Step 1/4 : FROM nginx:latest
 ---> 4bb46517cac3
Step 2/4 : COPY nginx.conf /etc/nginx/nginx.conf
 ---> Using cache
 ---> 09a61daa3d40
Step 3/4 : COPY localhost.crt /etc/ssl/certs/localhost.crt
 ---> Using cache
 ---> 26813b3ff113
Step 4/4 : COPY localhost.key /etc/ssl/private/localhost.key
 ---> Using cache
 ---> aa193bf0b495

Successfully built aa193bf0b495
Successfully tagged friendreminders_nginx:latest
Creating friendreminders_healthcheckdbserver_1 ... done
Creating friendreminders_healthcheckserver_1   ... done
Creating friendreminders_remindersmgtservice_1 ... done
Creating friendreminders_nginx_1               ... done
// Execution Log
...
  • Liệt kê danh sách tất cả containers đang thực thi trong hệ thống:
docker ps

Output

CONTAINER ID        IMAGE                                 COMMAND                  CREATED             STATUS              PORTS                                      NAMES
f82c86ed92ec        friendreminders_nginx                 "/docker-entrypoint.…"   23 minutes ago      Up 2 minutes        0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   friendreminders_nginx_1
3779a3334d45        friendreminders_remindersmgtservice   "dotnet RemindersMan…"   23 minutes ago      Up 3 minutes        8000/tcp                                   friendreminders_remindersmgtservice_1
508876c1e8e9        xabarilcoding/healthchecksui          "dotnet HealthChecks…"   23 minutes ago      Up 3 minutes        0.0.0.0:5000->80/tcp                       friendreminders_healthcheckserver_1
949b1c1c8d9d        mysql:5.7                             "docker-entrypoint.s…"   23 minutes ago      Up 3 minutes        3306/tcp, 33060/tcp                        friendreminders_healthcheckdbserver_1
  • Liệt kê các containers quản lý bởi Docker Compose:
docker-compose ps

Output

                Name                               Command               State                    Ports                  
-------------------------------------------------------------------------------------------------------------------------
friendreminders_healthcheckdbserver_1   docker-entrypoint.sh mysqld      Up      3306/tcp, 33060/tcp                     
friendreminders_healthcheckserver_1     dotnet HealthChecks.UI.Ima ...   Up      0.0.0.0:5000->80/tcp                    
friendreminders_nginx_1                 /docker-entrypoint.sh ngin ...   Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
friendreminders_remindersmgtservice_1   dotnet RemindersManagement ...   Up      8000/tcp                                  
  • Hiển thị logs trong services:
// docker-compose log [service_name] -f
docker-compose log -f

Scaling Docker Services

Với khả năng quản lý nhiều Containers, Docker Compose thực hiện scaling service bằng cách thay đổi số lượng Containers thực thi service.

Khi sử dụng lệnh docker-compose up, service remindersmgtservice được thực thi dưới sự quản lý của Docker Compose. Trong quá trình thực thi, giả sử số lượng request gửi đến service tăng lên vì một lý do nào đó, Docker Compose cho phép scale-up remindersmgtservice qua việc bổ sung thêm Docker Containers.

Câu lệnh scale:

 docker-compose up --build --scale remindersmgtservice=2

Docker Desktop hiển thị danh sách Docker Containers trong FriendReminders:

Scale Ouput

Theo danh sách trên, service remindersmgtservice được thực thi trên 2 containers:

  • friendreminders_remindersmgtservice_1
  • friendreminders_remindersmgtservice_2

Thông tin trên có thể kiểm tra qua docker compose theo lệnh:

docker-compose ps remindersmgtservice

Output:

                Name                               Command               State    Ports  
-----------------------------------------------------------------------------------------
friendreminders_remindersmgtservice_1   dotnet RemindersManagement ...   Up      8000/tcp
friendreminders_remindersmgtservice_2   dotnet RemindersManagement ...   Up      8000/tcp

Requests từ client phân phối đến containers thông qua reverse proxy NGINX. Theo mặc định, NGINX sử dụng cơ chế round-robin để phân phối việc xử lý requests.

Định nghĩa

Với cơ chế Round Robin, các Containers được lựa chọn theo tuần tự. NGINX lựa chọn Container đầu tiên trong danh sách với yêu cầu thứ nhất, sau đó di chuyển đến Container tiếp theo khi yêu cầu thứ hai gửi đến, tiếp tục quá trình đó và lặp lại ở đầu danh sách khi đi đến Container cuối cùng.

Để xác nhận kết quả, sử dụng Postman để gửi 100 requests với độ trễ 10ms đến NGINX.

  • Lựa chọn Runner button trên màn hình Postman -> Collection Runner

  • Trên Collection Runner windows, lựa chọn Collection và API chúng ta muốn thực thi trong Collection đó.

  • Trong ví dụ này, sử dụng RemindersManagementService Collection và API: Get Reminders List.

  • Điền số lượng request (Iterations) và độ trễ giữa các request (Delay).

  • Click button Run RemindersM...

Collection Runner Ouput

Kết quả hiển thị trên Postman khi hoàn thành quá trình test:

Test Ouput

Kết quả logs cho thấy request được chia đều cho Containers:

Log Ouput


Copyright © 2019-2022 Tuan Anh Le.