Docker là ứng dụng chuyên đơn giản quá quy trình quản lý các ứng dụng trong containers. Containers là nơi cho phép các ứng dụng hoạt động cách ly với tài nguyên. Nó hoạt động như một máy ảo nhưng linh hoạt và thân thiện với tài nguyên hơn đồng thời nó còn phụ thuộc vào hệ điều hành của máy chủ.
Bài viết sau đây BKHOST sẽ cùng bạn tìm hiểu cách cài đặt và sử dụng Docker Community Edition (CE) trên hệ điều hành Ubuntu 18.04. Bạn sẽ học được cách tự cài Docker, làm việc với containers, kho lưu trữ của Docker.
Điều kiện cài đặt
Bạn cần có những điều kiện sau trước khi làm theo hướng dẫn bên dưới:
- Thiết lập sẵn một máy chủ Ubuntu 18.04 với người dùng không phải root sudo và Firewall.
- Tạo một tài khoản của Docker Hub nếu bạn muốn thực hiện bước 7 bà 8 trong hướng dẫn.
Hướng dẫn cài đặt
Dưới đây là 8 bước cách cài đặt và sử dụng Docker trên Ubuntu 18.04
Bước 1 – Cài đặt Docker
Trong kho lưu trữ chính thức của Ubuntu có cung cấp sẵn những gói Docker, tuy nhiên có thể đó không phải là các gói mới nhất. Để đảm bảo bạn đang tải xuống các gói Docker không bị lỗi thời, hãy tải xuống từ kho lưu trữ chính thức của Docker. Các gói mới của Docker sẽ thêm key GPG để đảm bảo gói tải xuống là mới nhất và hợp lệ.
- Đầu tiên, bạn cần cập nhật các gói hiện tại của bạn bằng lệnh:
{{EJS0}}
- Thiết lập các gói theo yêu cầu ở điều kiện tiên quyết để
apt
có thể sử dụng các gói từ HTTPS:
{{EJS1}}
- Thêm các key GPG ở kho lưu trữ chính thức của Docker trong hệ thống của bạn:
{{EJS2}}
- Thêm kho lưu trữ Docker vào các nguồn apt:
{{EJS3}}
- Cập nhật cơ sở dữ liệu các gói Docker được thêm từ repo:
{{EJS4}}
- Đảm bảo bạn cài đặt Docker từ kho lưu trữ của Docker, không phải Ubuntu:
{{EJS5}}
- Đây là kết quả đầu ra của Docker: apt-cache policy docker-ce
{{EJS6}}
Tại đây dù docker-ce
chưa được cài đặt, nhưng nó sẽ được cài đặt từ kho lưu trữ Docker cho Ubuntu 18.04
- Tại đây, bắt đầu cài đặt Docker:
{{EJS7}}
Quá trình kích hoạt khởi động bắt đầu, bạn có thể kiểm tra xem nó có đang chạy hay không:
{{EJS8}}
- Nếu nó đang chạy, đầu ra sẽ có kết quả như sau:
{{EJS9}}
Docker mà bạn đang cài đặt ngoài cung cấp cho bạn một dịch vụ Docker đơn thuần, nó còn mang đến cho bạn các tiện ích về dòng lệnh hay các ứng dụng khách Docker.
Sau đây, chúng ta hãy bắt đầu khám phá về dòng lệnh Docker.
Bước 2 – Thực thi lệnh Docker mà không cần sudo
Để chạy được lệnh Docker yêu cầu bạn phải được cấp quyền root hoặc là thành viên trong nhóm docker, nhóm người dùng này được tạo tự động trong quá trình cài đặt Docker. Nếu bạn không nằm trong nhóm người dùng trên thì khi chạy lệnh Docker bạn sẽ nhận được phản hồi như sau:
{{EJS10}}
- Nếu bạn không muốn dùng
sudo
trong những lần chạy lệnh docker, bạn có thể thêm tên người dùng vào nhóm docker:
{{EJS11}}
- Để chạy lệnh với tư cách là thành viên nhóm mới, bạn có thể đăng xuất sau đó đăng nhập lại máy chủ hoặc dùng lệnh sau:
{{EJS12}}
Nhập mật khẩu của bạn sau đó tiếp tục quá trình.
- Để xác nhận thêm người dùng mới vào nhóm docker, bạn dùng lệnh sau:
{{EJS13}}
{{EJS14}}
- Bạn có thể khai báo tên người dùng mới để thêm vào nhóm docker bằng lệnh sau thay vì đăng nhập:
{{EJS15}}
Các lệnh docker trong phần tiếp theo sẽ chạy với tư cách là người trong nhóm docker, nếu bạn không phải thì thêm sudo
vào trước các câu lệnh.
Sau đây là các lệnh Docker.
Bước 3 – Sử dụng lệnh Docker
- Câu lệnh docker sẽ bao gồm các tùy chọn, câu lệnh và đối số, cú pháp của nó như sau:
{{EJS16}}
- Dùng lệnh sau để liệt kê các lệnh con có sẵn:
{{EJS17}}
- Danh sách lệnh con đầy đủ của Docker bao gồm:
Lệnh | Ý nghĩa |
attach | Đính kèm luồng đầu vào, đầu ra và lỗi tiêu chuẩn cục bộ cho chương trình đang chạy |
build | Thiết lập hình ảnh từ Dockerfile |
commit | Xây dựng hình ảnh mới từ thay đổi vùng chứa |
cp | Sao chép tệp / thư mục giữa vùng chứa và hệ thống tệp cục bộ |
create | Tạo mới vùng chứa |
diff | Kiểm tra các thay đổi về tệp/ thư mục ở vùng chứa |
events | Nhận các sự kiện thời gian thực từ máy chủ |
exec | Chạy lệnh trong vùng chứa đang chạy |
export | Xuất tệp của vùng chứa ở dạng tar |
history | Lịch sử hiển thị hình ảnh |
images | Danh sách hình ảnh |
import | Nhập nội dung từ tarball để tạo hình ảnh hệ thống tệp |
info | Hiển thị thông tin toàn hệ thống |
inspect | Trả lại thông tin của Docker ở cấp thấp |
kill | Tắt một hoặc nhiều vùng chứa đang hoạt động |
load | Tải hình ảnh từ tar hoặc STDIN |
login | Đăng nhập vào Docker |
logout | Đăng xuất khỏi Docker |
logs | Tìm nạp nhật ký của một vùng chứa |
pause | Tạm dừng tất cả các quy trình đang hoạt động trong vùng chứa |
port | Liệt kê các ánh xạ cổng hoặc một ánh xạ cụ thể cho vùng chứa |
ps | Liệt kê danh sách vùng chứa |
pull | Kéo hình ảnh hoặc kho lưu trữ từ sổ đăng ký |
push | Đẩy hình ảnh hoặc kho lưu trữ vào sổ đăng ký |
rename | Đổi tên vùng chứa |
restart | Khởi động lại một hoặc nhiều vùng chứa |
rm | Xóa một hoặc nhiều vùng chứa |
rmi | Xóa một hoặc nhiều hình ảnh |
save | Lưu một hoặc nhiều hình ảnh vào kho lưu trữ tar ( mặc định sẽ truyền trực tuyến đến STDOUT) |
search | Tìm hình ảnh trong DockerHub |
start | Bắt đầu một hoặc nhiều vùng chứa đã ngừng hoạt động |
stats | Thống kê các luồng sử dụng tài nguyên của vùng chứa |
stop | Dừng một hoặc nhiều vùng chứa đang hoạt động |
tag | Tạo thẻ TARGET_IMAGE gắn thẻ SOURCE_IMAGE |
top | Hiển thị quy trình đang chạy của vùng chứa |
unpause | Hủy tạm dừng tất cả các quy trình trong một hoặc nhiều vùng chứa |
update | Cập nhật cấu hình của một hoặc nhiều vùng chứa |
version | Hiển thị thông tin phiên bản Docker |
wait | Chặn cho đến khi một hoặc nhiều vùng chứa dừng lại, sau đó in ra lệnh thoát của nó |
- Cách xem các tùy chọn có sẵn trong một lệnh con như sau:
{{EJS18}}
- Đây là cách xem thông tin hệ thống của Docker:
{{EJS19}}
Chúng ta hãy cùng khám phá một số lệnh này bằng cách làm việc với docker qua hình ảnh.
Bước 4 – Làm việc với Docker Images
Docker Images là thành phần tạo nên các containers của Docker. Những hình ảnh này được chuyển qua từ Docker Hub, đây là công ty phát hành ra sản phẩm Docker. Việc lưu trữ hình ảnh Docker trên Docker Hub là không giới hạn người dùng, do đó các ứng dụng hay bản phân phối Linux đều có hình ảnh được lưu trữ tại đây.
- Cách kiểm tra xem bạn có thể truy cập và tải hình ảnh của Docker hay không:
{{EJS20}}
- Nếu Docker đang hoạt động, sẽ cho phản hồi như sau:
{{EJS21}}
Lúc này Docker không tìm thấy hình ảnh hello-word
được lưu cục bộ nên nó đã tải hình ảnh từ Docker Hub sau đó hình ảnh được lưu tại containers của Docker. Lúc này các ứng dụng trong containers được thực thì và hiển thị thông báo như phản hồi trên.
Để tìm một hình ảnh có sẵn trên Docker Hub, bạn có thể dùng lệnh con của docker là search. Trong câu lệnh dưới đây, giải sử chúng ta đang tìm hình ảnh Ubuntu:
{{EJS22}}
Docker Hub sẽ trả về danh sách các hình ảnh có tên chứa ký tự được tìm kiếm. Ví dụ sau đây là phản hồi từ câu lệnh trên:
{{EJS23}}
{{EJS24}}
Tại cột Official/ OK
là hình ảnh được hỗ trợ phát triển từ Docker Hub. Để tải xuống hình ảnh mà bạn đã chọn, hãy dùng lệnh con là pull:
- Câu lệnh tải tệp Ubuntu về máy tính như sau:
{{EJS25}}
- Bạn sẽ nhận được kết quả:
{{EJS26}}
Để khởi chạy containers bằng hình ảnh vừa tải xuống, bạn dùng lệnh run. Như ở ví dụ về hình ảnh Hello-word bạn có thể thấy, nếu chạy lệnh run khi hình ảnh chưa được tải xuống thì trước tiên ứng dụng khách của Docker phải tải ảnh xuống và sử dụng nó để tạo containers.
- Lệnh sau dùng để liệt kê các ảnh đã tải xuống:
{{EJS27}}
- Và đây là kết quả:
{{EJS28}}
{{EJS29}}
Ở các phần sau, hình ảnh mà bạn dùng để tạo containers có thể sẽ được thay đổi và được dùng để tạo hình ảnh mới, sau đó sẽ được đẩy lên Docker Hub hoặc Docker.
Tiếp theo là các chạy containers một cách chi tiết.
Bước 5 – Chạy Docker Container
Ở ví dụ về containers, hello-word
bạn đã biết được việc containers chạy và thoát sau khi nhận thông báo kiểm tra. Trên thực thế các containers có rất nhiều lợi ích, nó hoạt động tương tự như máy ảo và thân thiện với tài nguyên hơn.
- Câu lệnh dưới đây là giả sử dụng hình ảnh Ubuntu để chạy containers. Để có quyền truy cập vào shell tương tác containers bạn dùng thêm
-i
và-t
:
{{EJS30}}
- Dấu nhắc lệnh của bạn sẽ thay đổi để phản ánh thực tế là bạn hiện đang làm việc bên trong containers và sẽ có dạng sau:
{{EJS31}}
Hãy ghi nhớ id containers trong dấu nhắc lệnh, để về sau khi bạn muốn xóa containers bạn sẽ cần id
này. Trong ví dụ trên id sẽ là d9b100f2f636
.
Bây giờ bạn có thể chạy bất kỳ lệnh nào bên trong containers. Ví dụ: hãy cập nhật cơ sở dữ liệu gói bên trong containers. Bạn không cần đặt trước bất kỳ lệnh nào sudo, bởi vì bạn đang hoạt động bên trong containers với tư cách là người dùng gốc:
Bây giờ bạn có thể thực thi các lệnh bất kỳ trong containers. Bạn không cần thêm lệnh sudo
vào các câu lệnh vì lúc này bạn đang hoạt động với tư cách là root
.
- Lệnh cập nhật cơ sở dữ liệu trong containers:
{{EJS32}}
- Lệnh cài đặt ứng dụng trong Node.js:
{{EJS33}}
- Khi thực thi câu lệnh trên, Node.js sẽ được cài đặt vào kho lưu trữ chính thức của Ubuntu. Để xác mình xem Node.js đã cài đặt hoàn tất hay chưa, bạn dùng lệnh:
{{EJS34}}
- Nếu đã được cài đặt, phản hồi sẽ cho thấy số phiên bản được cài đặt vào thiết bị đầu cuối của bạn:
{{EJS35}}
Bạn thực hiện bên trong containers nào thì những thay đổi chỉ xảy ra bên trong containers đó.
- Nhập lệnh
exit
để thoát khỏi containers
Tiếp đến là cách quản lý các containers của Docker
Bước 6 – Quản lý Docker Containers
- Sau thời gian dài sử dụng, số lượng containers trong Docker sẽ tăng lên và có cái đang chạy có cái không. Để kiểm tra xem các vùng chức đang hoạt động, bạn dùng lệnh sau:
{{EJS36}}
- Danh sách containers đang hoạt động:
{{EJS37}}
Chúng ta đã đề cập 2 containers trong hướng dẫn là hello-word
và ubuntu
. Tuy nó không còn hoạt động nhưng vẫn tồn tại trong hệ thống.
- Để liệt kê các containers ở tất cả các trạng thái, bạn dùng lệnh sau:
{{EJS38}}
- Kết quả:
{{EJS39}}
- Lệnh này dùng để xem containers mới nhất:
{{EJS40}}
{{EJS41}}
- Để khởi động một containers đã dừng trước đó, hãy dùng lệnh
start
vàid
hoặc tên containers, trong ví dụ này sẽ áp dụng cho Ubuntu bằng id của nó:
{{EJS42}}
- Lúc này containers đã hoạt động trở lại, bạn có thể dùng
ps
để kiểm tra trạng thái:
{{EJS43}}
- Ngược lại, để dừng containers đang hoạt động bạn dùng lệnh
stop
cùng với id hoặc tên containers. Trong ví dụ này sẽ dùng containers với tên làsharp_volhard
{{EJS44}}
- Để xóa containers không dùng đến bạn dùng lệnh
rm
cùng với id hoặc tên của nó. Ví dụ:
{{EJS45}}
Bạn có thể dùng lệnh – để tạo containers mới hoặc dùng –rm
để chuyển thành containers mới khi nó ngừng hoạt động. Để xem thông tin chi tiết về các lệnh khác bạn dùng docker run help
.
Sau đây là cách chuyển containers thành hình ảnh để tạo containers mới.
Bước 7 – Cam kết các thay đổi trong containers thành Docker Image
Với hình ảnh của Docker, bạn có thể thực hiện các thao tác thêm, xóa, sửa tệp như máy ảo, những thay đổi này chỉ xảy ra trong containers đó, nhưng khi bạn chặn hoặc xóa containers bằng lệnh rm thì các thay đổi sẽ không còn.
Dưới đây là cách để lưu trạng thái containers ở dạng hình ảnh.
Ở các bước trước đó bạn đã cài Node.js vào containers của Ubuntu, lúc này bạn có thể chạy containers trên một hình ảnh, nhưng nó lại khác với hình ảnh mà bạn đã tạo ban đầu. Và bạn muốn dùng hình ảnh containers Node.js lúc đầu để làm cơ sở cho các hình ảnh sau này.
- Bạn có thể cam kết các thay đổi của phiên bản hình ảnh bằng lệnh:
{{EJS46}}
Với lệnh -m
sẽ thể hiện cho bạn biết những thay đổi đã được thực hiện và -a
dùng để liệt kê những ai đã thay đổi, container_id
là id containers
, reposity
là tên người dùng Docker Hub mà bạn đã tạo.
Ví dụ:
{{EJS47}}
Khi bạn chạy câu lệnh trên, sẽ có một ảnh mới được lưu trên máy tính cục bộ của bạn. Ở bước 8 bạn sẽ học được cách đẩy ảnh vào kho lưu trữ của Docker Hub để người khác có thể truy cập được.
- Liệt kê các hình ảnh mới của Docker:
{{EJS48}}
- Phản hồi như sau:
{{EJS49}}
Từ kết quả ta có thể thấy, hình ảnh ubuntu-nodejs
là mới nhất, nó được triển khai từ hình ảnh ubuntu của Docker Hub. Nhìn vào kích thước bạn có thể thấy sự khác biệt so với hình ảnh Ubuntu lúc đầu là đã được cài thêm Nodejs. Do đó, nếu bạn muốn sử dụng containers có cài Nodejs thì bạn có thể dùng hình ảnh này.
Tiếp theo là cách để có thể chia sẻ containers cho người dùng khác
Bước 8 – Đẩy Docker Images vào kho lưu trữ Docker
Để có thể tạo hình ảnh mới từ một hình ảnh cơ sở ban đầu, bạn có thể chia sẻ nó cho bạn bè, người dùng Docker Hub, … Để làm điều này bạn cần đẩy hình ảnh lên Docker Hub hoặc cơ quan đăng ký Docker bất kỳ khác. Việc này yêu cầu bạn phải có tài khoản.
Ở đây chúng tôi sẽ hướng dẫn bạn đẩy hình ảnh vào Docker Hub.
- Đầu tiên, cần đăng nhập vào Docker Hub:
{{EJS50}}
- Bạn cần nhập chính xác mật khẩu Docker Hub của mình.
Lưu ý: Nếu tên người dùng Docker của bạn khác với tên người dùng mà bạn tạo hình ảnh. Thì bạn cần gắn hình ảnh của mình bằng tên người dùng Docker.
Bạn sẽ nhập nó ở bước cuối cùng của ví dụ:
{{EJS51}}
- Tiếp theo, dùng lệnh sau để đẩy hình ảnh:
{{EJS52}}
- Lệnh sau dùng để đảnh hình ảnh ubuntu-nodejs vào sammy:
{{EJS53}}
- Sẽ mất vài phút để tải ảnh lên, sau khi hoàn tất kết quả sẽ như sau:
{{EJS54}}
- Sau khi hình ảnh được đẩy thành công, nó sẽ được hiển thị trong tài khoản của bạn như hình minh họa:
- Nếu trong quá trình đẩy hình ảnh bạn gặp lỗi này, nguyên nhân có thể do bạn không đăng nhập:
{{EJS55}}
- Hãy dùng lệnh
docker login
sau đó thực hiện lại quá trình đẩy. - Sau khi hoàn tất thì kiểm tra xem hình ảnh đã được đẩy lên Docker Hub của bạn hay chưa.
- Lúc này hãy thử kéo hình ảnh sang thiết bị mới và bắt đầu tạo một containers mới từ nó bằng lệnh
docker pull sammy/ubuntu-nodejs
Tổng kết về cách cài đặt và sử dụng Docker
Hướng dẫn trên đã giúp bạn cài đặt Docker, cách làm việc với hình ảnh và containers của nó, đồng thời cũng biết cách sửa đổi containers bằng cách đẩy ảnh lên Docker Hub. Hy vọng bài viết mang đến có các bạn một trải nghiệm hữu ích.
Nếu bạn bất cứ câu hỏi nào liên quan đến cách cài đặt và sử dụng Docker, hãy để lại ở bên bình luận bên dưới, BKHOST sẽ trả lời bạn trong thời gian sớm nhất.
P/s: Bạn cũng có thể truy cập vào Blog của BKHOST để đọc thêm các bài viết chia sẻ kiến thức về lập trình, quản trị mạng, website, domain, hosting, vps, server, email,… Chúc bạn thành công.