Tìm hiểu về Docker.

Giới Thiệu

Docker là một công cụ giúp cho việc tạo ra và triển khai các container để phát triển, chạy ứng dụng được dễ dàng. Các container là môi trường, mà ở đó lập trình viên đưa vào các thành phần cần thiết để ứng dụng của họ chạy được, bằng cách đóng gói ứng dụng cùng với container như vậy, nó đảm bảo ứng dụng chạy được và giống nhau ở các máy khác nhau (Linux, Windows, Desktop, Server ...)

Docker có vẻ rất giống máy ảo (nhiều người từng tạo máy ảo với công cụ ảo hóa như Virtual Box, VMWare), nhưng có điểm khác với VM: thay vì tạo ra toàn bộ hệ thống (dù ảo hóa), Docker lại cho phép ứng dụng sử dụng nhân của hệ điều hành đang chạy Docker để chạy ứng dụng bằng cách bổ sung thêm các thành phần còn thiếu cung cấp bởi container. Cách này làm tăng hiệu xuất và giảm kích thước ứng dụng.

Ai dùng Docker? Docker mang lại lợi ích cho cả lập trình viên lẫn quản trị hệ thống, sử dụng Docker lập trình viên tập trung vào mà viết code chứ không lo lắng về việc triển khai, không lo lắng ở máy của lập trình viên chạy được, máy khác lại không chạy được ...

1. Docker là gì ?

Docker là một nền tảng để cung cấp cách để building, deploying và running ứng dụng một cách dễ dàng trên nền tảng ảo hóa. Có nhiều công nghệ Container khác như Solaris Zones, BSD jails, và LXC. Nhưng tại sao Docker lại phát triển, phổ biến nhanh chóng? Đây là những nguyên nhân:

  • Ease of use: Docker rất dễ cho mọi người sử dụng từ developers, systems admins, architects…v…v.. nó tận dụng lợi thế của container để build, test nhanh chóng. Có thể đóng gói ứng dụng trên laptop của họ và chạy trên public cloud, private cloud..v.v… Câu thần chú là “Build once, run anywhere”.
  • Speed: Docker container rất nhẹ và nhanh, bạn có thể tạo và chạy docker container trong vài giây so sánh với VMs thì mỗi lần chạy VMs cần rất nhiều thời gian khởi động
  • DockerHub: là một “app store for docker images”. trên DockerHub có hàng ngàn public images được tạo bởi cộng đồng. Dễ dàng tìm thấy những image mà bạn cần và chỉ cần pull về và sử dụng với một số sửa đổi nhỏ.
  • Modularity and Scalability: Bạn có thể chia nhỏ những chức năng của ứng dụng thành các container riêng lẻ. Ví dụng Database chạy trên một container và Redis cache có thể chạy trên một container khác trong khi ứng dụng Node.js lại chạy trên một cái khác nữa. Với Docker, rất dễ để liên kết các container với nhau để tạo thành một ứng dụng, làm cho nó dễ dàng scale, update các thành phần độc lập với nhau.

Để đi sâu hơn vào Docker chúng ta cần phải tìm hiểu những khái niệm liên quan đến nó. Nào cùng xem qua mô hình bên dưới

  • Images: hiểu nôm na là một khuôn mẫu để tạo một container. Thường thì image sẽ base trên 1 image khác với những tùy chỉnh thêm. ví dụ bạn build 1 image dựa trên image ubuntu để chạy Apache web service và ứng dụng của bạn và những tùy chỉnh, cấu hình để ứng dụng của bạn có thể chạy được. Bạn có thể tự build một image riêng cho mình hoặc sử dụng những image được publish từ cộng đồng Docker Hub. Một image sẽ được build dựa trên những chỉ dẫn của Dockerfile.
  • Containers: là một instance của một image. Bạn có thể create, start, stop, move or delete container dựa trên Docker API hoặc Docker CLI.
  • Registry (Docker Hub): là một kho chứa các image được publish bởi cộng đồng Docker. Nó giống như GitHub và bạn có thể tìm những image cần thiết và pull về sử dụng.
  • Docker Client: là một công cụ giúp người dùng giao tiếp với Docker host.
  • Docker Daemon: lắng nghe các yêu cầu từ Docker Client để quản lý các đối tượng như Container, Image, Network và Volumes. Các Docker Daemon cũng giao tiếp với nhau để quản lý các Docker Service.
  • Dockerfile: là một tập tin bao gồm các chỉ dẫn để build một image .

2. Sự khác biệt giữa Docker và Hypervisors.

Hypervisors là gì ?

Hypervisor: Nó là sự kết hợp hoặc là một phần mềm, phần sụn hoặc phần cứng duy nhất. Máy ảo chạy trên đỉnh của trình ảo hóa và trình ảo hóa chạy trên máy tính vật lý. Máy tính này được gọi là máy chủ. Tất cả các tài nguyên như Ram, CPU, vv được cung cấp bởi máy chủ.

Docker là gì ?

Docker: Đây là công nghệ đang được đánh giá là tương lai của công nghệ ảo hoá (future of virtualization). Khác biệt lớn của Docker và Vagrant (hay Virtual Machine nói chung) đó là tiết kiệm đáng kể resource sử dụng. Với docker bạn có thể chạy 20 container (tương tự như một hệ điều hành nhỏ) trên cùng một máy host (host machine) điều mà nếu sử dụng Vagrant sẽ cần một máy chủ với cấu hình cực khủng. Docker làm được điều này là bởi vì khác với Virtual Machine ở chỗ thay vì tách biệt giữa hai môi trường guest và host, thì các container của Docker chia sẻ các resource với host machine.

Sự khác biệt giữa Docker và Hypervisors

Docker: Dùng chung kernel, chạy độc lập trên Host Operating System và có thể chạy trên bất kì hệ điều hành nào cũng như cloud. Khởi động và làm cho ứng dụng sẵn sàng chạy trong 500ms, mang lại tính khả thi cao cho những dự án cần sự mở rộng nhanh.

Virtual Machine(Hypervisors): Cần thêm một Guest OS cho nên sẽ tốn tài nguyên hơn và làm chậm máy thật khi sử dụng. Thời gian khởi động trung bình là 20s có thể lên đến hàng phút, thay đổi phụ thuộc vào tốc độ của ổ đĩa.

3. Sự khác biệt giữa Docker Image và Docker Container

Docker Images là gì ?

Docker image là một ảnh của một môi trường phát triển (có thể hiểu là snapshot). Nói ngắn gọn là chúng ta có thể gói các cài đặt môi trường (OS, package, phần mềm của chúng ta đã viết, …) lại thành 1 cục duy nhất, đó chính là docker image. Khi đã có docker image, ta có thể khởi tạo các docker container từ docker image.

Nếu liên tưởng đến OOP, thì ta có thể xem docker image là class, còn docker container là object / instance của class đó! Vì vậy nếu ta có 1 docker image trên máy, ta có thể tạo một hoặc nhiều container có môi trường bên trong chúng giống hệt nhau.

Docker container là gì ?

Docker Container đóng gói một phần mềm ứng dụng. Nó là một hộp vô hình bao gồm mọi thứ như hệ điều hành, mã ứng dụng, thời gian chạy, công cụ hệ thống, thư viện hệ thống, v.v ... Docker Image tạo Docker Container. Docker image này chỉ có thể đọc được. Docker container là máy ảo chứa môi trường phần mềm.

Ví dụ, 1 container có thể chứa môi trường:

  • OS: Ubuntu 16.04
  • Đã cài sẵn 1 số package như: git, curl, wget, nano, … (hoặc package nào bạn mong muốn tùy nhu cầu mà bạn chọn image hoặc viết Dockerfile tương ứng).
  • Đã cài web app bạn viết.
  • Web app đang chạy ở port 8080 trên môi trường ảo đó.

4. Làm thế nào để tạo ra một Docker Image bằng Dockerfile

Dockerfile là gì?

Dockerfile là một tập tin dạng text chứa một tập các câu lệnh để tạo mới một Image trong Docker.

Một số lệnh trong Dockerfile:

FROM <base_image>:<phiên_bản>: đây là câu lệnh bắt buộc phải có trong bất kỳ Dockerfile nào. Nó dùng để khai báo base Image mà chúng ta sẽ build mới Image của chúng ta.

MAINTAINER <tên_tác_giả>: câu lệnh này dùng để khai báo trên tác giả tạo ra Image, chúng ta có thể khai báo nó hoặc không.

RUN <câu_lệnh>: chúng ta sử dụng lệnh này để chạy một command cho việc cài đặt các công cụ cần thiết cho Image của chúng ta.

CMD <câu_lệnh>: trong một Dockerfile thì chúng ta chỉ có duy nhất một câu lệnh CMD, câu lệnh này dùng để xác định quyền thực thi của các câu lệnh khi chúng ta tạo mới Image.

ADD <src> <dest>: câu lệnh này dùng để copy một tập tin local hoặc remote nào đó (khai báo bằng <src>) vào một vị trí nào đó trên Container (khai báo bằng dest).

**LABEL: **cung cấp metadata cho image. Có thể sử dụng để add thông tin maintainer. Để xem các label của images, dùng lệnh docker inspect.

ENV <tên_biến>: định nghĩa biến môi trường trong Container.

COPY: sao chép các file và thư mục vào container.

ARG: định nghĩa giá trị biến được dùng trong lúc build image.

WORKDIR: Thiết lập thư mục đang làm việc cho các chỉ thị khác như: RUN, CMD, ENTRYPOINT, COPY, ADD,…

EXPOSE: khai báo port lắng nghe của image.

ENTRYPOINT <câu_lệnh>: định nghĩa những command mặc định, cái mà sẽ được chạy khi container running.

VOLUME <tên_thư_mục>: dùng để truy cập hoặc liên kết một thư mục nào đó trong Container.

5. Demo

Tạo một file dockerfile:

FROM php:7.0.4-fpm

RUN apt-get update && apt-get install -y libmcrypt-dev \
    mysql-client libmagickwand-dev --no-install-recommends \
    && pecl install imagick \
    && docker-php-ext-enable imagick \
    && docker-php-ext-install mcrypt pdo_mysql
    
#Thiết lập thư mục hiện tại
WORKDIR /var/www/html
# Copy tất cả các file trong thư mục hiện tại (.)  vào WORKDIR
ADD . /var/www/html

#Thiết lập khi tạo container từ image sẽ mở cổng 80
# ở mạng mà container nối vào
EXPOSE 80

# Khi chạy container tự động chạy ngay httpd
ENTRYPOINT ["/usr/sbin/httpd"]

#chạy terminate
CMD ["-D", "FOREGROUND"]

Tiến hành build file Dockerfile

$ docker build .

$ docker run 4cc010d9d657

6. Kết luận

Như vậy mình đã hướng dẫn xong các bước cơ bản để tạo 1 file Dockerfile. Hy vọng các bạn làm sẽ thành công, nếu có vấn đề gì thì comment ở dưới để cùng trao đổi nhé.


All Rights Reserved