Khi mới bắt đầu với Docker chúng ta rất khó định hướng phải tìm hiểu cái gì trước, cái gì sau bởi có rất nhiều thứ nào là Docker Client, Docker Engine, Docker Machine, rồi build cluster với Docker Swarm, rồi lại đóng gói multi-container với Docker Compose và ti tỉ thứ khác… Trong bài này chúng ta sẽ cố gắng tìm hiểu ý nghĩa của các công cụ đó và mối quan hệ giữa chúng để hiểu rõ hơn về hệ sinh thái Docker.

Docker Engine

Docker Engine là một công cụ lightweight runtime, nó giúp build và chạy các Docker container.

Docker Enginequản lý việc bạn tạo image, chạy container, dùng image có sẵn hay tải image chưa có về, kết nối vào container, thêm, sửa, xóa image và container, …

Về bản chất thì Docker là một ứng dụng client-server. Docker Client sẽ nói chuyện với Docker Engine thông qua một RESTful API, để thực thi các lệnh như buildshipvà run một container.

Với lệnh dockerchính là Docker Client, khi ta gõ lệnh docker version bản chất là Docker Client gọi tới API của Docker Engine với phương thức GET thông qua unix-socket.

Điều này có nghĩa là ta hoàn toàn có thể giao tiếp với Docker Engine bằng một công cụ khác cũng được, miễn sao nó “biết” cách gọi tới các API của Docker Engine.

Cụ thể danh sách các API được cung cấp tại link sau: https://docs.docker.com/engine/api/v1.37/

Có 4 đối tượng lớn trong thế giới của Docker Engine và tất cả chúng đều có ID. Và bằng cách nào đó để chúng làm việc với nhau thì chúng ta có thể buid, ship và run application của chúng ta ở bất cứ nơi đâu.

Images: image được sử dụng để đóng gói ứng dụng và các thành phần phụ thuộc của ứng dụng. Image có thể được lưu trữ ở local hoặc trên một registry. Registry là một dịch vụ giúp tổ chức và cung cấp các kho chứa các image.

Container: container là một running instance của một Docker Images.

Network: Cung cấp một private network mà chỉ tồn tại giữa container và host.

Volume: volume được thiết kể để lưu trữ các dữ liệu độc lập với vòng đời của container.

Chúng ta sẽ xem qua một biểu đồ minh họa các lệnh phổ biến của Docker Client và mối quan hệ giữa 4 thành phần trên.

Hình 2: Môi liên hệ giữa Image, container, network và volume

Ngoài ra thì Docker Engine cho phép load thêm các third-party plugins để mở rộng thêm các chức năng khác. Ví dụ Weave là một network-plugin cho phép tạo một mạng ảo, kết nối các Docker container trên nhiều host lại với nhau, cho phép tự động discovery các ứng dụng.

Các công cụ phân phối (Distribution tools)

Docker Registry: một open source image distribution tool giúp lưu trữ và quản lý image.

Docker Trusted Registry: một công cụ trả phí, nó khác với Docker Registry là có giao diện quản lý và cung cấp một số tính năng bảo mật.

Docker Hub: Cung cấp public và private image repository. Mặc định Docker Client sẽ sử dụng Docker Hub nếu không có registry nào được cấu hình.

Các công cụ quản lý (Management tools)

Docker Machinelà một công cụ để cung cấp và quản lý các máy chủ Dockerized (máy chủ có Docker Engine chạy trên đó). Thông thường, chúng ta cài đặt Docker Machine trên hệ thống cục bộ và sẽ giao tiếp với các máy chủ Dockerized ở xa.

Hình 3: Docker Machine giao tiếp với các máy chủ Dockerized

Docker Compose: là một công cụ tuyệt vời để định nghĩa và chạy nhiều container trên Docker. Nó cho phép tạo 1 file cấu hình YAML, nơi mà bạn sẽ định nghĩa các services trên ứng dụng của bạn và định nghĩa tất cả các bước, các cấu hình cần thiết để xây dựng các image, up các container và liên kết chúng với nhau. Cuối cùng, một khi tất cả điều này được thực hiện, bạn sẽ chỉ cần thiết lập tất cả với một lệnh duy nhất. Mặc định thì Docker Compose sẽ tạo một single-network cho các ứng dụng và các container có thể truy cập lẫn nhau thông qua mạng này.

Docker Swarm: là một công cụ giúp tạo ra một clustering Docker. Nó gom nhiều Docker Engine lại với nhau để tạo thành duy nhất một virtual Docker Engine. Tất nhiên là bất cứ công cụ nào có thể giao tiếp với Docker Engine thì cũng sẽ giao tiếp với Docker Swarm bình thường theo đúng chuẩn Docker API.

Provisioning of Docker Engines

Docker Machine (trên hầu hết các public cloud phổ biến và hạ tầng của chính bạn) hoặc Docker Toolbox, Docker cho Mac, Docker for Windows (cho laptop).

Tùy vào chùng ta đang có OS gì thì có thể tự xây dựng cho mình một môi trường để Provisioning of Docker Engines.

Kết luận

Docker cho phép chúng ta build, ship, và run bất kỳ ứng dụng nào ở bất kỳ đâu.

Build: Docker Engine (docker buid -t) và Docker Compose (docker-compose build, dành cho multi-container)

Ship: Docker Registry, Docker Trusted Registry, Docker Hub

Run: Docker Engine (docker run), Docker Swarm (cụm Docker Engines), Docker Compose (docker-compose up)

Provisioning of Docker Engines: Docker Machine (trên hầu hết các public cloud phổ biến và hạ tầng của chính bạn) hoặc Docker Toolbox, Docker cho Mac, Docker for Windows.