Giaosucan's blog - Chia sẻ kiến thức theo cách bá đạo

Ticker

20/recent/ticker-posts

Hướng Dẫn Tạo Containerizing Microservices Với Docker

(Source FSoft potato Tech Mag)


Image result for Microservices Với Docker
Trong các chủ đề trước về Microservices, các bạn đã được tìm hiểu khá nhiều về kiến trúc của Microservices cũng như nắm được một vài cách các microservices nói chuyện với nhau. Tuy nhiên, sau khi tạo ra các microservices cho hệ thống của bạn, làm cách nào để triển khai chúng? Câu trả lời là containerzation. Nói nôm na là nó chính 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ì?

Khái niệm này dường như là một thứ hot với bạn phải không? Có rất nhiều định nghĩa về container nhưng có một cách dễ dàng nhất để hiểu 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 hot như một server chịu trách nhiệm build, run 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

Tôi 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:
Các bạn thấy đơn giản chứ?
Để triển khai, tôi sẽ bắt đầu triển khải container cho Docker theo các bước dưới đây:
1. Cài đặt Docker
To 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 tôi 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 security. 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

Rất đơn giản phải không các bạn?


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 deploy microservice như thế nào. Tôi hy vọng trong tương lai chúng ta sẽ tiếp tục 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.



Đăng nhận xét

0 Nhận xét