Sau khi tạo ra các microservices cho hệ thống làm cách nào để triển khai chúng? Câu trả lời là containerzation. Hay còn gọi là cách đóng gói mọi thứ vào một container từ hệ điều hành, ứng dụng, cấu hình network,…

Trong thế giới của microservices, container sẽ giúp bạn triển khai các microservices dễ dàng hơn và độc lập hơn. Nó giúp các microservices có khả năng tự vận hành hơn bằng cách tự đóng gói chúng.

Bài viết sẽ chia sẻ về các nội dung chính bao gồm:

  1. Giới thiệu về các khái niệm nhập môn về container và một số thứ liên quan trong ngữ cảnh microservices.
  2. Tiếp cận vào cách quản lý, bảo trì và triển khai Docker images trong môi trường production.

Container là gì?

Có rất nhiều định nghĩa về container nhưng có một cách dễ hiểu nhất: nó là một thứ được xây dựng trên cùng (on top) hệ điều hành. Đơn giản nó được hiểu như là việc ảo hoá hệ điều hành.

Nói về container, một vài lập trình viên sẽ phân vân sự khác nhau VM và container là gì?

Câu trả lời sẽ được minh hoạ bởi hình vẽ dưới đây:

Lợi ích của containers

  • Self-containing (cho phép tự đóng gói);
  • Lighweight;
  • Scalibility (cho phép container có thể dễ dàng scale);
  • Portibility (cho phép container có thể được mang đi và build trên hệ thống khác một cách dễ dàng);
  • DevOps;

Docker là gì?

Docker là một nền tảng cho phép bạn build, ship và chạy các container dựa trên nhân của Linux. Docker hỗ trợ một cách mặc định cho các nền tảng Linux.

Các thành phần cơ bản của Docker

1. The Docker daemon

Một docker daemon là một thành phần server chạy trên một máy ảo và được ví như một server chịu trách nhiệm build, chạy và phân phối các Docker container. Docker client tương tác với daemon này thông quá Rest API.

2. The Docker client

Docker client là một CLI cho phép tương tác với Docker daemon thông qua socket hoặc Rest API. Docker client có thể được chạy trên cùng một host với daemon hoặc chạy trên một host khác và kết nối với daemon bằng cách dùng CLI.

3. The Docker image

Khái niệm quan trọng nhất về Docker chính là Docker image. Nó là một bản sao cho các thư viện hệ điều hành cũng như các ứng dụng liên quan trong OS đó. Trong ngữ cảnh microservices mà được xây dựng trên nên tảng Spring Boot, Docker image có thể được gói trong một distribution của Linux như Alpine, JRE8 và một Spring Boot microservice jar.

4. The Docker container

Cách hiểu đơn giản nó là các instance của Docker image. Docker container sẽ sử dụng kernel của hệ điều hành Linux và nó sẽ có hệ thống filesystem của nó cũng như các cấu hình network.

5. Dockerfile

Là một file chứa các script có nhiệm vụ chỉ dẫn ra việc build như thế nào đối với một Docker image. Về cơ bản nó là một file văn bản (text file) và có tên là Dockerfile.

Triển khai microserivces trên Docker

Giả sử rằng chúng ta có một ứng dụng đặt chỗ được phát triển theo kiến trúc microservices sử dụng nền tảng Spring Boot như diagram dưới đây:

Bắt đầu triển khải container cho Docker theo các bước dưới đây:

1. Cài đặt Docker

Để triển khai microservices bởi Docker, các bạn phải cài đặt Docker từ (www.docker.com) và làm theo các chỉ dẫn được đưa ra khi cài đặt.

2. Chuẩn bị Dockerfile

Bước tiếp theo, giả sử rằng bạn đang thiết kế các service dùng Spring Boot và nói chuyện thông qua RabbitMQ. Khi đó bạn cần thay đổi lại application. Properties là nơi khai báo các cấu hình liên quan kết nối rabbitmq bằng cách dùng địa chỉ IP thay cho dùng localhost. Tại sao lại vây, bởi vì localhost không thể định danh bên trong các Docker container. Trong ứng dụng thực, cái này sẽ được trỏ bởi DNS hoặc qua load balancer.

Tạo một file docker (tên file là Dockerfile) và đưa vào thư mục gốc chứa mã nguồn microservice bạn sẽ phát triển. File này về cơ bản sẽ là:

 server.port=8090
// Replace the IP address of your machine, not using localhost
spring.rabbitmq.host=192.168.0.101
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guestFROM frolvlad/alpine-oraclejdk8
VOLUME /tmp
ADD  target/reservation-1.0.jar reservation.jar
EXPOSE 8090
ENTRYPOINT [“java”,”-jar”,”/reservation.jar”]

3. Build Docker

Xong xuôi phần khai báo, giờ để build chúng (có nghĩa là download JDK8 image và thực hiện các lệnh trong Dockerfile), cách đơn giản là chạy lệnh docker build tại thư mục chứa Dockerfile.

$ docker build –t reservation:1.0

Ở đây chúng ta sẽ có 2 microservices là reservation và customer. Lặp lại bước 2->3 cho microservice customer.

4. Thực hiện chạy (run) một Docker container

Cuối cùng chúng sẽ thực hiện chạy một Docker container bằng lệnh docker run. Lệnh này sẽ load container và thực hiện chạy file jar mà bạn đã khai báo trong Dockerfile.

$ docker run -p 8090:8090 -t reservation:1.0

Để kiểm tra tất cả các services được start hay chưa, sử dụng lệnh.

$ docker ps

5. Run RabbitMQ

Như các bạn biết, RabbitMQ được sử dụng rất nhiều trong kiến trúc microservice. Vì vậy, để setup RabbitMQ nhưng là một Docker container, cách dễ dàng nhất là lấy một image đã có sẵn trên Docker Hub. Vậy là bạn có thể dễ dàng dùng rabbitmq để nói chuyện giữa các microservices.

6. Docker Registry

Docker Hub là nới lưu trữ các Docker image. Tuy nhiên, các image có thể được lưu trữ trong một private hub (local hub) vì lý do bảo mật. Chúng ta có thể làm điều này dễ dàng với Docker bằng cách đăng ký một Docker Registry cho riêng bạn.

Tạo một private registry với cổng 3000:

 $ docker run -d -p 3000:3000 –restart=always –name registry registry:latest

Tạo tag:

$ docker tag reservation:1.0 localhost:3000/reservation:1.0

Cuối cùng là đẩy image bạn muốn lên registry.

 $ docker push localhost:3000/reservation:1.0

Kết luận

Các bạn đã có một cái nhìn khái quát về cách build, ship và quản lý Docker image trên public hoặc private registry trong bài toán triển khai microservice như thế nào. Trong tương lai, các bài viết sẽ tiếp tục chia sẻ về chủ đề về Docker và Microservice khi làm việc với EC2 (AWS) cũng như các chủ để liên quan đến Microservices.

Đào Trọng Nguyên – FPT Software
Theo Potato Tech Mag

Tin liên quan: