Hướng Dẫn Căn Bản Về Kiến Trúc Và Thực Hành Docker

Kiến thức nền tảng về Container

Để hiểu rõ Docker, chúng ta cần phân biệt nó với công nghệ máy ảo (Virtual Machine) truyền thống như VMware. Trong khi các giải pháp ảo hóa trước đây giả lập cả phần cứng để tạo ra một hệ điều hành hoàn chỉnh, thì Docker cung cấp cơ chế đóng gói môi trường chạy ứng dụng dựa trên sự chia sẻ kernel của máy chủ vật liệu.

Điểm mấu chốt khiến Docker trở nên phổ biến là khả năng di động cao (portability) và hiệu suất vượt trội do loại bỏ lớp hypervisor cồng kềnh. Các thành phần bên trong được cô lập nhưng vẫn tận dụng chung tài nguyên nhân Linux.

Cấu trúc phân tách của hệ sinh thái

Kiến trúc hiện đại của Docker không còn là một khối thống nhất mà bao gồm ba thành phần chính có thể quản lý độc lập:

  • containerd.io: Đây là runtime chịu trách nhiệm tương tác trực tiếp với OS API (ví dụ LXC), giúp tách biệt engine Docker khỏi các dịch vụ đặc thù của hệ điều hành.
  • docker-ce (Engine): Chính là tiến trình daemon thực hiện hầu hết các tác vụ quản lý life cycle của container, phụ thuộc vào containerd.
  • docker-ce-cli: Bộ công cụ dòng lệnh giúp người dùng gửi yêu cầu tới daemon. Công cụ này có thể được cài đặt riêng biệt để quản lý remote daemon.

Một số câu lệnh vận hành thiết yếu

Quy trình làm việc thông thường bắt đầu bằng việc kéo xuống một hình ảnh từ registry. Dưới đây là các thao tác cơ bản:


# Liệt kê danh sách các hình ảnh đang có
docker images

# Kiểm tra chi tiết metadata của một image cụ thể
docker image inspect nginx:latest

# Khởi chạy container mới, ánh xạ cổng 8080 của host vào 80 của container
docker run -d --name web-demo -p 8080:80 nginx:latest

# Truy cập shell bên trong container đang hoạt động
docker exec -i -t web-demo sh

Lưu ý rằng các hình ảnh tối giản (minimal images) trong Docker thường đã loại bỏ các công cụ tiện ích tiêu chuẩn như man hay vim để giảm kích thước. Do đó, việc giao tiếp giữa host và container thường tập trung vào copy dữ liệu hoặc ánh xạ volume hơn là thao tác trực tiếp trên terminal.

Xây dựng hình ảnh tùy chỉnh qua Dockerfile

Tệp cấu trúc Dockerfile định nghĩa quy trình xây dựng một image riêng biệt. Từ file này, ta có thể đóng gói mã nguồn và dependencies để tạo ra container.

Thay vì sử dụng môi trường Java nặng nề, dưới đây là ví dụ với Node.js để minh họa cách đóng gói ứng dụng:


FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install --production

FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]

Trong quy trình DevOps thực tế, các bước build và push image thường được tự động hóa qua CI/CD pipeline thay vì thực hiện thủ công liên tục.

Hệ thống lưu trữ và kết nối mạng

Mạng (Network) và Lưu trữ (Volume) là hai khía cạnh quan trọng để duy trì tính ổn định của container:

  • Volume: Dùng để tách biệt dữ liệu khỏi vòng đời của container. Khi container bị xóa, dữ liệu lưu trong volume vẫn tồn tại trên host, đảm bảo tính bền vững (persistence).
  • Network: Cung cấp cơ chế kết nối giữa các container. Docker tạo ra một mạng ảo nơi các container có thể giao tiếp với nhau thông qua tên hostname nội bộ (internal DNS), tương tự như việc phân giải tên miền.

Công cụ biên chế (Orchestration)

Trước khi Kubernetes trở thành tiêu chuẩn, docker-compose được sử dụng rộng rãi để định nghĩa và vận hành nhiều container trên một máy host đơn lẻ thông qua một tệp YAML cấu hình. Tuy nhiên, đối với các hệ thống phân tán quy mô lớn, xu hướng hiện nay là chuyển dịch sang sử dụng Kubernetes để quản lý cluster.

Thẻ: docker containerization DevOps dockerfile linux-networking

Đăng vào ngày 22 tháng 5 lúc 09:45