Tìm hiểu về Docker - Phần 2 - Kiến trúc và thành phần của Docker

Tìm hiểu về Docker - Phần 2 - Kiến trúc và thành phần của Docker

Mở đầu

Ở phần trước chúng ta đã tìm hiểu sơ bộ về Docker và Container. Vậy ở phần này chúng ta đi sâu hơn 1 chút sẽ giới thiệu tổng quan về các thành phần, các khái niệm cơ bản trong hệ sinh thái của Docker nhé.

alt

1. Docker Engine

Docker Engine là một ứng dụng client-server. Có hai phiên bản Docker Engine phổ biến là:

  • Docker Community Edition (CE): Là phiên bản miễn phí và chủ yếu dựa vào các sản phầm nguồn mở khác. Cũng sẽ là phiên bản mình sử dụng trong suốt series này.
  • Docker Enterprise: Khi sử dụng phiên bản này bạn sẽ nhận được sự support của nhà phát hành, có thêm các tính năng quản lý và security. (Bản thân mình chưa được dùng thử Docker Enterprise bao giờ).

Các thành phần chính của Docker Engine gồm có:

  • Server hay còn được gọi là docker daemon (dockerd): chịu trách nhiệm tạo, quản lý các Docker objects như images, containers, networks, volume.
  • REST API: docker daemon cung cấp các api cho Client sử dụng để thao tác với Docker.
  • Client là thành phần đầu cuối cung cấp một tập hợp các câu lệnh sử dụng api để người dùng thao tác với Docker. (Ví dụ docker images, docker ps, docker rmi image v.v..)

alt

Để biết thêm chi tiết về các thành phần, chúng ta hãy cũng xem phần 2 - Kiến trúc của Docker.

2. Kiến trúc của Docker

Docker sử dụng kiến trúc client-server. Docker server (hay còn gọi là daemon) sẽ chịu trách nhiệm build, run, distribute Docker container. Docker client và Docker server có thể nằm trên cùng một server hoặc khác server. Chúng giao tiếp với nhau thông qua REST API dựa trên UNIX sockets hoặc network interface.

Docker daemon

Docker daemon (dockerd) là thành phần core, lắng nghe API request và quản lý các Docker object. Docker daemon host này cũng có thể giao tiếp được với Docker daemon ở host khác.

Docker client

Docker client (docker) là phương thức chính để người dùng thao tác với Docker. Khi người dùng gõ lệnh docker run imageABC tức là người dùng sử dụng CLI và gửi request đến dockerd thông qua api, và sau đó Docker daemon sẽ xử lý tiếp.

Docker client có thể giao tiếp và gửi request đến nhiều Docker daemon.

Docker registry

Docker registry là một kho chứa các Image. Nổi tiếng nhất chính là Docker Hub, ngoài ra bạn có thể tự xây dựng một Docker registry cho riêng mình.

Docker object

Các object này chính là các đối tượng mà bạn thường xuyên gặp phải khi sử dụng Docker gồm có:

Images

Image là một template read-only sử dụng để chạy container.

Một image có thể base trên một image khác. Ví dụ bạn muốn tạo một image nginx, tất nhiên nginx phải chạy trên linux ubuntu chẳng hạn. Khi đó image nginx trước hết sẽ phải base trên ubuntu trước đã.

Bạn có thể tự build image cho riêng mình hoặc tải các image có sẵn của người khác trên Docker registry.

Container

Container được chạy dựa trên 1 image cụ thể. Bạn có thể create, start, stop, move, delete container.

Bạn cũng có thể kết nối các container với nhau hoặc attach storage cho nó, thậm chí là tạo lại một image từ chính state hiện tại của container.

Container cô lập tài nguyên với host và các container khác.

alt

Phía trên là một quá trình thao tác với Docker. Mình sẽ lấy ví dụ quá trình để chạy một container nhé:

Step 1: Docker client (CLI) dùng lệnh sau để chạy một container centos trắng:

$ docker run -itd centos

Step 2: Docker daemon sẽ kiểm tra xem nó có image centos nào không. Nếu có nó sẽ chạy container luôn. Nếu không nó sẽ pull image centos (tag mặc định là lastest) về từ Registry và sau đó mới chạy container. Kiểm tra xem container đang chạy sử dụng lệnh:

$ docker ps

3. Ví dụ

Ví dụ của mình là sẽ chạy một container centos trắng.

Step 1: Điều kiện tiên quyết

Điều kiện bắt buộc là máy bạn đã cài đặt docker. Nếu chưa cài các bạn có thể xem hướng dẫn này của mình.

Step 2: Kiểm tra list image

Theo lý thuyết, để chạy một container thì cần có một image tương ứng. Để kiểm tra image đã có chưa ta sử dụng lệnh:

$ docker images

alt

Ở đây mình chưa có image nào cả, giờ phải tìm được một image centos trên mạng thôi.

Step 3: Tìm image để pull

Tìm xem có image repository nào trên mạng có tên là centos không

$ docker search images

alt

Repository: là tập hợp các image có cùng tên nhưng khác tag (tag ở đây có thể là centos6, centos7, centos7.6.1810, 7.6.1810, lastest…)

Step 4: Download image

$ docker pull centos

alt

Mặc định nếu không chỉ rõ phiên bản thì docker sẽ pull image lastest từ phía Registry về.

Step 5: Kiểm tra lại image

$ docker images

alt

Vậy là đã có images centos rồi nhé.

Step 6: Chạy container

Để chạy container có thể sử dụng tên image hoặc ImageID đều được.

$ docker run -itd centos

Sau đó, kiểm tra xem container đã chạy chưa.

alt

Vậy là container có image là centos đã chạy rồi.

Step 7: Kiểm tra sâu hơn vào trong container

$ docker exec -it [containerID|containerNAME] bash
$ cat /etc/centos-release ## chạy bên trong container nhé

alt

Như vậy là mình đã thực hiện chạy một container với image được pull về (nằm trên Docker host rồi). Trong trường hợp các bạn biết tên image cần chạy thì chỉ cần chạy container luôn và ngay thôi.

Ví dụ: docker run -itd ubuntu. Lúc này Docker sẽ tự pull image về host cho bạn rồi sau đó nó mới chạy container.

Tổng kết

Ở bài này có một số thông tin cần nắm rõ đó là:

  • Docker Engine, các thành phần và chức năng của chúng.
  • Docker container được chạy từ một image. Image này có thể tự build, hoặc pull về từ Registry.
  • Khi chạy container nếu Image không có sẵn trong Docker host thì Docker sẽ tự động tải về Docker host trước.

Các option khi chạy container (ví dụ trong bài này là -itd). Để đảm bảo không bị lỗi, các bạn cứ chạy đủ và đúng option -itd nhé.

Cảm ơn các bạn đã theo dõi và hẹn gặp lại ở bài viết tiếp theo nhé !

Tài liệu tham khảo: