Docker là gì? Tại sao lại sử dụng docker – Bài 1

Trong bài này, mình sẽ giải thích docker là gì và chia sẻ một số kịch bản thực tế để làm rõ vì sao chúng ta nên sử dụng docker container. Qua đó, bạn sẽ hiểu rõ container giúp tiết kiệm chi phí, dễ triển khai và quản lý ứng dụng như thế nào.

Xem thêm:

Cách lệnh cơ bản trong Docker – Bài 2

Cách xoá Container, Image, Volume, Network trong Docker – Bài 3

1. Docker là gì?

Docker là một nền tảng phần mềm mã nguồn mở giúp bạn dễ dàng tạo, triển khai và chạy các ứng dụng bên trong các container.

Container giống như một chiếc hộp đóng gói trọn vẹn ứng dụng và mọi thứ mà nó cần để chạy (code, thư viện, file cấu hình…). Nhờ vậy, ứng dụng chạy trong container sẽ đồng nhất ở mọi môi trường: từ máy cá nhân, đến máy chủ, hay cloud.

2. Vì sao nên dùng Docker?

2.1. Kịch bản 1

Giả sử bạn đang làm việc trong một công ty và có một máy chủ với cấu hình như sau:

  • 10 CPU Core
  • 10GB RAM

Sếp yêu cầu bạn triển khai 100 server Apache, mỗi server chỉ chạy đúng 1 ứng dụng.

Cách làm truyền thống với VM:

Bạn có thể dùng máy ảo (VM) để làm điều này:

  • Mỗi VM chạy 1 Apache Server.
  • Một máy chủ vật lý chứa được khoảng 10 VM (mỗi VM dùng 1 CPU + 1GB RAM).
  • Như vậy để chạy đủ 100 Apache, bạn cần 10 máy chủ vật lý100 VM.

Chi phí:

  • 10 máy chủ vật lý.
  • 100 bản quyền VM (nếu dùng VMware).
  • Tốn RAM, CPU, đĩa.
  • Rất nhiều ngày công (giả sử 1 VM mất 1 ngày setup ⇒ 100 VM = 100 ngày công).

Cách làm với container (Docker):

Vẫn là cấu hình ban đầu: 1 server, 10 CPU, 10GB RAM.

Bạn chỉ cần:

  1. Tạo 1 máy ảo.
  2. Cài Docker lên VM đó.
  3. Tạo 100 container, mỗi container chạy 1 Apache Server.

Chi phí:

  • Chỉ cần 1 server duy nhất.
  • Không cần license VM nhiều.
  • Thời gian triển khai cực nhanh (1 dòng lệnh có thể tạo 100 container chưa tới 5 phút).

Kết luận:

Container giúp bạn:

  • Tiết kiệm chi phí phần cứng.
  • Triển khai nhanh hơn.
  • Không cần quá nhiều license.
  • Dễ dàng scale lên hoặc giảm xuống.

2.2. Kịch bản 2

Giả sử bạn có 2 ứng dụng:

  • Ứng dụng A (Yahoo API) viết bằng Python 2.
  • Ứng dụng B (Google API) viết bằng Python 3.

Vấn đề:

  • Python 2 và Python 3 không tương thích (cách viết print() khác nhau).
  • Nếu dùng VM, bạn phải tạo 2 VM riêng biệt, mỗi VM cài đúng version Python tương ứng.

Nếu có thêm ứng dụng khác (PHP, Java, NodeJS…) thì số lượng VM lại tiếp tục tăng.

Dùng container giải quyết ra sao?

  • Bạn chỉ cần 1 máy chủ, cài Docker.
  • Tạo các container riêng biệt:
    • Container 1: Cài Python 2 + Ứng dụng A
    • Container 2: Cài Python 3 + Ứng dụng B
    • Container 3: Cài PHP + Ứng dụng C…

Ưu điểm:

  • Không bị xung đột version.
  • Các container hoạt động độc lập, không ảnh hưởng lẫn nhau.
  • Tốn ít RAM và ổ cứng hơn so với VM.
  • Scale dễ dàng và linh hoạt hơn rất nhiều.

3. Docker hoạt động như thế nào?

  1. Dockerfile: Bạn mô tả cách build ứng dụng (dùng hình ảnh gốc, cài gói, chép file…).
  2. Image: Từ Dockerfile, bạn tạo ra một image – tức phiên bản đóng gói của app.
  3. Container: Từ image, bạn chạy ứng dụng – mỗi lần chạy là một container.

4. Cài đặt Docker trên Linux

Bước 1: Thiết lập kho lưu trữ (repository) apt của Docker trên Ubuntu. Mở terminal và chạy các lệnh sau.

sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

Bước 2: Cài đặt package Docker

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

5. Tổng kết

Vậy tóm lại, tại sao chúng ta dùng container?

  • Tiết kiệm chi phí: ít phần cứng, ít license.
  • Triển khai nhanh: chỉ vài phút là có thể chạy được cả trăm ứng dụng.
  • Tách biệt môi trường: mỗi ứng dụng chạy riêng biệt trong container.
  • Scalable: dễ dàng tăng/giảm số lượng container khi cần.
  • Không xung đột phiên bản: mỗi container có thể chạy môi trường riêng (Python, PHP…).

Bài viết cùng chủ đề:

Attach và Detach trong Docker – Chạy container foreground hay background? – Bài 4

Cách truy cập container trong Docker để kiểm tra và xử lý sự cố – Bài 5

Docker Registry và Docker Repo – Bài 6

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em