Làm việc với Docker Images
Image là nền tảng của mọi container. Trong phần này, chúng ta sẽ xem cách tạo, quản lý và kiểm tra Docker image bằng các lệnh phổ biến.
docker build
Lệnh docker build là một trong những tính năng được dùng nhiều nhất của Docker. Dù nó thuộc về hệ sinh thái rộng hỗ trợ các trường hợp nâng cao, chúng ta sẽ tập trung vào cách dùng nó để build một image từ Dockerfile đơn giản.
Một Dockerfile là tệp văn bản thuần (không có phần mở rộng) chứa các hướng dẫn từng bước mà Docker dùng để build image. Cách tạo như sau:
- Trong thư mục gốc của ứng dụng, tạo tệp tên
Dockerfilevới nội dung sau:
# syntax=docker/dockerfile:1
FROM node:lts-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]
EXPOSE 3000
Dockerfile này bắt đầu với image nền tảng nhẹ bao gồm Node.js và Yarn. Nó sao chép mã nguồn ứng dụng của bạn vào image, cài đặt dependencies và định nghĩa cách khởi động ứng dụng.
- Bây giờ, build image bằng lệnh sau:
docker build -t getting-started.
Flag -t cho phép bạn gắn tag cho image. Trong trường hợp này, chúng ta đặt tên là getting-started. Dấu . ở cuối cho Docker biết tìm Dockerfile trong thư mục hiện tại.
docker images
Lệnh docker images liệt kê tất cả image top-level của bạn, cùng repository, tag và kích thước. Bạn cũng có thể dùng các bí danh:
docker image listdocker image ls
Cú pháp: docker image ls [OPTIONS] [REPOSITORY[:TAG]]
Lệnh này hỗ trợ nhiều tùy chọn. Ví dụ, để hiển thị tất cả images, bao gồm cả image trung gian, bạn có thể thêm flag -a hoặc --all như sau: docker images -a.
docker rmi <image>
Lệnh docker rmi <image> xóa một hoặc nhiều image khỏi hệ thống. Nếu một image có nhiều tag, chạy lệnh này với tag cụ thể sẽ chỉ xóa tag đó. Nhưng nếu tag là tag duy nhất liên kết với image, cả tag và image sẽ bị xóa.
Bạn cũng có thể dùng một trong các bí danh sau:
docker image removedocker image rm
Cú pháp: docker image rm [OPTIONS] IMAGE [IMAGE...]
Nếu cần xóa image vẫn đang được một container chạy sử dụng, bạn sẽ phải ép bằng cách thêm tùy chọn -f hoặc --force.
Quản lý Docker Container
Chúng ta thường phải quản lý containers — khởi động, dừng, kiểm tra hoặc xóa chúng khi ứng dụng phát triển. Vì vậy, tôi sẽ hướng dẫn bạn các lệnh Docker hữu ích nhất để xử lý containers trong công việc hằng ngày.
docker exec <container> <command>
Lệnh docker exec cho phép bạn chạy một lệnh bên trong container đang chạy mà không cần khởi động lại nó. Nó đặc biệt hữu ích để gỡ lỗi hoặc kiểm tra thủ công bên trong container. Bạn cũng có thể dùng bí danh: docker container exec.
Lệnh chỉ hoạt động nếu tiến trình chính của container (PID 1) đang chạy. Nó không tự động chạy lại nếu container khởi động lại.
Cú pháp: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
Có một số flag tùy chọn bạn có thể sử dụng. Ví dụ, --privileged cấp quyền mở rộng cho lệnh bên trong container. Để xem đầy đủ các tùy chọn, xem tài liệu chính thức.
Đây là ví dụ chạy một lệnh trên container:
docker exec -d mycontainer touch /tmp/execWorks
Lệnh touch tạo một tệp mới /tmp/execWorks bên trong container đang chạy mycontainer, ở chế độ nền.
docker logs <container>
Lệnh docker logs cho phép bạn xem log từ một container cụ thể và hiển thị mọi thứ được in ra standard output và error tại thời điểm thực thi. Bạn cũng có thể dùng bí danh: docker container logs
Cú pháp: docker container logs [OPTIONS] CONTAINER
Có một số tùy chọn hữu ích bạn có thể thêm. Ví dụ:
--detailshiển thị các thuộc tính bổ sung như biến môi trường và nhãn.--untilcho phép bạn lấy log đến một thời điểm cụ thể.docker logs -f --until=2s testtheo dõi đầu ra log của containertestvà dừng sau khi hiển thị hai giây log cuối.
Dưới đây là tất cả tùy chọn có thể dùng với docker logs:

Các tùy chọn cho docker log <container>. Nguồn: Docker docs
docker rm <container>
Lệnh docker rm <container> xóa một hoặc nhiều container khỏi hệ thống. Bạn cũng có thể dùng các bí danh:
docker container removedocker container rm
Cú pháp: docker container rm [OPTIONS] CONTAINER [CONTAINER...]
Lệnh này có một vài flag tùy chọn bạn có thể dùng. Dưới đây là một số:

Các tùy chọn cho docker rm <container>. Nguồn: Docker docs
Ví dụ, bạn có thể dùng docker rm /redis để xóa container được nhận diện bởi liên kết /redis. Tuy nhiên, lưu ý rằng lệnh này chỉ xóa các container đang chạy.
Nếu bạn muốn xóa các container đã dừng, bạn cần dùng docker container prune. Để giữ môi trường sạch, hãy học cách xóa an toàn tài nguyên Docker không dùng đến với hướng dẫn Docker prune này.
docker restart <container>
Lệnh docker restart <container> dừng rồi khởi động lại một hoặc nhiều container. Bạn cũng có thể dùng bí danh: docker container restart.
Cú pháp: docker restart [OPTIONS] CONTAINER [CONTAINER...]
Lệnh restart có một số tùy chọn hữu ích để tùy chỉnh việc khởi động lại container. Dưới đây là cả hai tùy chọn, kèm ví dụ.
|
Tùy chọn |
Mô tả |
Ví dụ |
|
-s, --signal |
Tín hiệu gửi đến container. |
|
|
-t, --timeout |
Số giây chờ trước khi kill container. |
|
> Để thực hành trực quan, khám phá những ý tưởng dự án Docker từ cấp độ mới bắt đầu đến nâng cao.
Docker Networking
Kết nối mạng cho container cho phép giao tiếp giữa các container và khối lượng công việc bên ngoài. Theo mặc định, container được bật networking và có thể tạo kết nối đi, nhưng chúng không tự biết đang ở loại mạng nào hay kết nối với khối lượng công việc nào khác.
Trừ khi bạn dùng driver mạng none (tắt networking), containers có thể tương tác với các thành phần mạng như địa chỉ IP, gateway và DNS.
Hãy khám phá một số lệnh networking của Docker mà bạn có thể dùng.
docker network ls
Lệnh docker network ls liệt kê tất cả mạng mà Docker Engine biết, bao gồm trên nhiều host trong một cụm. Bí danh của nó là: docker network list.
- Đây là cú pháp:
docker network ls [OPTIONS]
Bạn có thể dùng nhiều tùy chọn với lệnh này, như minh họa ở hình dưới:
Theo mặc định, lệnh này hiển thị cho mỗi mạng:
- ID
- Tên
- Driver
- Phạm vi (Scope)
Bạn có thể dùng các flag để tùy chỉnh đầu ra. Ví dụ, flag --no-trunc hiển thị đầy đủ ID mạng thay vì dạng rút gọn. Cách dùng như sau:
docker network ls --no-trunc
docker network create <tên-mạng>
Lệnh docker network create tạo một mạng Docker mới. Theo mặc định, nó dùng driver bridge trừ khi bạn chỉ định driver khác với flag --driver (hoặc -d).
Docker hỗ trợ các driver mạng tích hợp như:
bridgecho mạng đơn host.overlaycho mạng đa host trong chế độ Swarm.
Bạn cũng có thể dùng driver của bên thứ ba hoặc tùy chỉnh nếu cần.
- Đây là cú pháp cơ bản:
docker network create [OPTIONS] NETWORK
Lệnh cung cấp nhiều tùy chọn cho các mục đích khác nhau. Xem tài liệu chính thức để xem danh sách đầy đủ tùy chọn.
Đây là ví dụ tạo mạng bridge:
docker network create -d bridge my-bridge-network
Mạng bridge bị giới hạn trong một Docker Engine, vì vậy sẽ không kết nối containers giữa các host khác nhau.
Khi bật chế độ Swarm, bạn có thể tạo một mạng trải trên nhiều Docker host:
docker network create --scope=swarm --attachable -d overlay my-multihost-network
> Muốn biết Docker khác Kubernetes thế nào? Bài phân tích về Kubernetes vs Docker trình bày các khác biệt chính và trường hợp sử dụng.
Docker Volumes
Docker volume dùng để lưu trữ dữ liệu cần tồn tại lâu dài, ngay cả khi container dừng hoặc bị xóa. Bạn có thể tạo rõ ràng hoặc để Docker tự động tạo khi khởi động container.
Volumes được lưu trên hệ thống host nhưng tách biệt khỏi các tệp lõi của host. Chúng được mount vào containers tương tự bind mounts nhưng có tính di động và bảo mật tốt hơn.
Hãy khám phá một số lệnh volume của Docker liên quan:
docker volume ls
Lệnh docker volume ls liệt kê tất cả volumes mà Docker biết. Bạn cũng có thể dùng bí danh: docker volume list.
- Cú pháp:
docker volume ls [OPTIONS]
Lệnh này hỗ trợ một vài flag tùy chọn giúp bạn lọc hoặc định dạng đầu ra — như dưới đây:

Các tùy chọn cho lệnh docker volume ls. Nguồn: Docker docs
docker volume create <tên-volume>
Lệnh docker volume create tạo một volume mới để lưu trữ dữ liệu bền vững. Nếu bạn không cung cấp tên, Docker sẽ tự động tạo một tên cho bạn.
Việc tạo volumes là bước phổ biến khi bạn muốn dữ liệu tồn tại lâu hơn vòng đời của một container đơn lẻ.
- Đây là cú pháp:
docker volume create [OPTIONS] [VOLUME_NAME]
Hãy xem ví dụ tạo một volume rồi cấu hình container để dùng nó:
docker volume create hello
docker run -d -v hello:/world busybox ls /world
Trong ví dụ này, một volume tên hello được tạo. Sau đó, nó được mount vào container tại đường dẫn /world. Điều này cho phép container ghi hoặc đọc dữ liệu từ volume đó.
Nhiều container có thể dùng chung một volume, hữu ích khi một container cần ghi dữ liệu trong khi container khác đọc.
Lưu ý: Tên volume phải là duy nhất giữa các driver. Bạn không thể dùng cùng một tên volume trên hai storage driver khác nhau.
Các lệnh Docker Compose
Docker Compose giúp quản lý ứng dụng nhiều container dễ dàng bằng một tệp YAML đơn giản. Nó hỗ trợ các môi trường khác nhau như phát triển, kiểm thử, staging, production và CI. Chỉ với một lệnh, bạn có thể điều khiển services, thiết lập networks và quản lý volumes — tất cả tại một nơi.
Hãy khám phá một số lệnh compose phổ biến:
docker-compose up
Lệnh docker compose up build, (tạo lại) tạo, khởi động và attach vào containers cho một service. Nếu containers chưa chạy, lệnh cũng tự động khởi động các service liên kết.
- Đây là cú pháp:
docker compose up [OPTIONS] [SERVICE...]
Theo mặc định, lệnh này gộp đầu ra của tất cả containers. Nếu bạn muốn tập trung vào các service cụ thể, bạn có thể:
- Dùng flag
--attachđể attach vào các service nhất định - Dùng flag
--no-attachđể loại trừ các service khác
Ví dụ, docker compose up --no-attach <service-name> khởi động tất cả services trừ service bạn loại khỏi log.
Khi lệnh kết thúc, containers cũng dừng. Để giữ chúng chạy nền, dùng flag --detach:
docker compose up --detach
Trước khi chạy lệnh này, hãy đảm bảo bạn đã di chuyển (cd) tới thư mục chứa tệp docker-compose.yml.
docker-compose down
Lệnh docker compose down dừng containers và xóa containers, images, networks và volumes được tạo bởi docker compose up.
- Cú pháp:
docker compose down [OPTIONS] [SERVICES]
Bạn có thể dùng nhiều tùy chọn với lệnh này, bao gồm các tùy chọn sau:

Các tùy chọn cho lệnh docker compose down. Nguồn: Docker docs.
Theo mặc định, lệnh xóa các thành phần sau:
- Containers cho các service được định nghĩa trong tệp Compose.
- Networks được định nghĩa trong phần networks của tệp Compose.
- Mạng mặc định, nếu có dùng.
Các thành phần sau không bị xóa theo mặc định:
- Networks và volumes được định nghĩa là external.
- Anonymous volumes, tức các volume không có tên.
Anonymous volumes không được mount tự động khi bạn chạy docker compose up lần nữa vì chúng không có tên. Nếu bạn cần lưu trữ dữ liệu bền vững, tốt hơn nên dùng named volumes hoặc bind mounts.
Thực hành tốt khi dùng các lệnh Docker
Docker là cách mạnh mẽ để build, phân phối và chạy ứng dụng trong containers. Nhưng để dùng tốt và đảm bảo thiết lập hiệu quả, dễ mở rộng, bạn cần tuân theo một số thực hành tốt.
Dùng Docker volumes cho dữ liệu bền vững
Theo mặc định, tệp của container được lưu trong một lớp ghi (writable layer) sẽ mất khi container bị xóa! Lớp này là duy nhất cho mỗi container và không dễ truy cập. Docker dùng các loại mount khác nhau để duy trì dữ liệu, một trong số đó là volumes, do Docker daemon quản lý và lưu trên host.
Volumes cho phép chúng ta:
- Giữ dữ liệu ngay cả sau khi container bị xóa.
- Lưu dữ liệu quan trọng về hiệu năng với tốc độ cấp độ host.
- Quản lý lưu trữ dễ dàng thông qua Docker.
Chúng lý tưởng cho dữ liệu dài hạn hoặc khi nhiều container cần chia sẻ truy cập. Chỉ cần lưu ý rằng nếu bạn cần truy cập tệp trực tiếp từ host, bind mounts có thể phù hợp hơn, vì volumes được Docker quản lý hoàn toàn.
Tự động hóa với Docker Compose
Việc quản lý thủ công nhiều container có thể trở nên quá tải. Docker Compose đơn giản hóa bằng cách cho phép bạn định nghĩa mọi thứ trong một tệp YAML duy nhất để bạn tập trung vào việc xây dựng.
Vì sao đây là thực hành tốt đáng theo:
- Một lệnh đơn giản: Khởi động, dừng, scale hoặc rebuild services của bạn trong một lần.
- Nhất quán cho mọi người: Dù bạn làm ở môi trường phát triển, kiểm thử hay production, Compose giữ các môi trường đồng bộ để tránh vấn đề “chạy ổn trên máy tôi”.
- Networking tích hợp: Compose tạo mạng dùng chung để các service dễ dàng giao tiếp bằng tên service thay vì IP.
- Dễ dàng mở rộng: Bạn có thể nhanh chóng scale services lên/xuống với flag
--scale, rất hữu ích để kiểm thử độ chịu tải khác nhau. - Cấu hình rõ ràng, dễ cộng tác: Toàn bộ thiết lập của bạn, gồm containers, networks và volumes, được quản lý phiên bản và dễ đọc.
Kết luận
Docker có thể ban đầu hơi nhiều, nhưng khi bạn nắm vững các lệnh cốt lõi, nó mở ra rất nhiều khả năng. Từ việc chạy container đầu tiên đến quản lý networks, volumes và services, giờ bạn đã sẵn sàng hơn để tự tin build và vận hành ứng dụng container hóa.
Và nếu bạn muốn tiếp tục học, dưới đây là vài tài nguyên tuyệt vời để khám phá tiếp:
- Containerization and Virtualization Concepts – khóa học hoàn hảo để xây nền tảng khái niệm.
- Introduction to Docker – khóa học thân thiện cho người mới bắt đầu.
- Intermediate Docker – khóa học khi bạn sẵn sàng đi sâu hơn.
- Containerization and Virtualization with Docker and Kubernetes – lộ trình kỹ năng để mở rộng sang Kubernetes và điều phối thực tế.
Câu hỏi thường gặp
Những lệnh Docker nào được dùng nhiều nhất?
Một số lệnh Docker phổ biến nhất gồm docker run, docker ps, docker build, docker pull và docker-compose up.
Docker volumes khác gì với bind mounts?
Docker volume được Docker quản lý và lý tưởng cho tính di động cùng lưu trữ bền vững dữ liệu, trong khi bind mount liên kết tới một đường dẫn tệp cụ thể trên hệ thống host.
Tôi có thể chạy nhiều container chỉ với một lệnh không?
Có, dùng docker-compose up với tệp docker-compose.yml cho phép bạn chạy nhiều service đồng thời.
Sự khác nhau giữa docker start và docker run là gì?
docker run tạo và khởi động một container mới, trong khi docker start khởi động lại một container đã tồn tại và đang dừng.
Làm sao để liệt kê tất cả containers đã dừng?
Dùng docker ps -a để xem tất cả containers, bao gồm cả những cái đã dừng.
Mục đích của lệnh docker exec là gì?
Nó cho phép bạn chạy lệnh bên trong container đang chạy, thường dùng để gỡ lỗi hoặc kiểm tra thủ công.
Docker chỉ dành cho hệ thống dựa trên Linux thôi sao?
Không. Docker cũng hỗ trợ macOS và Windows, sử dụng các máy ảo nhẹ để kích hoạt container hóa.
Lệnh docker-compose down làm gì?
Nó dừng và xóa containers, networks và volumes được tạo bởi docker-compose up.
Làm sao để xóa các Docker image dangling?
Chạy docker image prune để dọn dẹp các image không dùng và giải phóng dung lượng đĩa.
Docker có thể dùng trong môi trường production không?
Chắc chắn rồi. Docker được sử dụng rộng rãi trong production để triển khai ứng dụng có thể mở rộng và tái lập trên đám mây và tại chỗ.
Tôi là một chiến lược gia nội dung, yêu thích việc đơn giản hóa các chủ đề phức tạp. Tôi đã giúp các công ty như Splunk, Hackernoon và Tiiny Host tạo nội dung hấp dẫn và giàu thông tin cho khán giả của họ.

Docker đã trở thành công cụ ưa thích của các nhà phát triển và chuyên gia dữ liệu khi cần build, chia sẻ và chạy ứng dụng nhất quán trên nhiều môi trường. Dù bạn đang khởi tạo containers cho phát triển cục bộ hay triển khai microservices trong môi trường production, việc thành thạo các lệnh Docker là điều cốt yếu.
Trong hướng dẫn này, tôi sẽ dẫn bạn qua 18 lệnh Docker quan trọng—bao quát images, containers, networking, volumes và Compose—giúp tăng tốc quy trình làm việc và khiến việc sử dụng Docker trơn tru, hiệu quả hơn.
Docker là gì?
Docker là một nền tảng để phát triển, phân phối và chạy ứng dụng. Nó cho phép bạn tách ứng dụng khỏi hạ tầng bên dưới, thúc đẩy tốc độ giao hàng phần mềm và quản lý thiết lập theo cùng cách bạn quản lý ứng dụng.
Docker chạy ứng dụng trong các môi trường biệt lập bằng gói nhẹ gọi là container, bao gồm mọi thứ ứng dụng cần để chạy, như dependencies và cài đặt, giúp tiết kiệm tài nguyên hệ thống. Chúng ta có thể dễ dàng chia sẻ containers với đồng đội, chạy đồng thời nhiều container và quản lý tất cả thông qua các công cụ và nền tảng của Docker.
Chúng ta có thể dùng Docker cho nhiều mục đích, bao gồm:
Khi dùng Docker, chúng ta làm việc với các đối tượng Docker khác nhau như image, container, network, plugin và volume. Đây là các khối xây dựng của thiết lập Docker. Ở tầng nền, Docker dùng các tính năng của nhân Linux để mọi thứ hoạt động. Chúng ta tương tác bằng các lệnh đơn giản trong terminal, và mọi lệnh Docker đều bắt đầu với
docker.> Nếu bạn mới bắt đầu, khóa Introduction to Docker khóa cung cấp nền tảng thực hành để học các kiến thức cơ bản về container hóa.
Các lệnh Docker cơ bản
Giờ bạn đã biết Docker là gì và cách hoạt động, hãy xem một số lệnh phổ biến nhất. Chúng sẽ giúp bạn build, chạy và quản lý containers trong công việc hằng ngày.
docker --version và docker info
Trong các lệnh Docker, bất cứ thứ gì bắt đầu bằng
--được gọi là flag.Ví dụ,
--versionlà một flag cho biết phiên bản Docker CLI bạn đang dùng. Bạn cũng có thể dùngdocker version(không có flag) để nhận thông tin chi tiết phiên bản của tất cả thành phần Docker.Kết quả đầu ra được chia thành hai phần:
Bạn cũng có thể định dạng đầu ra này bằng flag
--formatvới một template tùy chỉnh.Lệnh
docker infocho bạn cái nhìn tổng quan đầy đủ về thiết lập Docker. Nó tương đương chạydocker system infonhưng tên ngắn hơn. Bạn sẽ thấy các thông tin như phiên bản kernel, số lượng containers và images, cùng các chi tiết toàn hệ thống khác.Tùy theo storage driver của bạn, bạn cũng có thể thấy thông tin như tên pool và tệp dữ liệu. Giống
docker version, bạn có thể định dạng đầu ra bằng--formathoặc-f.docker pull <image>
Lệnh pull tải xuống một Docker image từ registry, thường là Docker Hub, một thư viện công khai của các image dựng sẵn bạn có thể dùng mà không cần tự thiết lập. Bạn có thể chạy ở dạng
docker pull <image>hoặcdocker pull, cả hai đều làm cùng một việc.docker image pull [OPTIONS] NAME[:TAG|@DIGEST]Nếu bạn không chỉ định tag, Docker sẽ dùng mặc định
:latest. Ví dụ:docker image pull debiankéo imagedebian:latest.Bạn cũng có thể thêm các tùy chọn sau lệnh để tùy chỉnh cách kéo image, như giới hạn băng thông hoặc bỏ qua xác minh image. Hình dưới cho thấy tất cả tùy chọn có sẵn và chức năng của chúng.
Các tùy chọn cho lệnh docker pull. Nguồn: Docker docs
docker run <image>
Lệnh
docker run <image>tạo và khởi động một container mới từ image chỉ định, nghĩa là chạy image trong một container mới tinh. Đây là viết tắt củadocker container run, và cả hai hoạt động giống nhau.docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]Nếu bạn đã chạy một container và muốn khởi động lại với toàn bộ thay đổi trước đó, dùng:
docker start <container>.Lệnh run có rất nhiều tùy chọn để tùy biến cách container chạy. Chúng ta sẽ đi qua một vài tùy chọn phổ biến kèm ví dụ:
Flag
Ví dụ lệnh
Mô tả
-- namedocker run --name test -d nginx:alpineĐặt định danh tùy chỉnh cho container tên test sử dụng image
nginx:alpine.-w,--workdirdocker run -w /path/to/dir/ -i -t ubuntu pwdChạy lệnh được thực thi bên trong thư mục chỉ định, trong ví dụ này là
/path/to/dir/--piddocker run --rm -it --pid=host alpineTheo mặc định, tất cả containers có PID namespace được bật, cung cấp sự tách biệt tiến trình.
Ví dụ chạy một container alpine với tùy chọn
--pid = host.--cidfiledocker run --cidfile /tmp/docker_test.cid ubuntu echo "test"Tạo một container và in một chuỗi test ra console
Flag
cidfilekhiến Docker cố gắng tạo một tệp mới và ghi ID container vào đó.docker stop <container> và docker start <container>:
Lệnh
docker start <container>khởi động một hoặc nhiều container đã dừng. Ví dụ, trongdocker start my_container,my_containerlà tên container chúng ta muốn khởi động. Ta cũng có thể dùng bí danh:docker container start.docker container start [OPTIONS] CONTAINER [CONTAINER...]Tương tự,
docker stopdừng một hoặc nhiều container đang chạy. Ví dụ, trongdocker stop my_container,my_containerlà tên một container đang chạy.Nó cũng có bí danh:
docker container stop.docker container stop [OPTIONS] CONTAINER [CONTAINER...]Giống như
start, lệnhstopcó các tùy chọn để tùy chỉnh cách dừng containers. Chúng ta sẽ nêu một vài tùy chọn hữu ích tiếp theo:Các tùy chọn cho
docker stop. Nguồn: Docker docs