Sơ lược về Docker

toannm

Docker đã trở thành tiêu chuẩn thực tế khi thực hiện việc triển khai dựa trên container. Bài viết này gồm những khái niệm cơ bản về Docker, sự phát triển và các khái niệm chính liên quan.

Khái niệm về Linux Containers đã tồn tại trước khi Docker ra đời. Trước khi tìm hiểu về Docker, cần nắm được những nội dung cơ bản về Linux Containers.

Linux container là gì?

Trong môi trường ảo hóa điển hình, một hoặc nhiều virtual machines (máy ảo) chạy trên physical server (máy chủ vật lý) sử dụng trình ảo hóa như Xen, Hyper-V, v.v.

Mặt khác, container chạy trong userspace trên kernel của hệ điều hành có thể gọi là ảo hóa OS-level (cấp hệ điều hành).

Mỗi container có userspace riêng biệt và có thể chạy nhiều containers trên một máy chủ có userspace.

Nghĩa là có thể chạy các hệ thống Linux (containers) khác nhau trên một máy chủ. Ví dụ: có thể chạy RHEL và SUSE container trên Ubuntu server. Ubuntu Server có thể là virtual machine hoặc physical host

Hình ảnh sau đây cung cấp sự mô tả trực quan về các Linux continers.

linux-containers.png


Containers được cô lập trong máy chủ bằng 2 tính năng Linux kernel được gọi là namespaces và control groups (nhóm kiểm soát)

Namespaces:

Sau đây là các namespaces chính trong Linux:

  • pid namespace : Chịu trách nhiệm cô lập process (PID: Process ID).
  • net namespace : Quản lý giao diện network (NET: Networking).
  • ipc namespace : Quản lý quyền truy cập vào tài nguyên IPC (IPC: InterProcess Communication).
  • mnt namespace: Chịu trách nhiệm quản lý các filesystem mount points (MNT: Mount).
  • uts namespace : Cô lập kernel và version identifiers. (UTS: Unix Timesharing System).
  • usr namespace: Cô lập user IDs. Nói một cách đơn giản, nó cô lập user ids giữa máy chủ và container
  • Cgroup namespace: Cô lập thông tin control group từ container process
Khi sử dụng các namespaces này, container sẽ có giao diện network, IP address riêng , v.v ... Mỗi container sẽ có namespace riêng và các quy trình chạy bên trong namespace đó sẽ không có bất kỳ đặc quyền nào ngoài namespace của nó.

Control groups:

Các tài nguyên container sử dụng được quản lý bởi Linux control groups. Có thể quyết định số lượng CPU và tài nguyên bộ nhớ mà container nên sử dụng bằng các Linux control groups..

Container không phải là khái niệm mới. Google đã sử dụng công nghệ container riêng trong hạ tầng trong nhiều năm. Solaris Zones, BSD Jails, LXC là số ít công nghệ container của Linux đã tồn tại trong nhiều năm.

Bài viết này sẽ tìm hiểu về Docker, lợi ích của Docker và sự khác biệt so với các công nghệ container khác.

Docker là gì?

Docker là open-source project phổ biến dựa trên các Linux containers. Docker được viết và phát triển bởi Dotcloud (Công ty A PaaS).

Về cơ bản, nó là công cụ container sử dụng các tính năng Linux Kernel như namespaces và control groups để tạo các containers phía trên cùng của hệ điều hành.

Vậy thì Docker khác Linux Container như thế nào vì tất cả các khái niệm và cách triển khai trông khá giống nhau?

Ngoài việc cùng là công nghệ container, Docker còn có các thành phần bao bọc được xác định rõ giúp gói application trở nên dễ dàng.

Nó tách application khỏi hạ tầng bằng cách gói tất cả yêu cầu hệ thống application vào một container.

Docker có quy trình làm việc hiệu quả để chuyển application từ developers laptops, môi trường thử nghiệm sang sản xuất.

Nó cực kỳ nhanh và có thể chạy trên bất kỳ máy chủ nào có Linux Kernel tương thích. (Cũng hỗ trợ Windows)

Lưu ý: không thể chạy Windows container trên máy chủ Linux vì không có hỗ trợ Linux Kernel cho Windows. Có thể tìm hiểu thêm về các Windows containers tại đây

Docker sử dụng Copy-on-write union file system cho backend storage. Bất cứ khi nào thay đổi được thực hiện cho container, những thay đổi sẽ được ghi vào đĩa bằng cách sử dụng bản sao trên mô hình ghi.
docker-trends.jpg


Sự khác biệt giữa Docker & Container

Docker là công nghệ hoặc công cụ được phát triển để thực hiện việc triển khai container.

Liệu có thể chạy contianer mà không cần Docker?

Tất nhiên câu trả lời là có. Có thể sử dụng công nghệ LXC để chạy containers trên Linux servers.

Những điều nên biết về Docker:
  • Docker không phải là LXC
  • Docker không phải là Virtual Machine Solution.
  • Docker không phải là hệ thống quản lý cấu hình và không phải là sự thay thế cho chef, puppet, Ansible, v.v.
  • Docker không phải là nền tảng như công nghệ service.

Docker hoạt động như thế nào?

Hãy tìm hiểu các thành phần quan trọng của Docker.

Thành phần Docker:

Docker gồm có các thành phần sau đây:

  • Docker Daemon
  • Docker Client
  • Docker Images
  • Docker Registries
  • Docker containers

Docker Daemon

Docker có kiến trúc client-server. Docker Daemon hoặc server chịu trách nhiệm cho tất cả các hoạt động liên quan đến containers.

daemon nhận lệnh từ Docker client thông qua CLI hoặc REST API. Docker client có thể ở trên cùng một máy chủ với một daemon hoặc có thể có mặt trên bất kỳ máy chủ nào khác.

docker-architecture-techtip39.png


Docker Images

Images là các building blocks cơ bản của Docker. Containers được xây dựng từ images. Images được cấu hình với các applications và sử dụng làm template để tạo containers. Nó được tổ chức theo kiểu layer. Mỗi thay đổi trong image được thêm vào như một layer trên nó.

Docker registry

Là kho lưu trữ cho Docker images. Sử dụng Docker registry có thể xây dựng và chia sẻ images với nhóm.

registry có thể công khai hoặc riêng tư. Docker Inc cung cấp registry service được lưu trữ gọi là Docker Hub. Nó cho phép upload và download images từ một vị trí trung tâm.

Nếu kho lưu trữ là công khai, tất cả images có thể truy cập bởi những Docker hub users khác. Cũng có thể tạo registry riêng trong Docker Hub.

Docker hub hoạt động như git, nơi có thể xây dựng images cục bộ trên laptop, cam kết và đẩy lên Docker hub.

Docker Container

Đây là môi trường thực thi cho Docker. Containers được tạo ra từ images. Nó là layer có thể ghi của image.

Có thể gói các applications trong container, cam kết và biến nó thành golden image để xây dựng nhiều containers hơn.

Hai hoặc nhiều containers có thể liên kết với nhau để tạo thành kiến trúc application theo tầng. Containers có thể bắt đầu, dừng lại, cam kết và kết thúc. Nếu kết thúc container mà không cam kết, tất cả các thay đổi được thực hiện cho container sẽ bị mất.

Tại sao containers tốt hơn máy ảo VMs?

Không hoàn toàn nói rằng containers tốt hơn máy ảo VM. Tuy nhiên, containers có một số lợi thế chính nổi trội hơn máy ảo VM.

Sử dụng tài nguyên & chi phí

Có thể sử dụng máy ảo VMs để chạy applications một cách cô lập nghĩa là một service cho mỗi máy ảo VM. Nhưng nó vẫn có thể được sử dụng. Và thay đổi kích thước máy ảo VM không phải là nhiệm vụ dễ dàng cho application sản xuất.​
Mặt khác, container có thể chạy với các yêu cầu bộ nhớ và CPU rất tối thiểu. Thậm chí có thể chạy nhiều containers bên trong máy ảo VM để phân tách applicatio.n. Cộng với việc thay đổi kích thước container mất khoảng vài giây.​

Cung cấp và triển khai

Việc cung cấp máy ảo VM và triển khai applications có thể mất vài phút đến vài giờ tùy thuộc vào workflow liên quan. Ngay cả rollback (phục hồi) cũng mất thời gian.​
Nhưng có thể triển khai một container trong vài giây và phục hồi sau vài giây.​

Quản lý Drift

Quản lý Drift trong máy ảo VM là điều không dễ dàng. Cần phải có tự động hóa và quy trình đầy đủ để đảm bảo tất cả các môi trường đều giống nhau. Theo các mô hình triển khai bất biến sẽ tránh drift trong môi trường máy ảo VM.​
Khi nói đến containers, một khi image được sao lưu, nó sẽ giống nhau trong tất cả các môi trường. Đối với bất kỳ thay đổi nào, cần bắt đầu thực hiện thay đổi trong dev env và re-bake container image.​

Tổng kết

Tính năng tốt nhất của Docker là sự hợp tác.

Docker images có thể đẩy vào kho lưu trữ và có thể kéo xuống bất kỳ máy chủ nào khác để chạy containers từ image đó.

Hơn nữa, Docker hub có hàng ngàn images được tạo bởi users và có thể kéo những images đó xuống máy chủ dựa trên các yêu cầu application.

Nếu muốn chạy Docker cho production workloads, cần tuân theo các thực tiễn sử dụng Docker images được đề xuất.
 
Top