Docker

Các Lệnh Docker Cơ Bản: Hướng Dẫn Thực Hành Chi Tiết Cho Người Mới Bắt Đầu

phongdhphongdh
17 phút đọc
Chia sẻ:
Zalo
Ảnh đại diện bài các lệnh Docker cơ bản - Series Docker cơ bản bài 1 trên phongdinh.info.vn

Sau khi cài Docker xong, câu hỏi tiếp theo của hầu hết mọi người là: bây giờ gõ lệnh gì? Bài viết này sẽ cùng bạn thực hành các lệnh Docker cơ bản nhất — những lệnh bạn sẽ dùng gần như mỗi ngày khi làm việc với container, từ tải image, chạy container, xem log cho đến dọn dẹp hệ thống.

Điểm khác biệt của bài này là mọi lệnh đều được chạy thật trên máy chủ lab với container hello-world và nginx, kèm ảnh chụp kết quả ở từng bước. Bạn chỉ cần mở terminal trên máy đã cài Docker và gõ theo, kết quả sẽ tương tự như trong ảnh.

Điều kiện duy nhất: máy của bạn đã cài xong Docker Engine. Nếu chưa, hãy làm trước bài hướng dẫn cài đặt Docker Engine và plugin Docker Compose. Còn nếu bạn chưa rõ Docker là gì, nên đọc lướt bài Docker là gì? Kiến thức cơ bản về Docker cho người mới bắt đầu để nắm khái niệm trước khi thực hành.

1. Môi trường thực hành trong series Docker này

Toàn bộ series Docker trên blog được thực hành trên một máy chủ lab chạy Ubuntu với Docker Engine bản mới nhất. Các lệnh trong bài đều là lệnh Docker chuẩn, bạn có thể chạy y hệt trên VPS Ubuntu của mình sau khi đã cài Docker và thêm user vào group docker để không phải gõ sudo trước mỗi lệnh.

Có một điểm cần nói trước: trong môi trường lab của series, container demo chạy với chế độ mạng --network host (dùng chung mạng với máy chủ) để việc kiểm tra web server đơn giản hơn. Trên VPS thật, bạn sẽ thường publish cổng bằng cờ -p, ví dụ -p 8080:80. Cú pháp này được giải thích kỹ ở mục 5, còn cơ chế mạng của Docker sẽ có một bài riêng trong series.

Quy ước trong các ảnh chụp: dấu nhắc lệnh có dạng phong@docker-lab:~$, phần bạn cần gõ là nội dung sau dấu $. Tên container và image trong bài được đặt tường minh (ví dụ container tên web) để các lệnh phía sau dễ đọc, đây cũng là thói quen tốt khi bạn quản lý nhiều container.

2. Nhắc nhanh: Image và Container khác nhau thế nào?

Trước khi gõ lệnh, bạn cần phân biệt rõ hai khái niệm xuất hiện trong mọi lệnh Docker. Image là bản đóng gói chỉ đọc (read-only), chứa hệ điều hành rút gọn, thư viện và ứng dụng — giống như một file ISO cài đặt hoặc một “bản mẫu” (template).

Container là một phiên bản đang chạy (hoặc đã dừng) được tạo ra từ image, giống như một máy ảo đã được bật lên từ file ISO đó. Từ một image nginx duy nhất, bạn có thể tạo ra hàng chục container nginx khác nhau, mỗi container có dữ liệu và trạng thái riêng.

Hiểu nôm na theo lập trình: image giống như class, còn container là object được khởi tạo từ class đó. Vì vậy các lệnh Docker cũng tách thành hai nhóm rõ rệt: lệnh thao tác trên image (tải, liệt kê, xóa image) và lệnh thao tác trên container (chạy, dừng, xóa container). Nắm chắc hai khái niệm này, bạn sẽ thấy các lệnh Docker cơ bản ở các mục sau trở nên rất dễ hiểu. Nếu muốn tìm hiểu sâu hơn về kiến trúc Docker, bạn có thể xem lại bài kiến thức cơ bản về Docker đã có trên blog.

3. Tổng hợp các lệnh Docker cơ bản theo nhóm chức năng

Thay vì học thuộc lòng một danh sách dài, chúng ta sẽ chia các lệnh Docker cơ bản thành 5 nhóm theo đúng vòng đời làm việc hằng ngày: (1) Nhóm lệnh Image, (2) Nhóm lệnh chạy Container, (3) Nhóm lệnh theo dõi, (4) Nhóm lệnh tương tác, và (5) Nhóm lệnh điều khiển vòng đời và dọn dẹp.

Đây cũng là thứ tự thực hành trong bài: bạn sẽ tải image nginx, chạy nó thành một web server thật, xem log khi có người truy cập, chui vào bên trong container để kiểm tra, rồi dừng, đổi tên và xóa sạch. Làm xong một vòng này là bạn đã nắm được xương sống của Docker. Danh sách đầy đủ các lệnh kèm tham số có thể tra cứu bất cứ lúc nào tại tài liệu Docker CLI chính thức.

4. Nhóm lệnh Image: pull, images, search và rmi

Mọi container đều bắt đầu từ một image, và nơi chứa image phổ biến nhất là Docker Hub — kho image công cộng của Docker. Lệnh tải image về máy có cú pháp:

docker pull <tên-image>:<tag>

Trong đó tag là phiên bản của image, ví dụ nginx:1.27 hoặc ubuntu:24.04. Nếu bỏ qua tag, Docker tự hiểu là latest. Thực tế nên ghi rõ tag phiên bản khi triển khai thật, vì latest thay đổi theo thời gian và có thể khiến hệ thống của bạn chạy một phiên bản khác hẳn sau vài tháng.

Khi pull, Docker tải image theo từng lớp (layer) — mỗi lớp là một phần của hệ thống file. Cơ chế này giúp tiết kiệm băng thông: nếu máy bạn đã có sẵn một số layer (ví dụ cùng dùng chung nền Ubuntu), Docker chỉ tải những layer còn thiếu.

Để xem các image đang có trên máy, dùng lệnh docker images. Trong ảnh dưới, máy lab đã có sẵn image nginx; sau khi chạy docker pull hello-world để tải thêm image kiểm tra, danh sách có 2 image:

Danh sách image trước và sau khi tải hello-world khi thực hành các lệnh Docker cơ bản

Bảng kết quả gồm các cột: REPOSITORY (tên image), TAG (phiên bản), IMAGE ID (mã định danh rút gọn), CREATED (image được build cách đây bao lâu) và SIZE (dung lượng). Lưu ý hello-world chỉ nặng 25.5 kB vì nó là image tối thiểu dùng để kiểm tra cài đặt, còn nginx đầy đủ nặng 167 MB.

Ngoài ra, lệnh docker search <từ khóa> giúp tìm image ngay trên Docker Hub từ terminal, và docker image ls là cách viết đầy đủ của docker images (từ Docker bản mới, các lệnh được nhóm lại theo dạng docker <đối tượng> <hành động>, ví dụ docker container ls thay cho docker ps). Lệnh xóa image là docker rmi, sẽ được thực hành ở mục dọn dẹp cuối bài.

5. Nhóm lệnh chạy Container: docker run và các cờ quan trọng

docker run là lệnh quan trọng nhất của Docker: nó tạo một container mới từ image và chạy container đó. Nếu image chưa có trên máy, Docker tự động pull về trước — đây là lý do đôi khi gõ docker run lần đầu sẽ phải chờ tải image.

Thử lệnh kinh điển đầu tiên — chạy container từ image hello-world vừa tải ở mục trước, đồng thời đặt tên cho nó bằng cờ --name:

Chạy container đầu tiên bằng lệnh docker run hello-world và xem trạng thái bằng docker ps -a

Thông báo “Hello from Docker!” cho biết Docker Client đã nói chuyện được với Docker daemon, container đã được tạo và chạy thành công. Chú ý ở lệnh docker ps -a phía dưới: container hello có trạng thái Exited (0) — nghĩa là chương trình bên trong đã chạy xong và kết thúc với mã lỗi 0 (thành công), chứ không phải container bị hỏng.

Khác với hello-world chỉ in ra một thông báo rồi thoát, các ứng dụng như web server cần chạy liên tục ở chế độ nền. Đó là lúc bạn dùng thêm các cờ sau của docker run:

  • -d (detach): chạy container ở chế độ nền, terminal được trả lại ngay thay vì bị giữ bởi output của container.
  • --name <tên>: đặt tên cho container để các lệnh sau gọi bằng tên thay vì ID dài ngoằng. Tên phải là duy nhất trên máy.
  • -p <cổng-host>:<cổng-container>: publish cổng của container ra cổng của máy chủ, ví dụ -p 8080:80 nghĩa là truy cập cổng 8080 trên VPS sẽ vào cổng 80 của container.
  • -it: mở phiên tương tác (interactive + terminal ảo), thường dùng khi chạy container để gõ lệnh thử, ví dụ docker run -it ubuntu bash.
  • --rm: tự xóa container ngay khi nó dừng — tiện cho các container chạy thử, khỏi dọn dẹp thủ công.
  • -e <BIẾN>=<giá trị>: truyền biến môi trường vào container, ví dụ mật khẩu database khi chạy MySQL.
  • -v <nguồn>:<đích>: gắn thư mục hoặc volume vào container để dữ liệu không mất khi container bị xóa — chủ đề này có bài riêng về Docker Volume trong series.

Giờ áp dụng để chạy một web server nginx thật ở chế độ nền:

Chạy container nginx ở chế độ nền bằng docker run -d và kiểm tra bằng docker ps

Lệnh chạy thành công sẽ trả về một chuỗi ID đầy đủ của container. Kiểm tra bằng docker ps, container web đang ở trạng thái Up (đang chạy). Cột PORTS trống vì container đang dùng --network host như đã giải thích ở mục 1; nếu bạn chạy trên VPS với -p 8080:80, cột này sẽ hiện dạng 0.0.0.0:8080->80/tcp.

6. Theo dõi Container: docker ps, docker logs và docker stats

docker ps là lệnh bạn sẽ gõ nhiều nhất sau docker run. Mặc định nó chỉ liệt kê các container đang chạy; thêm cờ -a (all) để xem cả container đã dừng — như container hello ở mục 5. Các cột quan trọng gồm CONTAINER ID, IMAGE, COMMAND (lệnh khởi động bên trong container), CREATED, STATUS và NAMES.

Container đang chạy có thực sự hoạt động không? Hãy kiểm tra web server vừa tạo bằng curl, sau đó xem log của container bằng lệnh docker logs:

Kiểm tra web server nginx bằng curl và xem log truy cập bằng lệnh docker logs

Kết quả curl trả về tiêu đề “Welcome to nginx!” — web server đã phục vụ được yêu cầu HTTP. Trong log của container, ngoài các dòng thông báo lúc khởi động của nginx, dòng cuối cùng chính là access log ghi lại lượt truy cập GET / vừa rồi với mã trạng thái 200.

Khi vận hành thật, hai biến thể rất hay dùng của logs là docker logs -f <tên> để xem log theo thời gian thực (giống tail -f, nhấn Ctrl+C để thoát mà container vẫn chạy tiếp) và docker logs --tail 100 <tên> để chỉ xem 100 dòng cuối, tránh bị ngập màn hình với các container chạy lâu ngày.

Cuối cùng, lệnh docker stats cho bạn xem mức dùng CPU, RAM, mạng và ổ đĩa của các container đang chạy theo thời gian thực — rất hữu ích khi cần biết container nào đang “ăn” tài nguyên của VPS. Thêm cờ --no-stream nếu chỉ muốn xem một lần rồi thoát.

7. Tương tác với Container: docker exec và docker inspect

Trong các lệnh Docker cơ bản, docker exec là lệnh bạn sẽ dùng nhiều mỗi khi cần kiểm tra bên trong một container đang chạy — tương đương với việc SSH vào một máy chủ vậy. Cú pháp phổ biến nhất là mở một phiên shell tương tác:

# Mở shell bên trong container web (gõ exit để thoát, container vẫn chạy tiếp)
docker exec -it web sh

# Hoặc chạy một lệnh đơn rồi thoát ngay
docker exec web ls /usr/share/nginx/html
docker exec web nginx -v

Lưu ý quan trọng: thoát khỏi phiên exec không làm container dừng, vì đây chỉ là một tiến trình phụ gắn vào container. Ngược lại, nếu bạn vào container bằng chính tiến trình chính rồi thoát, container sẽ dừng theo. Một thói quen tốt nữa: chỉ dùng exec để kiểm tra, debug — đừng cài thêm phần mềm “thủ công” vào container đang chạy, vì mọi thay đổi sẽ mất khi container được tạo lại từ image.

Khi cần xem cấu hình chi tiết của container (image gốc, biến môi trường, network, thời điểm khởi động…), lệnh docker inspect <tên> sẽ trả về một tài liệu JSON đầy đủ. JSON này khá dài, nên trong thực tế người ta thường kết hợp với cờ -f để trích xuất đúng trường cần xem, và dùng docker ps --format để tùy biến cột hiển thị:

Xem thông tin chi tiết container bằng docker inspect và định dạng cột bằng docker ps --format

8. Điều khiển vòng đời: stop, start, restart và rename

Nhóm lệnh điều khiển vòng đời đúng như tên gọi của chúng: docker stop <tên> dừng một container đang chạy (Docker gửi tín hiệu SIGTERM, chờ mặc định 10 giây để ứng dụng tắt hẳn hoi rồi mới gửi SIGKILL), docker start <tên> chạy lại container đã dừng — giữ nguyên cấu hình và dữ liệu như trước, và docker restart <tên> là tổ hợp của stop + start trong một lệnh.

Dừng container bằng docker stop, xem trạng thái Exited và bật lại bằng docker start

Quan sát cột STATUS trong ảnh: sau khi stop, container web chuyển sang Exited (0) và biến mất khỏi danh sách docker ps (chỉ còn khi xem bằng ps -a); sau khi start, nó quay lại trạng thái Up. Điểm cần nhớ: container đã dừng vẫn chiếm dung lượng ổ đĩa và giữ cấu hình, khác hẳn với việc đã bị xóa.

Một lệnh nhỏ nhưng tiện là docker rename <tên-cũ> <tên-mới> để đổi tên container — hay dùng khi container được tạo vội mà chưa kịp đặt tên tử tế. Trong ảnh dưới, container web được đổi thành web-server, sau đó được dừng và xóa luôn để chuyển sang mục dọn dẹp:

Đổi tên container bằng docker rename và xóa container bằng docker rm

9. Dọn dẹp: xóa Container bằng rm và xóa Image bằng rmi

Xóa container dùng lệnh docker rm <tên>. Docker chỉ cho xóa container đang ở trạng thái dừng; nếu container đang chạy, bạn phải stop trước, hoặc dùng docker rm -f để ép xóa (force) — thao tác này nên cân nhắc trên hệ thống thật vì ứng dụng không được tắt một cách êm ái.

Xóa image dùng docker rmi <tên-image>. Có một quy tắc quan trọng: image đang được bất kỳ container nào tham chiếu (kể cả container đã dừng) thì không xóa được. Ở ảnh cuối của mục trước, container hello đã dừng vẫn còn nằm trong danh sách, nên trình tự đúng là xóa container đó trước, rồi mới xóa image hello-world:

Xóa nốt container đã dừng và xóa image bằng docker rmi, kiểm tra lại bằng docker images

Kết quả trả về gồm hai dòng: Untagged (gỡ nhãn tên:tag khỏi image) và Deleted kèm mã hash (xóa thật các layer của image). Kiểm tra lại bằng docker images, giờ trên máy chỉ còn image nginx. Phân biệt rõ: rm là xóa container, rmi là xóa image — nhầm hai lệnh này là lỗi kinh điển của người mới.

10. Bảng tổng hợp 30 lệnh Docker cơ bản (cheat sheet)

Để tiện tra cứu nhanh về sau, bảng dưới đây tổng hợp lại các lệnh Docker cơ bản đã thực hành trong bài, bổ sung thêm một số lệnh phụ hữu ích. Bạn nên bookmark lại trang này, khi quên chỉ cần mở ra đối chiếu thay vì tìm kiếm lại từ đầu.

LệnhCông dụng
docker pull <image>:<tag>Tải image từ Docker Hub về máy
docker imagesLiệt kê các image đang có trên máy
docker search <từ khóa>Tìm image trên Docker Hub từ terminal
docker run <image>Tạo và chạy container mới từ image
docker run -d --name <tên> <image>Chạy container nền với tên chỉ định
docker run -p <host>:<container> <image>Chạy container và publish cổng ra máy chủ
docker run -it <image> bashChạy container ở chế độ tương tác
docker psLiệt kê container đang chạy
docker ps -aLiệt kê mọi container kể cả đã dừng
docker logs <container>Xem log của container
docker logs -f <container>Theo dõi log theo thời gian thực
docker exec -it <container> shMở shell bên trong container đang chạy
docker exec <container> <lệnh>Chạy một lệnh bên trong container
docker inspect <container>Xem chi tiết cấu hình container dạng JSON
docker statsXem CPU/RAM/mạng của container theo thời gian thực
docker stop <container>Dừng container đang chạy
docker start <container>Chạy lại container đã dừng
docker restart <container>Khởi động lại container
docker pause / unpause <container>Tạm đóng băng / tiếp tục container
docker rename <cũ> <mới>Đổi tên container
docker rm <container>Xóa container đã dừng
docker rm -f <container>Ép xóa container kể cả đang chạy
docker rmi <image>Xóa image khỏi máy
docker tag <gốc> <đích>Gắn thêm tên/tag cho image
docker history <image>Xem lịch sử các layer của image
docker cp <container>:<đường> <đích>Copy file giữa container và máy chủ
docker versionXem phiên bản Docker Client và Server
docker system dfXem dung lượng Docker đang chiếm trên ổ đĩa
docker network lsLiệt kê các network của Docker
docker volume lsLiệt kê các volume của Docker

11. Lỗi thường gặp khi mới làm quen với Docker

Phần lớn lỗi của người mới đều rơi vào vài trường hợp lặp lại dưới đây. Biết trước hiện tượng và cách xử lý sẽ giúp bạn đỡ hoảng khi gặp phải trên VPS thật.

  • Trùng tên container: thông báo dạng “The container name … is already in use”. Nguyên nhân là container cũ cùng tên vẫn còn (dù đã dừng). Xử lý: đổi tên khi chạy mới, hoặc docker rm container cũ trước.
  • Cổng đã bị chiếm: lỗi “port is already allocated” khi dùng -p. Nghĩa là cổng trên máy chủ đã có dịch vụ khác dùng. Xử lý: đổi sang cổng host khác (ví dụ -p 8081:80) hoặc tắt dịch vụ đang chiếm cổng.
  • Xóa image bị chặn: thông báo “image is being used by container”. Như đã thấy ở mục 9, bạn phải xóa hết container đang tham chiếu image đó trước khi docker rmi.
  • Container vừa chạy đã biến mất: kiểm tra bằng docker ps không thấy, nhưng docker ps -a thấy trạng thái Exited. Đây thường không phải lỗi: tiến trình chính trong container đã kết thúc (giống hello-world). Muốn container sống lâu, tiến trình chính phải chạy liên tục như web server.
  • Container Up nhưng không vào được web: lần lượt kiểm tra: đã publish đúng cổng bằng -p chưa, xem docker logs có lỗi không, và tường lửa của VPS đã mở cổng đó chưa.

12. Lời kết

Qua một vòng thực hành đầy đủ — tải image, chạy container, xem log, tương tác, điều khiển vòng đời và dọn dẹp — bạn đã nắm được bộ các lệnh Docker cơ bản quan trọng nhất, đủ để tự quản lý các container đơn giản trên VPS của mình. Hãy chạy lại toàn bộ quy trình này một, hai lần với một image khác (ví dụ httpd hoặc ubuntu) cho thật quen tay.

Ở bài tiếp theo của series, chúng ta sẽ học Dockerfile là gì và cách tự build image đầu tiên — bước chuyển từ “dùng image của người khác” sang “đóng gói ứng dụng của chính mình”. Nếu muốn xem Docker được dùng trong một dự án thật ngay bây giờ, bạn có thể tham khảo bài cài đặt Seafile Server trên Ubuntu với Docker đã có trên blog.

Chia sẻ bài viết này:
Zalo
phongdh

phongdh

Tác giả bài viết • Content Creator

Chào mọi người, mình là Phong - hiện đang công tác tại Phòng Kỹ thuật AZDIGI. Trong quá trình làm việc mình có cơ hội được tiếp xúc với khá nhiều các vấn đề liên quan đến Website/Email/Hosting/VPS/Server, do đó mình viết lại các hướng dẫn này nhằm chia sẻ kiến thức, cũng như tạo một môi trường để chúng ta giao lưu và học hỏi lẫn nhau.

Kết nối:

Bài viết liên quan

Những bài viết bạn có thể quan tâm

Thảo luận 0 bình luận Viết bình luận

Email được bảo mật và không hiển thị công khai.

Chưa có bình luận. Hãy là người mở đầu cuộc trò chuyện.

Zalo