[DE Blog #67] Làm Chủ Docker Căn Bản Dành Cho Người Làm Dữ Liệu (Docker 101): Image, Container, Dockerfile & Dựng Hạ Tầng Database Trong 5 Phút
![[DE Blog #67] Làm Chủ Docker Căn Bản Dành Cho Người Làm Dữ Liệu (Docker 101): Image, Container, Dockerfile & Dựng Hạ Tầng Database Trong 5 Phút](/uploads/ai-images/cover-docker-can-ban-du-lieu.png)
1. Bối cảnh thực tế (Context & Problem Statement)
Một trong những tình huống gây ức chế nhất của người làm dữ liệu khi bắt đầu một dự án mới:
- Bạn mất nguyên 2 ngày đầu tiên chỉ để cài đặt môi trường trên máy tính: Cài đặt PostgreSQL, cài Python 3.11, cài thư viện Pandas, cấu hình biến môi trường, xung đột phiên bản phần mềm giữa máy Mac và máy Windows...
- Sau khi viết xong đoạn script chạy mượt mà trên máy tính cá nhân, bạn chuyển giao cho đồng nghiệp hoặc đưa lên máy chủ công ty (Production Server) thì chương trình lập tức bị lỗi crash vì phiên bản thư viện ở máy chủ khác với máy của bạn.
- Bạn chỉ có thể thốt lên câu biện hộ kinh điển: "Ơ kìa, trên máy em vẫn chạy được mà!"
Docker sinh ra để chấm dứt vĩnh viễn cơn ác mộng đó:
- Docker đóng gói toàn bộ: Mã nguồn + Phiên bản Python + Thư viện + Hệ điều hành thu nhỏ vào một chiếc "thùng container" tiêu chuẩn hóa.
- Chiếc thùng này chạy ở máy của bạn như thế nào thì sẽ chạy trên máy đồng nghiệp, máy chủ Synology NAS hay trên đám mây AWS hệt như thế chính xác không sai lệch một dấu phẩy.
2. Các Khái Niệm & Cơ Chế Cốt Lõi
2.1. Bản Chất Của Docker: Máy Ảo (VM) vs. Docker Container
Nhiều người lầm tưởng Docker là một phần mềm tạo máy ảo như VMware hay VirtualBox. Thực tế cơ chế của chúng hoàn toàn khác nhau:
MÁY ẢO TRUYỀN THỐNG (VIRTUAL MACHINE): DOCKER CONTAINER (SIÊU NHẸ):
+------------------------------------------+ +------------------------------------------+
| App 1 (Data) | App 2 (DB) | App 3 | | App 1 (Data) | App 2 (DB) | App 3 |
| Libraries | Libraries | Libraries | | Libraries | Libraries | Libraries |
+---------------+--------------+-----------+ +---------------+--------------+-----------+
| Guest OS 1 | Guest OS 2 | Guest OS 3| | |
| (Ubuntu 2GB) | (Debian 2GB) | (RHEL 2GB)| | DOCKER ENGINE (Chia sẻ chung Linux Kernel)|
+---------------+--------------+-----------+ +------------------------------------------+
| HYPERVISOR (Phần mềm ảo hóa phần cứng) | | |
+------------------------------------------+ | HỆ ĐIỀU HÀNH MÁY THẬT (HOST OS: Linux/Mac)|
| PHẦN CỨNG MÁY TÍNH THẬT (CPU, RAM, DISK) | | PHẦN CỨNG MÁY TÍNH THẬT (CPU, RAM, DISK) |
+------------------------------------------+ +------------------------------------------+
(Mỗi máy ảo cõng thêm 1 Hệ điều hành nặng vài GB) (Chia sẻ chung nhân Kernel -> Khởi động trong 1 giây!)
- Máy ảo (VM): Ảo hóa toàn bộ phần cứng. Mỗi máy ảo phải cài riêng một hệ điều hành hoàn chỉnh (Guest OS). Khởi động mất , ngốn hàng chục Gigabytes ổ đĩa và RAM.
- Docker Container: Không cần cài lại hệ điều hành mới! Nó sử dụng chung nhân hệ điều hành (Linux Kernel) của máy thật và chỉ đóng gói đúng các file thư viện cần thiết. Khởi động chỉ mất dưới và tốn chỉ vài chục Megabytes RAM.
2.2. Bộ Tứ Khái Niệm Cốt Lõi Trong Docker
1. Docker Image (Bản thiết kế / Khuôn đúc bánh):
- Là một tập tin đóng băng chỉ đọc (Read-only Template) chứa toàn bộ hệ điều hành thu nhỏ, phần mềm và mã nguồn.
- Ví dụ: Một Image chứa sẵn PostgreSQL 16 đã được cấu hình tối ưu. Bạn có thể tải hàng triệu Image miễn phí từ kho Docker Hub (tương tự như App Store của Docker).
2. Docker Container (Chiếc bánh được đúc ra / Ngôi nhà đang ở):
- Là một thực thể đang chạy (Running Instance) được tạo ra từ Docker Image.
- Từ 1 Docker Image gốc của PostgreSQL, bạn có thể tạo ra Container PostgreSQL độc lập chạy cùng lúc mà không sợ xung đột nhau!
3. Dockerfile (Công thức nấu ăn):
- Là một file văn bản đơn giản chứa các dòng lệnh hướng dẫn Docker cách tự động đóng gói ứng dụng của bạn thành một Image mới:
- Bắt đầu từ hệ điều hành nào (
FROM python:3.11-slim) - Copy mã nguồn vào đâu (
COPY . /app) - Cài những thư viện gì (
RUN pip install -r requirements.txt) - Chạy lệnh gì khi khởi động (
CMD ["python", "etl_script.py"])
- Bắt đầu từ hệ điều hành nào (
4. Docker Hub / Registry (Kho chứa Image):
- Nơi lưu trữ và chia sẻ Image công khai hoặc nội bộ (tương tự như GitHub cho mã nguồn).
2.3. Cơ Chế Ánh Xạ Cổng (Port Mapping -p)
Mỗi Docker Container là một "ốc đảo" biệt lập với thế giới bên ngoài.
- Giả sử Container PostgreSQL đang chạy bên trong và mở cổng lắng nghe mặc định là
5432. - Máy tính thật của bạn (Host) hoàn toàn không thể kết nối vào nếu không đục một lỗ thông cửa!
- Cú pháp Ánh xạ cổng:
-p 5432:5432
(Mọi truy cập vàolocalhost:5432ở máy thật sẽ tự động được chuyển tiếp vào cổng5432bên trong Container).
2.4. Lưu Trữ Bền Vững Với Docker Volumes (-v)
Đây là cạm bẫy lớn nhất của người mới học Docker:
- Bản chất của Container là tạm bợ (Stateless / Ephemeral): Khi một container bị xóa đi (
docker rm), toàn bộ dữ liệu nằm bên trong nó cũng sẽ bị xóa sạch theo! - Nếu bạn lưu Database trong Container mà không cấu hình Volume, một ngày đẹp trời khi cập nhật phiên bản Container mới, toàn bộ dữ liệu kinh doanh sẽ biến mất vĩnh viễn!
- Giải pháp Docker Volume (
-v):- Tạo một "đường ống dẫn" gắn thư mục lưu dữ liệu của máy thật vào bên trong container: \mathbf{-v \text{ my_db_data : /var/lib/postgresql/data}}
- Dữ liệu thực chất được ghi thẳng vào ổ cứng máy thật. Dù bạn có xóa, tắt hay nâng cấp container hàng trăm lần, dữ liệu vẫn nguyên vẹn !
2.5. Sức Mạnh Của Docker Compose (Quản Lý Cả Dàn Nhạc Đa Container)
Thay vì phải nhớ và gõ từng câu lệnh dài dằng dặc trên Terminal cho từng container, Docker Compose cho phép bạn khai báo toàn bộ hạ tầng gồm nhiều service (Database, Web API, Công cụ BI) vào duy nhất một file docker-compose.yml:
- Chỉ cần gõ lệnh:
docker compose up -dToàn bộ hệ thống tự động tải, cấu hình mạng nội bộ và khởi động đồng loạt trong !
3. Các Bảng Markdown So Sánh Chi Tiết
📊 Bảng 1: So Sánh Máy Ảo (Virtual Machine) vs. Docker Container
| Tiêu chí | Máy ảo truyền thống (VM - VMware / VirtualBox) | Docker Container |
|---|---|---|
| Kiến trúc hệ điều hành | Mỗi VM cài riêng 1 Hệ điều hành hoàn chỉnh (Guest OS) | Chia sẻ chung nhân Linux Kernel của máy thật (Host OS) |
| Thời gian khởi động | Chậm () | Siêu tốc (Vài trăm mili-giây đến 1 giây) |
| Dung lượng ổ đĩa | Rất nặng (Vài GB đến vài chục GB mỗi máy) | Rất nhẹ (Vài chục MB đến vài trăm MB) |
| Chiếm dụng tài nguyên RAM | Phải cấp phát tĩnh (ví dụ giữ cố định 4GB RAM) | Dùng bao nhiêu lấy bấy nhiêu một cách linh hoạt |
| Tính nhất quán khi deploy | Vẫn có thể lệch do cấu hình bên trong OS | Chuẩn xác 100% trên mọi nền tảng (Write once, run anywhere) |
📊 Bảng 2: So Sánh Docker Image vs. Docker Container
| Tiêu chí | Docker Image | Docker Container |
|---|---|---|
| Trạng thái tồn tại | Tĩnh, đóng băng, chỉ đọc (Read-only) | Đang chạy, động, có thể đọc và ghi (Read-Write) |
| Hình ảnh so sánh | Giống như File cài đặt phần mềm (.iso, .exe) | Giống như Phần mềm đang mở trên Task Manager |
| Cách tạo ra | Xây dựng từ Dockerfile (docker build) | Khởi chạy từ Image (docker run) |
| Số lượng | Chỉ cần 1 Image duy nhất | Có thể tạo ra vô số Container từ 1 Image đó |
📊 Bảng 3: Bảng Tra Cứu Các Lệnh Docker Cốt Lõi Hàng Ngày (Cheat Sheet)
| Câu lệnh CLI | Giải thích chức năng đời thường |
|---|---|
docker run -d -p 5432:5432 --name my_db postgres | Tải image postgres và khởi chạy container chạy ngầm (-d) mở cổng 5432 |
docker ps | Xem danh sách các Container đang chạy |
docker ps -a | Xem toàn bộ danh sách Container (kể cả những cái đã tắt) |
docker logs -f <container_name> | Xem trực tiếp nhật ký dòng lệnh (Logs) của container để tìm lỗi |
docker exec -it <container_name> bash | Chui vào bên trong terminal của container để kiểm tra file/chạy lệnh |
docker stop <container_name> | Tạm dừng container đang chạy |
docker rm <container_name> | Xóa hẳn container (Lưu ý: Phải stop trước khi rm) |
docker compose up -d | Khởi động toàn bộ các service được định nghĩa trong file docker-compose.yml |
docker compose down | Tắt và dọn dẹp sạch toàn bộ các service trong file compose |
4. Thực Hành Thực Chiến: Dựng Cụm PostgreSQL + Metabase Trong 5 Phút (Walkthrough)
📌 Kịch bản bài toán:
Bạn cần một môi trường cơ sở dữ liệu PostgreSQL để thực hành viết SQL, đồng thời muốn có ngay một công cụ Business Intelligence (Metabase) kết nối trực tiếp vào để vẽ Dashboard trực quan.
Thay vì mất cả ngày cài đặt thủ công, bạn chỉ cần tạo duy nhất 1 file docker-compose.yml:
version: '3.8'
services:
# SERVICE 1: CƠ SỞ DỮ LIỆU POSTGRESQL
postgres_db:
image: postgres:16-alpine # Dùng phiên bản alpine siêu nhẹ (< 100MB)
container_name: local_postgres
restart: always
environment:
POSTGRES_USER: data_engineer
POSTGRES_PASSWORD: SecretPassword123
POSTGRES_DB: analytics_dw
ports:
- "5432:5432" # Ánh xạ cổng ra máy thật để DBeaver kết nối được
volumes:
- postgres_data:/var/lib/postgresql/data # Gắn Volume để dữ liệu không bị mất khi tắt!
# SERVICE 2: CÔNG CỤ TRỰC QUAN HÓA METABASE (BI TOOL)
metabase_bi:
image: metabase/metabase:latest
container_name: local_metabase
restart: always
ports:
- "3000:3000" # Mở cổng 3000 để truy cập qua trình duyệt Web
depends_on:
- postgres_db # Đảm bảo Database khởi động xong thì Metabase mới bật
# KHAI BÁO VOLUME LƯU TRỮ DỮ LIỆU BỀN VỮNG TRÊN ĐĨA MÁY THẬT:
volumes:
postgres_data:
🚀 3 Bước Vận Hành Siêu Đơn Giản:
-
Bước 1: Khởi động hệ thống: Mở Terminal tại thư mục chứa file trên và gõ:
docker compose up -dDocker sẽ tự động tải 2 Image về và khởi động cả 2 container trong vòng chưa đầy 1 phút!
-
Bước 2: Sử dụng công cụ:
- Mở trình duyệt web gõ:
http://localhost:3000Bạn sẽ thấy ngay giao diện của Metabase sẵn sàng để tạo Dashboard! - Mở DBeaver kết nối vào: Host
localhost, Port5432, Userdata_engineer, PassSecretPassword123, Databaseanalytics_dw.
- Mở trình duyệt web gõ:
-
Bước 3: Dừng hệ thống khi hết giờ làm việc:
docker compose downMáy tính của bạn lập tức sạch sẽ, không hề có bất kỳ phần mềm rác nào chạy ngầm làm chậm máy!
5. Góc Ôn Luyện Phỏng Vấn (Interview Corner)
❓ Câu hỏi 1: Sự khác biệt bản chất giữa Virtual Machine (Máy ảo) và Docker Container là gì? Tại sao Docker lại tiêu tốn ít RAM hơn và khởi động nhanh hơn gấp nhiều lần?
- Gợi ý trả lời ngắn gọn, chuẩn xác:
- Sự khác biệt về tầng ảo hóa:
- Máy ảo (Virtual Machine): Thực hiện ảo hóa ở Tầng phần cứng (Hardware-level Virtualization) thông qua một lớp phần mềm gọi là Hypervisor. Mỗi máy ảo bắt buộc phải cài đặt một Hệ điều hành khách riêng biệt (Guest OS hoàn chỉnh với dung lượng vài GB) bao gồm toàn bộ kernel, driver và các tiến trình hệ thống nền.
- Docker Container: Thực hiện ảo hóa ở Tầng hệ điều hành (OS-level Virtualization). Các container chạy cô lập nhưng chia sẻ chung nhân Linux Kernel của máy chủ thật (Host OS) thông qua các tính năng cốt lõi của Linux là Namespaces (cô lập tiến trình, mạng, ổ đĩa) và Cgroups (giới hạn CPU, RAM).
- Lý do Docker nhẹ hơn và khởi động siêu nhanh:
- Khi khởi động Docker Container, máy tính hoàn toàn không phải trải qua quá trình nạp lại nhân hệ điều hành (Booting OS) vốn mất từ vài chục giây đến vài phút của máy ảo.
- Container khởi động nhanh tương đương việc bạn mở một tiến trình ứng dụng thông thường trên hệ điều hành () và chỉ tiêu tốn đúng lượng RAM mà mã nguồn ứng dụng đang thực sự sử dụng.
- Sự khác biệt về tầng ảo hóa:
❓ Câu hỏi 2: Khi bạn chạy một cơ sở dữ liệu (như PostgreSQL hoặc MySQL) bên trong Docker Container, điều gì sẽ xảy ra nếu container bị restart hoặc bị xóa đi mà không cấu hình Docker Volume? Hãy giải thích cơ chế của Docker Volume.
- Gợi ý trả lời:
- Hậu quả nếu không dùng Volume:
- Về mặt mặc định, tầng lưu trữ bên trong một container là Tầng lưu trữ tạm thời (Ephemeral Writable Layer).
- Nếu container chỉ bị
restart: Dữ liệu vẫn còn. - Nhưng nếu container bị xóa đi (
docker rm) hoặc khi bạn cập nhật phiên bản Image mới: Toàn bộ tầng ghi tạm thời đó sẽ bị hủy diệt hoàn toàn, đồng nghĩa với việc toàn bộ dữ liệu của Database bị xóa vĩnh viễn không thể khôi phục.
- Cơ chế hoạt động của Docker Volume:
- Docker Volume là một thư mục chuyên dụng nằm trên hệ thống tệp của máy tính thật (Host File System), được quản lý bởi Docker Engine (thường nằm tại
/var/lib/docker/volumes/trên Linux). - Bằng việc khai báo Volume, Docker thực hiện cơ chế Mount (Gắn kết nối) thư mục lưu trữ dữ liệu của Database bên trong container vào thư mục này trên máy thật.
- Mọi thao tác ghi dữ liệu thực chất được ghi thẳng xuống ổ đĩa cứng của máy chủ. Do đó, vòng đời của dữ liệu được tách rời hoàn toàn khỏi vòng đời của Container: Bạn có thể xóa, tạo mới hay thay đổi container liên tục mà dữ liệu Database vẫn nằm an toàn trên đĩa cứng.
- Docker Volume là một thư mục chuyên dụng nằm trên hệ thống tệp của máy tính thật (Host File System), được quản lý bởi Docker Engine (thường nằm tại
- Hậu quả nếu không dùng Volume:
❓ Câu hỏi 3: Trong file Dockerfile, sự khác nhau giữa lệnh CMD và lệnh ENTRYPOINT là gì? Khi đóng gói một ứng dụng Data Pipeline viết bằng Python, bạn sẽ sử dụng chúng như thế nào?
- Gợi ý trả lời:
- Sự khác biệt:
ENTRYPOINT: Định nghĩa câu lệnh thực thi cố định chính của container mà không thể bị ghi đè một cách dễ dàng từ tham số dòng lệnh khi chạydocker run. Nó biến container thành một file thực thi độc lập (Executable).CMD: Cung cấp các tham số mặc định choENTRYPOINT(hoặc câu lệnh mặc định nếu không cóENTRYPOINT). Các tham số trongCMDrất dễ dàng bị ghi đè nếu người dùng truyền thêm tham số vào cuối lệnhdocker run.
- Thực tế áp dụng trong Data Pipeline Python:
- Kết hợp cả hai để tạo ra một script linh hoạt:
# Định nghĩa lệnh chạy cố định: ENTRYPOINT ["python", "main_pipeline.py"] # Cung cấp tham số mặc định (ví dụ ngày chạy): CMD ["--date", "today"] - Khi chạy mặc định: Gõ
docker run my_pipelineNó sẽ chạy:python main_pipeline.py --date today. - Khi cần chạy bù dữ liệu quá khứ (Backfill): Bạn chỉ cần gõ
docker run my_pipeline --date 2026-08-01Tham số mới sẽ tự động ghi đè lênCMDmà không cần phải sửa hay build lại Image!
- Kết hợp cả hai để tạo ra một script linh hoạt:
- Sự khác biệt:
6. Tóm Tắt Ghi Nhớ Nhanh (Key Takeaways)
- Docker Container siêu nhẹ và khởi động trong vì nó dùng chung nhân Linux Kernel của máy thật, không cõng thêm hệ điều hành cồng kềnh như Máy ảo (VM).
- Docker Image là Bản thiết kế khuôn đúc; Docker Container là Thực thể đang chạy.
- Luôn sử dụng Port Mapping (
-p host:container) để mở cửa cho máy tính bên ngoài truy cập vào service bên trong. - Tuyệt đối không bao giờ quên gắn Docker Volume (
-v) cho các cơ sở dữ liệu để bảo vệ dữ liệu không bị mất khi xóa container. - Sử dụng Docker Compose (
docker-compose.yml) là cách chuẩn mực, nhanh nhất và chuyên nghiệp nhất để dựng toàn bộ hạ tầng Data Stack (Database + BI Tools) chỉ bằng đúng 1 câu lệnhdocker compose up -d.