Hôm nay mình đọc được một bài khá là hay của tác giả @lherrera trên medium, nó giải thích khá nhiều các thông tin cho các bạn mới bắt đầu với Docker. Mình xin phép lược dịch (có bỏ một số phần cho đơn giản và dễ hiểu cũng như thêm một số phần khác để giải thích kỹ hơn)

Khi mới bắt đầu với Docker bạn có thể bị nhầm lẫn giữa một rừng các công cụ với tên kiểu Docker-something. Có một công cụ Docker Client, một thứ gọi là Docker Engine, rồi lại có một công cụ tên là 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… Mới nghe đã choáng hết cả đầu rồi.

Vì vậy mục đích của bài viết này là 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.

1. Docker Engine

Nó là một công cụ lightweight runtime (từ này mình không biết dịch sao), nó giúp chúng ta build và chạy các Docker 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ư build, shiprun một container như ví dụ dưới đây

echo

Ở đây, lệnh docker chí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. Danh sách các API được cung cấp tại link.

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. Nếu thấy quá khó hiểu bạn có thể liên tưởng nó với một virtual machine về mặt chức năng.
  • Network: Cung cấp một private network mà chỉ tồn tại giữa container và host. Bắt đầu từ phiên bản 1.09 thì private network có thể mở rộng trên multi-host. Các bạn có thể đọc thêm về docker network trong một bài viết của anh @huydx.
  • 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.

docker

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ụ Flocker là một volume-plugin cung cấp cơ chế volume cho multi-host hoặc 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.

2. Distribution tools

Docker cung cấp 3 công cụ phân tán giúp chúng ta lưu trữ và quản lý các Docker image. Để tự dựng một private registry và lưu trữ các private image chúng ta có thể sử dụng một trong 2 công cụ sau:

  • 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 (nghe bảo thế)

Và ngoài ra chúng ta còn có một dịch vụ

  • Docker Hub: đây là một dịch vụ khi mà bạn không muốn tự quản lý registry. 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. Trên này có rất nhiều các image offcial của các phần mềm như nginx, mongodb, mysql, jenkins …

3. Orchestration tools

  • Docker Machine: là một provisioning tool giúp dễ dàng tiếp cận từ “Zero to Docker”. Machine tạo Docker Engine trên laptop của bạn hoặc trên bất cứ dịch vụ cloud phổ biến nào như AWS, Azure, Google Cloud, Softlayer hoặc trên hệ thống data center như VMware, OpenStack. Docker Machine sẽ tạo các máy ảo và cài Docker Engine lên chúng và cuối cùng nó sẽ cấu hình Docker Client để giao tiếp với Docker Engine một cách bảo mật.
  • Docker Swarm: là một công cụ giúp chúng ta tạo ra một clustering Docker. Nó. giúp chúng ta gom nhiều Docker Engine lại với nhau và ta có thể “nhìn” nó 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, và tất nhiên là trong suốt. Một cụm Swarm có thể được cấu hình và deploy thông qua Docker-Machine. Và theo như bài test của Docker thì họ có thể scale ra 30.000 container trên 1000 node AWS với chỉ một Swarm Manager. Bạn có thể xem nó tương tự như Kubernetes, nhưng theo Docker thì công cụ Swarm của họ lightweight và nhanh hơn gấp 5 lần so với Kubernetes.
  • Docker Compose: là một orchestration tool giúp ta tạo multi-container một cách dễ dàng (lưu ý đối tượng ở đây là container chứ không phải host hay engine nhé).Tất nhiên Docker Compose cũng có thể hoạt động với Swarm để có thể tạo multi-container. Mặc định thì Docker Compose sẽ tạo một single-network cho các ứng dụng của bạn và các container có thể truy cập lẫn nhau thông qua mạng này. Nếu nó vẫn qua khó hiểu với bạn thì bạn có thể xem một ví dụ như sau

Đại khái nó sẽ giúp ta tạo container service vote, container redis, container worker, container db, container result nodejs. Với Docker Compose ta sẽ không cần tạo thủ công từng container như trước nữa.

4. Management tools

Phần này mình sẽ không nói nhiều, vì 3 công cụ ở đầy đều là công cụ trả phí, mình thì không có nhu cầu với các công cụ này nên nếu bạn tò mò thì có thể tìm hiểu với các keyword như ở dưới.

  • Docker Universal Control Plane
  • Docker Datacenter
  • Docker Cloud

5. Tools for local environments

Về phía local ta có các công cụ như sau để hỗ trợ quá trình development.

  • Docker Toolbox: Bởi vì Docker Engine dùng một số feature của kernel Linux nên ta sẽ không thể chạy Docker Engine natively trên Windows hoặc BSD được. Ở các phiên bản trước đây thì ta sẽ cần một máy ảo cài một phiên bản Linux nào đó và sau đó cài Docker Engine lên máy ảo đó. Nghĩa là từ Docker Client -> VirtualBox (VM Linux) -> Docker Engine thay vì trực tiếp từ Docker Client -> Docker Engine như trên Linux. Nếu bạn dùng Mac OS X và Microsoft Windows thì nó sẽ giúp bạn cài Docker Client, Docker Compose, Docker Machine, Docker Kitematic (một GUI client), và sử dụng VirtualBox để deploy Docker Engine trên boot2docker (tinycore). Như hình dưới đây.

linux-windows-macdocker

  • Docker for Mac and Docker for Windows: Ở phiên bản gần đây thì Docker tung ra công cụ này ở bản beta, và hiện tại đã public beta. Tuy nhiên bạn phải nhớ rằng Docker Engine vẫn không thể chạy trên Windows hay BSD (cá nhân mình tin là sau này cũng vẫn thế thôi). Mà thực chất nó vẫn phải chạy trên một máy ảo Linux. Điểm khác biệt là bạn không nhất thiết phải dùng VirtualBox. Đối với Mac thì Docker Engine sẽ chạy trên xhyve Virtual Machine (VM), xhyve là một giải pháp ảo hóa lightweight trên OSX, và distribution chạy trên nền ảo hóa này là Alpine Linux, một distribution vô cùng nhỏ ngọn. Đối với Windows thì Docker Engine cũng sẽ trên một máy ảo Alpine Linux, trên công nghệ ảo hóa của Windows là Hyper-V, bạn nào làm system sẽ biết Hyper-V. Với Hyper-V thì sẽ có một số yêu cần về phiên bản Windows và phần cứng (phần này các bạn tự tìm hiểu, mình không có hứng thú với M$)

Có một câu hỏi ở đây là tại sao không dùng VirtualBox mà phải chuyển qua nền tảng mới. Nếu bạn biết một chút về ảo hóa thì VirtualBox là type-2 hypervisor, còn Hyper-V là type-1 hypervisor. Điểm khác biệt là tốc độ, thế thôi.

6. Tổng kết

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 (SaaS)
  • Run: Docker Engine (docker run) , Docker Swarm (cụm Docker Engines), Docker Compose (docker-compose up)
  • Manage: Docker Universal Control Plane và Docker Cloud (CaaS)
  • 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 của bạn)

Ok, hi vọng nó hữu ích với những ai đang bắt đầu với Docker và hiểu hơn về hệ sinh thái Docker