Docker (1) - Docker, image và container

 

1         Tổng quan về Docker

Docker có nghĩa là nhân viên bốc xếp ở bến cảng, nhiệm vụ của anh ta là đưa các container chứa hàng hóa từ các phương tiện vận chuyển khác lên tàu và ngược lại.

Quan sát tình huống thực tế trên bến cảng (nếu không có container – thùng chứa hàng tiêu chuẩn):


– Với rất nhiều loại hàng hóa khác nhau, cần phải sắp xếp hàng hóa sao cho hợp lý? ví dụ các loại hạt nên đặt cạnh nhau, các loại máy móc nên đặt cạnh nhau, đồ dễ vỡ đặt ở đâu thì an toàn.

– Với rất nhiều phương tiện để vận chuyển, và nhiều cách thức lưu kho, làm thế nào để lựa chọn phương tiện/hình thức vận chuyển nhanh và hợp lý?

Với các yêu cầu trên, nhân viên bốc xếp sẽ có rất nhiều lựa chọn, như ma trận dưới đây:


Giải pháp của nhân viên bốc xếp là sử dụng các thùng chứa chuẩn, gọi là các container, bỏ hàng hóa cần vận chuyển vào container. Khi đó việc sắp xếp/vận chuyển hàng hóa sẽ nhanh và đơn giản hơn nhiều.


Quan sát trong môi trường lập trình, lập trình viên (developer) và người quản trị hệ thống (sysadmin) cũng gặp bài toán giống với nhân viên bốc xếp.

Hình sau thể hiện sự phức tạp của môi trường lập trình:


Trong môi trường lập trình, với rất nhiều chồng công nghệ, dịch vụ, thư viện; chúng có thể làm việc được với nhau không? với rất nhiều môi trường phần cứng, thiết bị, server; có thể dễ dàng di chuyển phần mềm đang chạy trên môi trường này tới môi trường khác được không?

Lập trình viên và người quản trị hệ thống lại có một ma trận các lựa chọn:


Giải pháp của lập trình viên là sử dụng các thùng chứa chuẩn, gọi là các container, bỏ các chồng công nghệ, dịch vụ, thư viện, cần sử dụng vào container. Khi đó việc thiết lập môi trường lập trình, di chuyển, chạy ứng dụng sẽ nhanh và đơn giản hơn nhiều.


Với giải pháp của sử dụng docker, lập trình viên sẽ không còn phải tốn nhiều thời gian cho việc lựa chọn, thiết lập môi trường và chạy các ứng dụng trên các môi trường khác nhau nữa, mà tập trung vào việc lập trình, giải quyết các bài toán chuyên môn.



1.1       Docker là gì?

Docker là một nền tảng cho lập trình viên (developers) và người quản trị hệ thống (sysadmin) để phát triển, triển khai và chạy ứng dụng với container. Nó cho phép tạo các môi trường độc lập và tách biệt để khởi chạy và phát triển ứng dụng và môi trường này được gọi là container. Khi cần triển khai (deploy) lên bất kỳ server nào chỉ cần chạy container của Docker thì ứng dụng của bạn sẽ được khởi chạy ngay lập tức.

Để dễ hình dung về hoạt động của docker, quan sát hình ở trên. Bạn sẽ thấy vai trò của docker khá giống với vai trò của hypervisor trong giải pháp máy ảo. Nghĩa là docker là hạ tầng nằm trên hệ điều hành, hạ tầng này cho phép bạn tạo ra một “phân hệ” hay một cái “máy tính mini” (gọi là container) chạy độc lập với hệ điều hành và với phần cứng. Như vậy, vai trò của container gần giống với vai trò của một máy ảo (virtual machine).


Từ hình trên, dễ thấy trong môi trường docker, để có được môi trường lập trình và chạy ứng dụng (App1, Bins/Libs) thì không cần phải có máy ảo/hệ điều hành máy ảo (Guest OS). Điều này giúp việc cài đặt hạ tầng, môi trường lập trình, chạy ứng dụng sẽ đơn giản, và nhanh hơn.

1.2       Cài Docker trên Windows 10:

1.2.1       Kích hoạt Hyper-V

– Sao lại phải kích hoạt Hyper-V? vì Docker có nhiều giải pháp để hoạt động, trong đó có giải pháp dùng luôn hạ tầng Hyper-V.

– Mở PowerShell với quyền Administrator, gõ lệnh sau:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V –All

1.2.2       Cài đặt Docker

– Tải gói cài đặt Docker về máy (chọn bản Stable)

https://hub.docker.com/editions/community/docker-ce-desktop-windows/

– Sau khi tải gói cài đặt về máy, tiến hành cài đặt Docker

– Sau khi cài đặt xong, trong PowerShell gõ lệnh docker --version, nếu hiển thị phiên bản của Docker là việc cài đặt đã hoàn thành.

Ví dụ:

PS C:\Users\Maxsys> docker --version

Docker version 19.03.12, build 48a66213fe

1.3       Thao tác với image và container

1.3.1       Các thành phần của một hệ thống Docker

Một hệ thống Docker thường gồm bốn thành phần sau :

– Image

– Container

– Registry

– Engine


Image

Image là một gói thực thi, chứa bên trong là tất cả những gì cần thiết, liên quan để chạy ứng dụng như mã nguồn, các thư viện, thành phần thực thi lệnh (runtime), các biến môi trường và các tập tin cấu hình liên quan.

Dùng lệnh docker images để kiểm tra các image hiện đang có trên Docker, dưới đây là ý nghĩa của các cột khi hiển thị.

– REPOSITORY: tên của image

– TAG: phiên bản của image

– IMAGE ID: mã định danh của image

– CREATED: ngày tạo image

– SIZE: kích thước của image

Container

Container là một thể hiện (instance) đang chạy, được khởi tạo từ Image.

Registry

Các image có thể được lưu trong một kho, gọi là Registry, kho này có thể lưu trên mạng

Vào trang https://hub.docker.com/, bấm vào mục Explore để xem các image hiện đang có trong registry trên mạng.

Engine

Engine là phần mềm Docker, cho phép tạo, lưu và chạy các image/container

Lưu ý:

– Một lệnh trong Docker luôn bắt đầu là docker tiếp theo là các chỉ dẫn cụ thể.

– Dùng tham số --help sau mỗi lệnh, để xem các hướng dẫn về một lệnh bất kì.

1.3.2       Xem và tải image bằng PowerShell

Có thể tìm kiếm các image bằng lệnh trên PowerShell, dùng lệnh docker search <tên image>.

Ví dụ: docker search mongodb

Để tải một image về máy, sử dụng lệnh docker pull <tên image:phiên bản>.

Ví dụ: docker pull mongo sẽ tải image mongo về máy với phiên bản mặc định (thường có tên là latest, là bản mới nhất).

Để lấy phiên bản cụ thể (ví dụ 4.4.0) dùng lệnh sau: docker pull mongo:4.4.0

Muốn dừng việc tải image về máy bấm tổ hợp phím Ctrl + C.

1.3.3       Xóa một image trong docker

Như đã biết để xem các image đang có, dùng lệnh docker images

Để xóa một image, dùng lệnh docker image rm <tên image> (rm là viết tắt của remove).

1.3.4        Tạo và thao tác với container

Container chính là một thể hiện (instance) hay là một bản đang chạy của một image, khi đã có image, để tạo container, dùng lệnh docker run <tham số><tên image:phiên bản>.

Ví dụ: docker run –it ubuntu:latest

Xem thêm các tham số ở đây: https://docs.docker.com/engine/reference/run/

Ghi chú: ở ví dụ trên ubuntu:latest là TAG của một image, có thể thay thế TAG bằng IMAGE ID. Khi đó lệnh tạo container sẽ có dạng: docker run –it 4e2eef94cd6b. Khi gõ lệnh, không cần viết đầy đủ giá trị của IMAGE ID, mà chỉ cần nhập 1, 2, hoặc 3 kí tự đầu tiên, mục đích là để phân biệt được với các IMAGE ID đang có trong docker.

Khi container ubuntu được tạo ra, sẽ có dấu nhắc lệnh của ubuntu, ví dụ:

root@8d3f56721c1b:/#

Nhập vào lệnh để kiểm tra một số thông tin của ubuntu, ví dụ:

root@8d3f56721c1b:/#cat /etc/*release

Để xem các container đang chạy trên docker, dùng lệnh docker ps (ps là viết tắt của process status)

Để tắt một container, trong cửa sổ dòng lệnh của container đang chạy, gõ lệnh exit. Ví dụ: root@8d3f56721c1b:/# exit

Để xem tất cả các container (đang chạy hoặc không), dùng lệnh: docker ps -a

Để chạy lại một container, sử dụng lệnh docker start <tên container> hoặc docker start <một phần ID của container>

Để chuyển cửa sổ điều khiển (PowerShell) vào container đang chạy (ví dụ Ubuntu), sử dụng lệnh: docker attach <tên hoặc một phần ID của container>. Ví dụ: docker attach 8d

Muốn chuyển từ giao diện của Ubuntu về lại PowerShell (mà không tắt Ubuntu), sử dụng tổ hợp phím Ctrl + P + Q.

Khi đứng ở dòng lệnh PowerShell mà muốn tắt một container (không cần phải truy cập vào container đang chạy), thì dùng lệnh sau: docker stop <tên hoặc một phần id của container>.

Khi đứng ở dòng lệnh PowerShell, muốn chạy một lệnh của một container, (ví dụ lệnh ls của Ubuntu) thì dùng lệnh sau:

docker exec <tên container> <tên lệnh muốn container thực thi>

Xóa container

docker container rm <tên hoặc một phần ID>

Ví dụ:

docker container rm 8d

1.3.5       Chuyển container thành image

Sau khi có container, thực hiện các cài đặt và cấu hình cần thiết cho container. Để lưu container thành một image, sử dụng lệnh commit.

Muốn commit một container, thì container phải ở trạng thái dừng (exited).

Cú pháp của lệnh commit:

docker commit <tên của container muốn commit> <tên của image sẽ được tạo ra><:tên phiên bản>

Ví dụ:

docker commit 8d ubuntu:v1

1.3.6       Xuất image ra một tập tin

 Để chia sẻ một image cho người khác, có thể lưu image thành một tập tin, với cú pháp sau:

docker save --output <tên tập tin><tên hoặc ID của image>

Ví dụ:

docker save --output ubuntu.rar 70

Tập tin sẽ được tạo ra trong thư mục hiện tại (thư mục thể hiện trên đường dẫn dòng lệnh). Ví dụ: C:\\Users\TenUser.

1.3.7       Tạo image từ một tập tin

Để tạo image từ một tập tin (ví dụ ubuntu.rar), sử dụng lệnh sau:

docker load –i <tên của tập tin>

Ví dụ: docker load -i ubuntu.rar

Đặt tên và phiên bản cho image vừa tạo:

docker tag <ID của image> <tên mới:phiên bản>

Ví dụ: docker tag 70 newimages:v2

-----
Cập nhật: [8/10/2020]
-----