Thinh Nguyen's site
← Back to blog

Technical notes

Docker Cơ Bản: Hiểu Và Sử Dụng Nhanh Chóng

5 min read By Thinh Nguyen

Tìm hiểu Docker là gì và các lệnh cơ bản để bắt đầu làm việc với Docker nhanh chóng.

#docker

Chào các bạn, trong bài viết này chúng ta sẽ cùng tìm hiểu về Docker - một công cụ cực kỳ phổ biến và mạnh mẽ mà bất kỳ lập trình viên nào cũng nên biết, cùng với cách sử dụng các lệnh Docker cơ bản.

Docker là gì?

Docker là một nền tảng mã nguồn mở giúp đơn giản hóa quá trình tạo, triển khai và chạy các ứng dụng bằng cách sử dụng Containers (bộ chứa).

Thay vì phải thiết lập môi trường máy chủ phức tạp với các phụ thuộc (dependencies) rắc rối, Docker cho phép bạn đóng gói ứng dụng và tất cả các thư viện, file cấu hình liên quan vào một Container duy nhất. Nhờ đó, ứng dụng của bạn có thể chạy mượt mà trên bất kỳ máy tính nào có cài đặt Docker, giải quyết triệt để vấn đề “chạy được trên máy tôi nhưng lỗi trên máy bạn”.

Các khái niệm cơ bản

  • Image: Có thể hiểu như một bản thiết kế (template) hay một file gốc chứa hệ điều hành, thư viện và ứng dụng của bạn. Image là read-only (chỉ đọc).
  • Container: Là một phiên bản (instance) đang chạy của một Image. Bạn có thể khởi động, dừng, xóa hoặc tương tác với Container.
  • Dockerfile: Là một file text chứa một loạt các chỉ dẫn để Docker tự động build ra một Image.
  • Docker Hub: Là một kho lưu trữ (registry) công cộng chứa hàng ngàn Images có sẵn (như Node.js, Python, Ubuntu, MySQL,…) để bạn tải về và sử dụng.

Câu Lệnh Tổng Quát Cốt Lõi: Chạy một Image

Trước khi đi vào các tình huống thực tế, hãy nắm vững “công thức” tổng quát của lệnh quan trọng nhất trong Docker: lệnh chạy một image (khởi tạo container).

docker run [OPTIONS] IMAGE_NAME [COMMAND]

Các [OPTIONS] (cờ) phổ biến và quyền lực nhất:

  • -d: Chạy container ngầm (background/detached mode), trả lại terminal cho bạn.
  • -p <port_ngoài>:<port_trong>: Ánh xạ cổng để máy tính của bạn có thể truy cập được ứng dụng bên trong container (vd: -p 8080:80).
  • --name <tên>: Đặt tên cho container cho dễ nhớ và dễ quản lý (vd: --name my-app).
  • -e <biến_môi_trường>: Truyền các biến cấu hình vào trong container (vd: password của database).
  • -v <thư_mục_ngoài>:<thư_mục_trong>: Ánh xạ ổ cứng (volume) để lưu dữ liệu lâu dài, không bị mất khi container bị xóa.

Bây giờ, hãy cùng xem lệnh này và một số lệnh khác giải quyết các bài toán thực tế như thế nào nhé!


Các Use Case Thường Gặp Cùng Lệnh Xử Lý

Dưới đây là những tình huống thực tế (use case) bạn sẽ thường xuyên đối mặt khi làm việc với Docker và cách giải quyết chúng.

Case 1: Chạy thử nhanh một Database (MySQL, Redis) ở local

Tình huống: Bạn đang code một ứng dụng và cần một database MySQL hoặc Redis để kết nối, nhưng bạn không muốn cài đặt rườm rà và làm rác máy tính.

Cách giải quyết: Sử dụng lệnh docker run để kéo image từ Docker Hub và chạy ngay lập tức.

# Chạy một container Redis
docker run --name my-redis -p 6379:6379 -d redis

# Chạy một container MySQL với mật khẩu root
docker run --name my-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -p 3306:3306 -d mysql:8.0

Ghi chú:

  • -p <port-máy-bạn>:<port-container>: Ánh xạ cổng để kết nối từ ngoài vào.
  • -e: Truyền biến môi trường (như mật khẩu).
  • -d: Chạy ngầm (background mode).

Case 2: Truy cập vào bên trong một container đang chạy để debug

Tình huống: Ứng dụng trong container bị lỗi hoặc bạn cần vào trong đó để kiểm tra các file log, xem cấu hình hệ điều hành của container đó.

Cách giải quyết:

  1. Tìm ID hoặc Tên của container đang chạy:
docker ps
  1. Mở một terminal chui vào bên trong container đó bằng docker exec:
docker exec -it <tên_hoặc_id_container> /bin/bash
# (Dùng /bin/sh nếu container dùng HĐH nhẹ như Alpine)

Ghi chú: Cờ -it giúp mở phiên tương tác terminal. Để thoát ra, chỉ cần gõ exit.

Case 3: Xem Log ứng dụng đang chạy trong Container

Tình huống: Bạn đã chạy container ngầm (-d) và bây giờ muốn xem ứng dụng in ra những log gì (có bị lỗi, crash hay không).

Cách giải quyết: Sử dụng lệnh docker logs.

# Xem toàn bộ log
docker logs <tên_hoặc_id_container>

# Xem log trực tiếp (giống như tail -f)
docker logs -f <tên_hoặc_id_container>

# Xem 50 dòng log mới nhất
docker logs --tail 50 -f <tên_hoặc_id_container>

Case 4: Đóng gói (Build) mã nguồn thành Docker Image

Tình huống: Bạn viết xong một ứng dụng (VD: Node.js) và muốn đóng gói nó lại để gửi cho người khác hoặc đem lên server chạy mà không sợ lỗi “lệch môi trường”.

Cách giải quyết:

  1. Tạo một file có tên là Dockerfile trong thư mục code:
FROM node:18-alpine
WORKDIR /app
COPY . .
RUN npm install
CMD ["npm", "start"]
  1. Build code thành image:
docker build -t my-awesome-app:v1.0 .
  1. Chạy image vừa build:
docker run -p 3000:3000 -d my-awesome-app:v1.0

Case 5: Dọn dẹp không gian đĩa (Xóa rác Docker)

Tình huống: Sau một thời gian, ổ cứng của bạn đầy do chứa quá nhiều container đã dừng hoặc image không dùng đến.

Cách giải quyết:

  1. Liệt kê và xóa từng container / image:
# Xem các container đã dừng và xóa chúng
docker ps -a
docker rm <id_container>

# Xóa image không dùng
docker images
docker rmi <tên_image>
  1. Tuyệt chiêu dọn rác nhanh: Lệnh prune dưới đây sẽ tự động xóa tất cả các container đã dừng, network không dùng và dangling images (image thừa) trong một nốt nhạc:
docker system prune -f

Kết luận

Trên đây là những khái niệm và câu lệnh cơ bản nhất để bạn có thể bắt đầu làm quen với Docker. Việc sử dụng Docker sẽ giúp quá trình phát triển ứng dụng của bạn trở nên đồng nhất, dễ dàng chia sẻ và triển khai hơn rất nhiều.

Hy vọng bài viết này hữu ích với bạn. Hẹn gặp lại ở những bài viết tiếp theo!

Tags

#docker