Docker là gì: Container hóa ứng dụng và cách chạy dịch vụ

Sơ đồ kiến trúc Docker gồm Docker client, Docker daemon, images và container

Docker là công nghệ container hóa ứng dụng, cho phép đóng gói phần mềm cùng toàn bộ phụ thuộc vào một đơn vị độc lập gọi là container. Nhờ vậy, cùng một ứng dụng chạy giống nhau trên máy lập trình viên, máy chủ staging lẫn production, mà không cần cài đặt lại thủ công từng thư viện.

Docker ra đời từ năm 2013 và nhanh chóng trở thành công cụ chuẩn trong ngành phần mềm. Điểm mạnh của nó nằm ở khả năng cô lập tài nguyên, triển khai tính bằng giây và mức hiệu suất cao hơn hẳn máy ảo truyền thống.

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

Docker Engine gồm ba thành phần chính: Docker client là công cụ dòng lệnh bạn gõ, Docker daemon (tên tiến trình là dockerd) chịu trách nhiệm tạo và quản lý container, còn registry là kho lưu trữ image. Khi bạn chạy lệnh docker run nginx, daemon sẽ tải image nginx về máy, tạo một container từ image đó và khởi động tiến trình nginx bên trong.

Ba khái niệm then chốt cần phân biệt:

  • Image: lớp chỉ đọc chứa hệ thống file cùng cấu hình ứng dụng. Image bất biến, chia sẻ được và được định danh bằng tag ví dụ nginx:1.25-alpine.
  • Container: instance đang chạy được tạo từ image. Mỗi container có hệ thống file riêng ở lớp ghi, có thể bắt đầu và dừng độc lập.
  • Registry: nơi lưu trữ và phân phối image. Docker Hub là registry công khai phổ biến nhất, còn ACR hay ECR là các lựa chọn riêng tư cho doanh nghiệp.

Cơ chế cô lập của Docker dựa trên hai tính năng của nhân Linux: namespaces tạo ra không gian tên riêng cho tiến trình, mạng và điểm gắn kết, còn cgroups giới hạn tài nguyên CPU và RAM. Nhờ đó, nhiều container dùng chung một kernel mà vẫn không nhìn thấy hệ thống file của nhau.

Container so với máy ảo truyền thống

Tiêu chí Docker container Máy ảo ảo hoá (VM)
Thời gian khởi động vài giây vài phút
Hệ điều hành chia sẻ kernel của host mỗi VM có OS riêng
Kích thước tối thiểu vài chục MB vài GB
Mức cô lập ở tầng tiến trình ở tầng phần cứng
Mật độ đóng gói rất cao thấp

Sự khác biệt này giải thích vì sao một server 8 vCPU và 16 GB RAM có thể chạy hàng chục container dịch vụ, trong khi chỉ vài VM cùng cấu hình. Tuy nhiên container không phải lựa chọn tốt cho mọi bài toán: nếu ứng dụng cần một hệ điều hành hoàn toàn khác, hoặc cần mức cô lập tương đương hypervisor thì VM vẫn phù hợp hơn.

Dockerfile và quy trình build image

Dockerfile là file văn bản mô tả từng bước để tạo image. Mỗi lệnh tạo một lớp riêng, nhờ đó Docker cache lớp cũ và chỉ build lại phần thay đổi.

Một ví dụ tối giản cho ứng dụng Python:

FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]

Năm lệnh trên lần lượt chọn image nền, đặt thư mục làm việc, sao chép mã nguồn, cài thư viện và chỉ định lệnh khởi chạy. Thứ tự COPY requirements.txt trước COPY . . rất quan trọng: nó giúp Docker tái sử dụng cache của lớp cài thư viện mỗi khi bạn chỉ sửa mã nguồn.

Docker Compose cho ứng dụng nhiều dịch vụ

Một ứng dụng thực tế thường cần database, cache, message queue và web server. Docker Compose gom các dịch vụ này lại trong một file YAML và chạy chúng bằng một lệnh duy nhất.

services:
  web:
    image: nginx:alpine
    ports: ["80:80"]
  db:
    image: postgres:16
    environment:
      POSTGRES_PASSWORD: secret
    volumes:
      - pgdata:/var/lib/postgresql/data
volumes:
  pgdata:

Lệnh docker compose up -d sẽ tải image, tạo network nội bộ để các container giao tiếp với nhau theo tên dịch vụ, rồi chạy chúng nền. Lệnh docker compose down dọn dẹp toàn bộ container và network. Nhờ Compose, môi trường dev của bạn được mô tả bằng code thay vì bằng tài liệu viết tay.

Khi nào nên dùng Docker

  • CI/CD: mỗi lần commit build một image và gắn tag theo phiên bản, triển khai lại trở nên nhất quán.
  • Micro-services: mỗi service chạy trong container riêng, tách biệt failure và dễ scale độc lập.
  • Môi trường dev: loại bỏ triệu chứng “chạy được trên máy tôi” vì mọi thành viên dùng chung image.
  • Ứng dụng legacy: đóng gói phần mềm cũ lên container mà không cần nâng cấp hệ điều hành của server.

Bắt đầu nhanh trên Ubuntu

Cài đặt Docker Engine bằng gói chính thức của Ubuntu rất đơn giản:

sudo apt-get update
sudo apt-get install -y docker.io
sudo systemctl enable --now docker
sudo usermod -aG docker $USER

Sau khi đăng xuất và đăng nhập lại để nhóm mới có hiệu lực, kiểm tra cài đặt với docker run hello-world. Nếu lệnh in ra thông điệp chào mừng, Docker đã sẵn sàng. Bước tiếp theo là viết Dockerfile đầu tiên và build image riêng của bạn.

Kinh nghiệm thực tế

Luôn đặt .dockerignore để loại bỏ thư mục node_modules hay .git khỏi build context, giúp build nhanh hơn và image nhỏ hơn. Ưu tiên image dạng alpine hoặc slim thay cho bản đầy đủ. Cuối cùng, đừng để bí mật nằm trong Dockerfile vì chúng sẽ bị ghi vào lịch sử image.

Tài liệu tham khảo

Các lớp của một container được ghép từ nhiều image, đóng vai trò nền tảng cho việc build Dockerfile
Sơ đồ so sánh lớp ảo hoá của container và máy ảo truyền thống

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

Bảng trang page table là gì? Quản lý bộ nhớ ảo trong hệ điều hành

Bảng trang page table là gì? Quản lý bộ nhớ ảo trong hệ điều hành Page table (bảng trang) là cấu trúc dữ liệu cốt lõi giúp hệ điều hành…

Xem thêm

Mutation testing là gì? Kỹ thuật đo chất lượng bộ kiểm thử

Mutation testing là gì? Đây là kỹ thuật kiểm thử phần mềm bằng cách chủ động tạo ra những lỗi cố ý trong mã nguồn (gọi là mutant), rồi chạy…

Xem thêm

CQRS là gì? Tách lệnh và truy vấn trong kiến trúc phần mềm

CQRS (Command Query Responsibility Segregation) là một mẫu kiến trúc phần mềm tách biệt hai loại thao tác: thao tác ghi (command) thay đổi trạng thái hệ thống và thao…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất