Đừng sợ Docker! Hiểu bản chất và cách hoạt động chỉ trong 5 phút
Mở đầu
Có bao giờ bạn tự hỏi: “Tại sao code trên máy mình chạy được mà máy bạn lại chạy lỗi?”. Đó là một trong những vấn đề điển hình trong giới lập trình.
Code chạy mượt trên máy này, nhưng khi chạy sang máy khác hoặc deploy lên server lại lỗi. Lỗi bắt nguồn từ lệch phiên bản Node.js, thiếu biến môi trường, thiếu thư viện hệ thống, khác phiên bản OS…
Và Docker xuất hiện để giải quyết vấn đề về “lệch môi trường” này. Trong nội dung dưới đây, mình sẽ tổng hợp lại các khái niệm và thành phần chính trong Docker để các bạn có thể hiểu rõ hơn về công nghệ này.
Docker là gì?
Để dễ hình dung, bạn thử tưởng tượng Docker như một ngành vận tải biển, hàng hóa là source code và tàu hàng là máy tính. Ngày trước chưa có thùng container, các hàng hóa đều xếp lẫn lộn lên nhau trên một tàu hàng nên rất dễ hỏng và khó bảo quản. Từ khi container chuẩn hóa ra đời, tàu chở hàng nào cũng chở được, hàng hóa được bảo quản riêng biệt trong mỗi container nên giảm rủi ro mất mát, hư hỏng hơn.

Dưới góc độ phần mềm, Docker là một nền tảng cho phép đóng gói ứng dụng và tất cả các thành phần phụ thuộc (code, runtime, thư viện,…) vào một “container” độc lập để có thể mang container đó chạy trên bất kỳ máy tính nào.
3 thành phần chính trong kiến trúc của Docker

- Docker client (Nơi điều hành): Đây là giao diện để bạn tương tác với Docker. Khi bạn gõ các câu lệnh như
docker run,docker buildtrên máy tính, bạn chính là Docker Client. - Docker host (Nơi thực thi): Đây là nơi thực sự “lao động”. Bên trong Host có một thành phần cốt lõi tên là Docker daemon (chạy ngầm). Nó liên tục “lắng nghe” các câu lệnh từ Docker Client gửi xuống để trực tiếp quản lý, tạo ra và vận hành các đối tượng như Image, Container, Network (mạng kết nối) và Volume (vùng lưu trữ).
- Docker registry (Kho chứa): Đây là nơi lưu trữ và phân phối các Docker Image (các gói môi trường đóng sẵn). Docker Hub chính là cái “chợ đầu mối” công cộng lớn nhất thế giới của Registry mà ai cũng có thể lên đó tải Image về hoặc up Image của mình lên.
Các khái niệm trong Docker

Dockerfile
Dockerfile giống như bản thiết kế, là một file văn bản chứa các dòng lệnh hướng dẫn các bước để build ra một ứng dụng. Ví dụ: Bước 1 dùng hệ điều hành, môi trường gì, bước 2 cài đặt gì… giống như đoạn code minh họa dưới đây.
FROM python:3.13 WORKDIR /usr/local/app # Install the application dependencies COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt # Copy in the source code COPY src ./src EXPOSE 8080 # Setup an app user so the container doesn't run as the root user RUN useradd app USER app CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8080"]
Image
Docker Image giống như thùng hàng được đóng gói sẵn, là một file tĩnh được tạo ra sau khi build Dockerfile. Bên trong chứa toàn bộ code và môi trường, mang tính bất biến, không thể thay đổi dữ liệu (Immutable), giống như một đĩa game CD đúc sẵn.
Có thể, nhiều bạn sẽ dễ liên tưởng Docker Image giống với file Ghost trên Windows, nhưng thực tế nó lại khác nhau về cách hoạt động.
File Ghost đóng gói các ứng dụng, bao gồm cả kernel và hệ thống của Windows trong 1 file nên khá nặng (lên đến vài GB), cồng kềnh và dễ lỗi “màn hình xanh lè” nếu phần cứng không tương thích. Khi chạy Ghost bung ra toàn bộ ổ cứng, ghi đè OS cũ và không thể chạy nhiều file Ghost cùng một lúc.
Với Docker Image thì khác, Image chỉ chứa các thư viện cần thiết, ứng dụng đã đóng gói và dùng nhân Kernel với máy chủ nên khá nhẹ (chỉ từ vài MB). Image có thể chạy thành nhiều Container biệt lập song song cùng lúc trên cùng một máy tính mà không sợ bị xung đột và chạy được trên mọi phần cứng (miễn là có cài Docker) mà không lo về tính tương thích và môi trường.
Container
Docker Container là một thực thể hoạt động, được tạo ra khi Run (chạy) một Image. Nếu Image là đĩa game thì Container giống như trò game đang được bật lên để chơi. Đó là một môi trường ảo chạy biệt lập với hệ điều hành máy tính.
Bạn có thể bật nhiều Container từ cùng 1 Image trên một máy chủ mà không sợ chúng xung đột với nhau vì mỗi Container là một môi trường biệt lập và dùng chung nhân (Kernel) của máy chủ.
Lưu ý, nếu bạn xóa Image thì Container sẽ bị lỗi và không thể khởi chạy được do không thể tìm thấy Image để nạp lại các thư viện hệ thống.
Volume
Nếu Container giống như một trò game đang chơi thì Docker Volume chính là bộ nhớ của của game đó.
Mặc định, khi một Container bị xóa đi, toàn bộ dữ liệu sinh ra trong quá trình nó hoạt động cũng sẽ mất đi. Để giải quyết vấn đề này, Volume xuất hiện như một “thẻ nhớ gắn ngoài” giúp lưu trữ dữ liệu bền vững (Persistent Data) từ Container xuống ổ cứng máy tính của bạn. Nhờ đó khi tắt hay xóa Container, dữ liệu (Database) hay các file cấu hình của bạn vẫn an toàn và không bị mất.
Compose
Nếu Container là thùng hàng riêng lẻ thì Docker Compose giống như người điều phối cả một đoàn tàu chở hàng.
Trong thực tế, một ứng dụng có thể cần nhiều hơn một Container để hoạt động. Ví dụ để một website hoạt động, bạn cần một Container chạy mã nguồn (Node.js/Python), một Container khác chạy cơ sở dữ liệu (MySQL/PostgreSQL) và một Container làm bộ nhớ đệm (Redis). Nếu dùng lệnh docker run thông thường, bạn sẽ phải gõ từng lệnh một để bật từng Container lên, rất tốn thời gian và dễ nhầm lẫn.
Docker Compose sinh ra để giải quyết việc này. Bạn chỉ cần định nghĩa tất cả các Container trong một file cấu hình duy nhất docker-compose.yml và gõ lệnh docker-compose up. Ngay lập tức các Container sẽ tự động bật lên, tự kết nối với nhau và phối hợp chạy nhịp nhàng theo một dây chuyền được lập trình sẵn.

Hub
Docker Hub giống như chợ ứng dụng, nơi lưu trữ và phân phối các Image. Tại đây, mọi người có thể chia sẻ các Image có sẵn như Image của Node.js, MySQL, Ubuntu… Bạn có thể tải về và sử dụng Image trên máy tính của mình nhanh chóng mà không phải tốn công cài đặt từ đầu.
Lời kết
Qua bài viết, chúng ta đã cùng tìm hiểu các khái niệm trong Docker. Bạn có thể thấy Docker không hề khó, nó chỉ giúp chúng ta thay đổi cách tư duy quản lý môi trường code, giúp bạn gom tất cả mọi thứ vào một “thùng container” (Image) và tự tin mang đi chiến đấu ở bất kỳ môi trường nào.
Trong bài viết tiếp theo, mình sẽ cùng tìm hiểu các bước để có thể tự build Dockerfile và sử dụng thực tế để quy trình lập trình trở nên chuyên nghiệp hơn nhé! 😎
