# Docker là gì? Container, image, Compose, giá Docker Desktop và những lưu ý an toàn khi chạy trên VPS

URL: https://opcaios.org/blog/docker-la-gi
Ngày: 2026-11-03
Cập nhật: 2026-10-25
Tác giả: Lê Quốc Nghĩa
Chuyên mục: Hướng dẫn

Docker là gì? Docker là nền tảng mở để phát triển, đóng gói và chạy ứng dụng trong các môi trường cô lập lỏng gọi là container. Theo tài liệu chính thức của Docker, container nhẹ và chứa mọi thứ ứng dụng cần để chạy nên không phụ thuộc vào những gì cài sẵn trên máy chủ; bạn chia sẻ container cho đồng nghiệp và chắc rằng họ nhận được đúng môi trường chạy giống hệt. Bài này giải thích Docker là gì, container khác máy ảo ra sao, image và Compose dùng để làm gì, cách giữ dữ liệu, các điểm bảo mật dễ sai (cổng công bố, quyền root, giới hạn tài nguyên), giá của Docker Desktop theo điều khoản hiện hành, và kinh nghiệm thật của OPCAIOS khi chạy Docker trên VPS.

![Sơ đồ Docker: image gồm các lớp, container là tiến trình cô lập, volume giữ dữ liệu, Compose điều phối nhiều dịch vụ, cổng công bố và các lưu ý bảo mật](https://opcaios.org/images/blog/docker-la-gi/so-do.webp)
*Image được dựng từ các lớp bất biến; container chạy từ image; volume giữ dữ liệu; Compose nối nhiều dịch vụ. Sơ đồ: OPCAIOS.*

## Container là gì và khác máy ảo thế nào?

Container là tiến trình cô lập cho từng thành phần của ứng dụng, còn máy ảo (VM) là cả một hệ điều hành riêng. Ví dụ, với một ứng dụng gồm giao diện React, API Python và cơ sở dữ liệu PostgreSQL, theo Docker (đọc ngày 23/10/2026) mỗi thành phần chạy trong container riêng, thay vì cài Node, Python và PostgreSQL lên máy rồi lo lệch phiên bản giữa lập trình viên, bộ kiểm thử CI/CD và môi trường thật. Bằng Docker, bốn đặc điểm của container là:

1. Tự chứa: đủ mọi thứ cần thiết để chạy.
2. Cô lập: ít ảnh hưởng tới máy chủ và container khác.
3. Độc lập: xoá một container không ảnh hưởng container khác.
4. Di động: chạy giống nhau trên máy phát triển, trung tâm dữ liệu hay đám mây.

VM gồm nhân (kernel), trình điều khiển phần cứng, chương trình và ứng dụng riêng, nên bật một VM chỉ để cô lập một ứng dụng là tốn kém; container chỉ là một tiến trình kèm các tệp cần dùng. Ngoài ra, về VPS (bản thân là máy ảo), xem [VPS là gì?](/blog/vps-la-gi).

## Image là gì?

Image (ảnh container) là gói chuẩn gồm các tệp, chương trình, thư viện và cấu hình để chạy container. Theo tài liệu Docker (đọc ngày 23/10/2026), image tuân theo hai nguyên tắc (theo Docker):

1. **Bất biến:** tạo xong không sửa được, chỉ có thể tạo bản mới hoặc thêm lớp lên trên.
2. **Gồm các lớp:** mỗi lớp là một nhóm thay đổi trên hệ tệp.

Sau đó, bạn bắt đầu từ image sẵn có, ví dụ image Python, rồi thêm lớp cài thư viện và mã của mình. Docker Hub là kho mặc định để lưu và phân phối image; tài liệu của Docker ghi có hơn 100.000 image, trong đó có các image được Docker hỗ trợ và xác nhận (Docker Trusted Content). Ví dụ, lệnh `docker run nginx` kéo image nginx từ Docker Hub về rồi chạy thành container. Khi dựng image bằng Dockerfile, hãy dùng bản chính thức làm nền và ghim phiên bản để bản dựng lặp lại được.

## Docker Compose dùng để làm gì?

Compose là công cụ của Docker để định nghĩa và chạy ứng dụng nhiều container. Theo Docker (đọc ngày 23/10/2026) bạn mô tả các dịch vụ, mạng và volume trong một tệp YAML, rồi một lệnh duy nhất tạo và khởi động tất cả. Đầu tiên, Compose có lệnh khởi động, dừng, dựng lại, xem trạng thái và xem nhật ký của cả hệ thống, và dùng được cho môi trường phát triển, thử nghiệm, tiền sản xuất, sản xuất và cả CI. Tiếp theo là ví dụ bằng Compose, trong đó một cơ sở dữ liệu PostgreSQL có thể chỉ nghe trên máy chủ và có volume giữ dữ liệu:

```yaml
services:
  db:
    image: postgres:16          # ghim phiên bản, không dùng "latest"
    environment:
      POSTGRES_PASSWORD_FILE: /run/secrets/db_password
    ports:
      - "127.0.0.1:5432:5432"   # chỉ máy chủ truy cập được
    volumes:
      - dbdata:/var/lib/postgresql/data
    secrets:
      - db_password
volumes:
  dbdata:
secrets:
  db_password:
    file: ./db_password.txt     # tệp này không đưa vào Git
```

## Dữ liệu trong container có mất khi xoá container không?

Có, dữ liệu mất khi xoá container trừ khi bạn dùng volume. Volume là cơ chế lưu trữ giữ dữ liệu vượt quá vòng đời của một container; theo Docker (đọc ngày 23/10/2026), hãy hình dung như một lối tắt nối từ trong container ra ngoài. Ví dụ khi khởi động lại một container PostgreSQL, bạn không muốn bắt đầu với cơ sở dữ liệu rỗng. Có ba bước giữ dữ liệu an toàn:

1. Gắn volume cho mọi thư mục dữ liệu quan trọng, như `dbdata:/var/lib/postgresql/data` trong tệp Compose ở trên.
2. Đừng coi volume là bản sao lưu, vì volume nằm trên cùng máy chủ với container.
3. Cuối cùng, sao lưu ngoài máy theo lịch, như hướng dẫn trong [VPS là gì?](/blog/vps-la-gi), và thử khôi phục ít nhất 1 lần mỗi năm.

## Công bố cổng của container có an toàn không?

Chỉ an toàn khi bạn giới hạn địa chỉ. Theo tài liệu về công bố cổng, mặc định Docker chặn truy cập vào các cổng chưa được công bố; còn khi bạn công bố một cổng (ví dụ `docker run -p 8080:80`), cổng đó được ánh xạ trên mọi địa chỉ của máy chủ nên có thể truy cập từ cả thế giới bên ngoài. Nếu thêm địa chỉ cục bộ vào cờ công bố (`-p 127.0.0.1:8080:80`) thì chỉ chính máy chủ truy cập được. Tài liệu cảnh báo thêm: ở các bản cũ hơn 28.0.0, các máy cùng đoạn mạng L2 vẫn có thể chạm tới cổng công bố trên localhost.

Điều dễ sai nhất: Docker và tường lửa UFW không tương thích; khi công bố cổng, lưu lượng bị chuyển hướng trước khi qua luật UFW nên luật của bạn có thể bị bỏ qua (xem tài liệu Docker "Docker and ufw"). Cách tốt: chỉ công bố vào 127.0.0.1, đặt dịch vụ sau nginx và kiểm soát qua chuỗi `DOCKER-USER`.

## Rủi ro bảo mật của Docker là gì?

Rủi ro lớn nhất của Docker là tiến trình nền cần quyền root, thể hiện rõ khi dùng Docker trên VPS dùng chung. Cũng theo Docker (đọc ngày 23/10/2026) trừ khi bạn chọn chế độ rootless, daemon chạy với quyền root nên chỉ người dùng đáng tin mới được điều khiển; Docker cho phép chia sẻ thư mục của máy chủ vào container mà không giới hạn quyền, nghĩa là có thể khởi động container gắn cả thư mục gốc rồi sửa hệ tệp tuỳ ý. Ngoài ra, có năm việc nên làm (theo Docker):

1. Không cho người dùng bình thường vào nhóm điều khiển Docker.
2. Trong Dockerfile, dùng `USER` để chuyển sang người dùng không phải root nếu dịch vụ không cần đặc quyền.
3. Không đưa bí mật vào biến môi trường của image: đặt bằng `ENV` rồi `unset` ở lớp khác vẫn còn giá trị trong image, nên hãy dùng cơ chế secret.
4. Chỉ kéo image từ nguồn đáng tin, như Docker Trusted Content.
5. Đặt giới hạn bộ nhớ và CPU bằng cờ của `docker run`, vì mặc định một container không bị giới hạn và một dịch vụ lỗi có thể làm sập cả VPS dùng chung.

## Xây image tốt như thế nào?

Theo tài liệu thực hành tốt nhất của Docker: dùng xây dựng nhiều giai đoạn (multi-stage) để image cuối chỉ chứa tệp cần chạy và nhỏ hơn; dùng `.dockerignore` (cú pháp giống `.gitignore`) để loại tệp không liên quan khỏi bối cảnh dựng; cân nhắc ghim phiên bản của image nền thay vì dùng thẻ trôi nổi; dùng `docker build --pull --no-cache` khi muốn bản dựng mới hoàn toàn; và chuyển sang người dùng không phải root bằng `USER`.

## Docker Desktop có miễn phí không?

Docker Desktop miễn phí cho một số trường hợp và trả phí cho phần còn lại. Theo Docker, qua trang điều khoản chính thức (kiểm tra ngày 23/10/2026) có hai nhóm (theo Docker):

1. **Miễn phí:** doanh nghiệp nhỏ dưới 250 nhân viên và doanh thu dưới $10 triệu mỗi năm, dùng cá nhân, giáo dục và dự án mã nguồn mở phi thương mại.
2. **Cần gói trả phí (Pro, Team, Business):** việc dùng chuyên nghiệp ở tổ chức lớn hơn, cơ quan chính phủ và các trường hợp thương mại vượt ngưỡng miễn phí.

Ngoài ra, điều khoản nói về Docker Desktop, ứng dụng cho máy cá nhân, không phải Docker Engine chạy trên máy chủ Linux. Ví dụ giả định: một công ty 30 nhân viên với doanh thu vài trăm nghìn USD một năm nằm dưới cả hai ngưỡng, còn tập đoàn 500 nhân viên cần gói trả phí. Giá cụ thể của các gói Docker không được nêu ở đây; hãy đọc kỹ điều khoản và câu hỏi thường gặp của Docker nếu tổ chức bạn gần ngưỡng.

## Kinh nghiệm của OPCAIOS khi dùng Docker

Chúng tôi dùng Docker có chọn lọc. Website opcaios.org chạy trực tiếp bằng trình quản lý tiến trình sau nginx, không đóng gói bằng Docker; còn Docker xuất hiện ở những nơi cần dựng nhanh một hệ thống có sẵn: Supabase tự lưu trữ (gồm cơ sở dữ liệu, xác thực, lưu trữ, hàm biên) chạy bằng Docker Compose (xem [Supabase là gì?](/blog/supabase-la-gi)), dịch vụ nhúng văn bản cho tìm kiếm ngữ nghĩa chạy trong một container chỉ nghe nội bộ (xem [RAG là gì?](/blog/rag-la-gi)), và cơ sở dữ liệu thử nghiệm trên máy cá nhân cũng chạy trong container. Bài học đắt giá nhất là tường lửa: tập lệnh tường lửa trên VPS của chúng tôi chặn cổng container qua chuỗi `DOCKER-USER`, và các công cụ quản trị chạy bằng Docker chỉ truy cập qua đường hầm SSH sau khi các cổng quản trị công khai bị đóng ở lần rà soát an ninh. Chúng tôi không công bố tên container, cổng hay cấu hình cụ thể.

## Khi nào nên và không nên dùng Docker?

Nên dùng khi cần môi trường nhất quán giữa các máy, chạy nhiều dịch vụ phụ thuộc nhau (cơ sở dữ liệu, hàng đợi), hoặc triển khai phần mềm có sẵn image. Cân nhắc kỹ khi ứng dụng đơn giản (một tiến trình Node.js) và bạn đã có quy trình triển khai ổn định, vì Docker thêm một lớp cần học, cần cập nhật image và cần bảo mật. Nếu để AI agent viết Dockerfile hay Compose, hãy đọc lại phần cổng, quyền và bí mật; xem [Vibe coding là gì?](/blog/vibe-code-la-gi).

## Bắt đầu với Docker như thế nào?

1. Cài Docker (Docker Desktop trên máy cá nhân, Docker Engine trên Linux) và kiểm tra bản quyền nếu dùng cho công ty.
2. Chạy thử một image có sẵn, ví dụ `docker run -p 127.0.0.1:8080:80 nginx`, rồi mở `localhost:8080`.
3. Viết Dockerfile đơn giản cho ứng dụng của bạn, dùng `.dockerignore` và người dùng không phải root.
4. Dùng Compose để chạy cùng cơ sở dữ liệu, gắn volume cho dữ liệu.
5. Ghim phiên bản image, đặt giới hạn tài nguyên, công bố cổng vào 127.0.0.1.
6. Có sao lưu volume ra ngoài máy và theo dõi cập nhật bảo mật của image nền. Nếu ứng dụng cần nối Git và triển khai tự động, xem [GitHub là gì?](/blog/github-la-gi).

## Câu hỏi thường gặp

### Docker là gì?
Là nền tảng mở để đóng gói và chạy ứng dụng trong container, các môi trường cô lập lỏng chứa mọi thứ ứng dụng cần, chạy giống nhau trên máy cá nhân, máy chủ và đám mây.

### Container khác máy ảo thế nào?
Máy ảo là cả hệ điều hành với nhân riêng; container chỉ là một tiến trình cô lập kèm tệp cần thiết nên nhẹ hơn nhiều. Container dùng chung nhân của máy chủ.

### Docker có miễn phí không?
Docker Desktop miễn phí cho doanh nghiệp nhỏ (dưới 250 nhân viên và dưới 10 triệu USD doanh thu mỗi năm), dùng cá nhân, giáo dục và mã nguồn mở phi thương mại; tổ chức lớn hơn cần gói trả phí. Hãy đọc điều khoản hiện hành.

### Docker có làm hỏng tường lửa UFW không?
Docker và UFW không tương thích: khi công bố cổng, lưu lượng đi qua bảng nat trước các luật UFW nên có thể bị bỏ qua. Hãy công bố cổng vào 127.0.0.1 và kiểm soát bằng chuỗi `DOCKER-USER`.

### Dữ liệu trong container có mất không?
Có nếu bạn xoá container mà không dùng volume. Gắn volume cho dữ liệu quan trọng và vẫn sao lưu ra ngoài máy. Muốn học cách dùng Docker và AI để dựng hạ tầng tự động hoá an toàn, xem [khoá đào tạo ứng dụng AI](/services/dao-tao-ung-dung-ai) của OPCAIOS.

*Nguồn: tài liệu chính thức của Docker (Docker overview, What is a container, What is an image, Compose, Persisting container data, Port publishing, Docker security, Resource constraints, Building best practices, Docker Desktop license agreement), đọc trực tiếp ngày 23/10/2026. Điều khoản và giá có thể thay đổi; giá cụ thể của các gói Docker không được nêu. Kinh nghiệm cấu hình là của OPCAIOS, không nêu chi tiết nhạy cảm.*
