Chuyển đến nội dung chính

10 Docker Project Ideas: From Beginner to Advanced

Học Docker với các ý tưởng dự án thực hành cho mọi trình độ, từ cơ bản đến nâng cao, tập trung vào xây dựng và tối ưu ứng dụng khoa học dữ liệu.
Đã cập nhật 16 thg 4, 2026  · 9 phút đọc

Kinh nghiệm thực hành là điều cốt yếu để thành thạo Docker. Docker là một công cụ trọng yếu trong phát triển phần mềm hiện đại và khoa học dữ liệu, cho phép bạn xây dựng, triển khai, và quản lý ứng dụng trong container.

Trong bài viết này, tôi đưa ra các ví dụ dự án Docker ở mức độ cơ bản, trung cấp và nâng cao, tập trung vào multi-stage builds, tối ưu hóa Docker image, và áp dụng Docker trong khoa học dữ liệu. Những dự án này được thiết kế để giúp bạn hiểu sâu hơn về Docker và nâng cao kỹ năng thực hành.

Bắt đầu với các dự án Docker

Trước khi bắt tay vào các dự án, hãy đảm bảo bạn đã cài đặt Docker trên máy. Tùy theo hệ điều hành (Windows, macOS, Linux), bạn có thể tải Docker từ trang web chính thức của Docker.

Bạn cũng cần nắm cơ bản về:

  • Dockerfile (để định nghĩa nội dung bên trong container)
  • Docker Compose (cho ứng dụng đa container)
  • Các lệnh CLI cơ bản như docker build, docker run, docker-compose up, v.v.

Nếu bạn cần ôn lại các khái niệm trên, hãy xem khóa học Introduction to Docker hoặc Containerization and Virtualization Concepts.

Bắt đầu thôi!

Các dự án Docker cho người mới bắt đầu

Khi mới làm quen với Docker, điều quan trọng là chọn dự án phù hợp trình độ nhưng vẫn đủ thách thức để bạn học thêm khái niệm mới. Dưới đây là một số ý tưởng để bạn khởi đầu:

Dự án 1: Thiết lập máy chủ web đơn giản

Ở dự án này, bạn sẽ tạo một container Docker chạy máy chủ web cơ bản bằng Nginx. Nginx là một trong những web server mã nguồn mở phổ biến nhất cho reverse proxy, cân bằng tải, và nhiều hơn nữa. Kết thúc dự án, bạn sẽ biết cách tạo và chạy container với Docker và mở port để truy cập ứng dụng từ máy cục bộ.

Mức độ khó: Cơ bản

Công nghệ sử dụng: Docker, Nginx

Hướng dẫn từng bước

  • Cài đặt Docker: Đảm bảo Docker đã được cài trên hệ thống của bạn.
  • Tạo thư mục dự án: Tạo một thư mục mới và một tệp index.html bên trong để Nginx phục vụ.
  • Viết Dockerfile: Dockerfile là một script định nghĩa môi trường của container. Nó cho Docker biết image nền dùng gì, đưa vào những tệp nào, và mở port nào:
FROM nginx:alpine
COPY ./index.html /usr/share/nginx/html
EXPOSE 80
  • Build Docker image: Di chuyển đến thư mục dự án và build image bằng:
docker build -t my-nginx-app .
  • Chạy container: Khởi động container và ánh xạ port 80 của container sang port 8080 trên máy bạn:
docker run -d -p 8080:80 my-nginx-app
  • Truy cập máy chủ web: Mở trình duyệt và truy cập http://localhost:8080 để xem trang bạn đã tạo.

Dự án 2: Đưa một script Python vào Docker

Dự án này bao gồm đưa một script Python đơn giản xử lý dữ liệu từ tệp CSV bằng thư viện pandas vào container. Mục tiêu là học cách quản lý phụ thuộc và chạy script Python bên trong container Docker, giúp script có thể di động và chạy trong mọi môi trường.

Mức độ khó: Cơ bản

Công nghệ sử dụng: Docker, Python, pandas

Hướng dẫn từng bước

  • Viết script Python: Tạo script tên process_data.py để đọc và xử lý tệp CSV. Ví dụ như sau:
import pandas as pd
df = pd.read_csv('data.csv')
print(df.describe())
  • Tạo tệp requirements.txt: Tệp này liệt kê các thư viện Python mà script cần. Ở đây chỉ cần pandas:
pandas
  • Viết Dockerfile: Tệp này sẽ định nghĩa môi trường cho script Python:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "process_data.py"]
  • Build Docker image:
docker build -t python-script .
  • Chạy container:
docker run -v $(pwd)/data:/app/data python-script

Dự án 3: Xây dựng ứng dụng đa container đơn giản

Dự án này sẽ giúp bạn làm quen với Docker Compose bằng cách xây dựng một ứng dụng đa container. Bạn sẽ tạo ứng dụng web đơn giản dùng Flask làm frontend và MySQL làm cơ sở dữ liệu backend. Docker Compose cho phép bạn quản lý nhiều container hoạt động cùng nhau.

Mức độ khó: Cơ bản

Công nghệ sử dụng: Docker, Docker Compose, Flask, MySQL

Hướng dẫn từng bước

  • Viết ứng dụng Flask: Tạo một ứng dụng Flask đơn giản kết nối đến cơ sở dữ liệu MySQL và hiển thị thông điệp. Ví dụ như sau:
from flask import Flask
import mysql.connector
 
app = Flask(__name__)
 
def get_db_connection():
 	connection = mysql.connector.connect(
	 host="db",
	 user="root",
	 password="example",
	 database="test_db"
 	)
 	return connection
 
@app.route('/')
def hello_world():
 	connection = get_db_connection()
 	cursor = connection.cursor()
 	cursor.execute("SELECT 'Hello, Docker!'")
 	result = cursor.fetchone()
 	connection.close()
 	return str(result[0])
 
if __name__ == "__main__":
 	app.run(host='0.0.0.0')
  • Tạo tệp docker-compose.yml: Docker Compose định nghĩa và chạy các ứng dụng Docker đa container. Trong tệp này, bạn sẽ định nghĩa dịch vụ ứng dụng Flask và cơ sở dữ liệu MySQL:
version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: test_db
    ports:
      - "3306:3306"
    volumes:
      - db_data:/var/lib/mysql

  web:
    build: .
    ports:
      - "5000:5000"
    depends_on:
      - db
    environment:
      FLASK_ENV: development
    volumes:
      - .:/app

volumes:
  db_data:
  • Viết Dockerfile cho Flask: Tạo Docker image cho ứng dụng Flask:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
  • Build và chạy các container: Dùng Docker Compose để khởi chạy toàn bộ ứng dụng:
docker-compose up --build

Các dự án Docker trình độ trung cấp

Những dự án sau dành cho người đã nắm vững các kiến thức cơ bản về Docker. Chúng sẽ giới thiệu các khái niệm phức tạp hơn như multi-stage builds và kỹ thuật tối ưu hóa.

Dự án 4: Multi-stage build cho ứng dụng Node.js

Multi-stage builds giúp giảm kích thước Docker image bằng cách tách môi trường build và runtime. Trong dự án này, bạn sẽ đưa một ứng dụng Node.js vào container bằng multi-stage builds.

Mức độ khó: Trung cấp

Công nghệ sử dụng: Docker, Node.js, Nginx

Hướng dẫn từng bước

  • Tạo ứng dụng Node.js đơn giản: Viết một máy chủ Node.js cơ bản trả về thông điệp đơn giản. Ví dụ như sau:
const express = require('express');
const app = express();
 
app.get('/', (req, res) => res.send('Hello from Node.js'));
 
app.listen(3000, () => console.log('Server running on port 3000'));
  • Viết Dockerfile với multi-stage build: Giai đoạn đầu build ứng dụng, giai đoạn sau chạy ứng dụng với image nền nhẹ hơn.
# Stage 1: Build
FROM node:14 as build-stage
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
# Add the following line if there's a build step for the app
# RUN npm run build

# Stage 2: Run
FROM node:14-slim
WORKDIR /app
COPY --from=build-stage /app .
EXPOSE 3000
ENV NODE_ENV=production
CMD ["node", "server.js"]
  • Build image:
docker build -t node-multi-stage .
  • Chạy container:
docker run -p 3000:3000 node-multi-stage

Dự án 5: Đưa mô hình machine learning với TensorFlow vào Docker

Dự án này sẽ đưa một mô hình machine learning sử dụng TensorFlow vào container. Mục tiêu là tạo môi trường di động để chạy mô hình TensorFlow trên nhiều hệ thống mà không lo về thiết lập nền tảng.

Mức độ khó: Trung cấp

Công nghệ sử dụng: Docker, TensorFlow, Python

Hướng dẫn từng bước

  • Cài TensorFlow trong một script Python: Tạo script Python model.py tải và chạy một mô hình TensorFlow đã huấn luyện sẵn:
import tensorflow as tf
model = tf.keras.applications.MobileNetV2(weights='imagenet')
print("Model loaded successfully")
  • Viết Dockerfile: Định nghĩa môi trường cho TensorFlow bên trong Docker:
FROM tensorflow/tensorflow:latest
WORKDIR /app
COPY . .
CMD ["python", "model.py"]
  • Build image:
docker build -t tensorflow-model .
  • Chạy container:
docker run tensorflow-model

Dự án 6: Tạo môi trường khoa học dữ liệu với Jupyter và Docker

Dự án này tập trung vào tạo một môi trường khoa học dữ liệu có thể tái lập bằng Docker và Jupyter notebooks. Môi trường sẽ bao gồm các thư viện Python phổ biến như pandas, NumPy, và scikit-learn.

Mức độ khó: Trung cấp

Công nghệ sử dụng: Docker, Jupyter, Python, scikit-learn

Hướng dẫn từng bước

  • Tạo tệp docker-compose.yml: Định nghĩa dịch vụ Jupyter Notebook và các thư viện cần thiết. Ví dụ như sau:
version: '3'
services:
  jupyter:
    	image: jupyter/scipy-notebook
    	ports:
    	- "8888:8888"
    	volumes:
    	- ./notebooks:/home/joelwembo/work
  • Khởi động Jupyter Notebook: Sử dụng Docker Compose để khởi chạy Jupyter Notebook.
docker-compose up
  • Truy cập Jupyter Notebook: Mở trình duyệt và truy cập http://localhost:8888.

Các dự án Docker trình độ nâng cao

Các dự án nâng cao này tập trung vào ứng dụng thực tế và những khái niệm Docker nâng cao, như pipeline học sâu và pipeline dữ liệu tự động.

Dự án 7: Giảm kích thước Docker image cho ứng dụng Python

Trong dự án này, bạn sẽ tối ưu Docker image cho một ứng dụng Python bằng cách sử dụng image nền tối giản như Alpine Linux và áp dụng multi-stage builds để giữ image nhỏ nhất có thể.

Mức độ khó: Nâng cao

Công nghệ sử dụng: Docker, Python, Alpine Linux

Hướng dẫn từng bước

  • Viết script Python: Tạo script phân tích dữ liệu bằng pandas. Ví dụ như sau:
import pandas as pd
df = pd.read_csv('data.csv')
print(df.head())
  • Tối ưu Dockerfile: Sử dụng multi-stage builds và Alpine Linux để tạo image gọn nhẹ.
# Stage 1: Build stage
FROM python:3.9-alpine as build-stage
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY script.py .

# Stage 2: Run stage
FROM python:3.9-alpine
WORKDIR /app
COPY --from=build-stage /app/script.py .
CMD ["python", "script.py"]
  • Build image:
docker build -t optimized-python-app .

Dự án 8: Đưa pipeline học sâu với PyTorch vào Docker

Dự án này bao gồm đưa một pipeline học sâu sử dụng PyTorch vào container. Trọng tâm là tối ưu Dockerfile về hiệu năng và kích thước, giúp dễ dàng chạy các mô hình học sâu trong nhiều môi trường khác nhau.

Mức độ khó: Nâng cao

Công nghệ sử dụng: Docker, PyTorch, Python

Hướng dẫn từng bước

  • Cài PyTorch trong một script Python: Tạo script tải mô hình PyTorch đã huấn luyện sẵn và thực hiện suy luận. Ví dụ như sau:
import torch
model = torch.hub.load('pytorch/vision', 'resnet18', pretrained=True)
print("Model loaded successfully")
  • Viết Dockerfile: Định nghĩa môi trường cho PyTorch:
FROM pytorch/pytorch:1.9.0-cuda11.1-cudnn8-runtime
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY model.py .
CMD ["python", "model.py"]
  • Build image:
docker build -t pytorch-model .
  • Chạy container:
docker run pytorch-model 

Dự án 9: Tự động hóa pipeline dữ liệu với Apache Airflow và Docker

Trong dự án này, bạn sẽ thiết lập và đưa môi trường Apache Airflow vào container để tự động hóa các pipeline dữ liệu. Apache Airflow là công cụ phổ biến để điều phối các quy trình phức tạp, được dùng rộng rãi trong kỹ thuật dữ liệu.

Mức độ khó: Nâng cao

Công nghệ sử dụng: Docker, Apache Airflow, Python, PostgreSQL

Hướng dẫn từng bước

  • Tạo tệp docker-compose.yml: Định nghĩa các dịch vụ Airflow và cơ sở dữ liệu PostgreSQL:
version: '3'
services:
  postgres:
    image: postgres:latest
    environment:
      POSTGRES_USER: airflow
      POSTGRES_PASSWORD: airflow
      POSTGRES_DB: airflow
    ports:
      - "5432:5432"
    volumes:
      - postgres_data:/var/lib/postgresql/data

  webserver:
    image: apache/airflow:latest
    environment:
      AIRFLOW__CORE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow
      AIRFLOW__CORE__EXECUTOR: LocalExecutor
    depends_on:
      - postgres
    ports:
      - "8080:8080"
    volumes:
      - ./dags:/opt/airflow/dags
    command: ["webserver"]

  scheduler:
    image: apache/airflow:latest
    environment:
      AIRFLOW__CORE__SQL_ALCHEMY_CONN: postgresql+psycopg2://airflow:airflow@postgres/airflow
      AIRFLOW__CORE__EXECUTOR: LocalExecutor
    depends_on:
      - postgres
      - webserver
    volumes:
      - ./dags:/opt/airflow/dags
    command: ["scheduler"]

volumes:
  postgres_data:
  • Khởi động môi trường Airflow: Dùng Docker Compose để khởi chạy môi trường Airflow:
docker-compose up

Dự án 10: Triển khai API khoa học dữ liệu với FastAPI và Docker

Xây dựng và triển khai một API khoa học dữ liệu bằng FastAPI. Bạn sẽ đóng gói API bằng Docker và tập trung tối ưu cho môi trường production.

Mức độ khó: Nâng cao

Công nghệ sử dụng: Docker, FastAPI, Python, scikit-learn

Hướng dẫn từng bước

  • Viết ứng dụng FastAPI: Tạo một API đơn giản dùng mô hình machine learning để dự đoán. Ví dụ như sau:
from fastapi import FastAPI
import pickle
 
app = FastAPI()
with open("model.pkl", "rb") as f:
   model = pickle.load(f)
 
@app.post("/predict/")
def predict(data: list):
   return {"prediction": model.predict(data)}
  • Viết Dockerfile: Tạo Dockerfile định nghĩa môi trường cho FastAPI:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
  • Build image:
docker build -t fastapi-app .
  • Chạy container:
docker run -p 8000:8000 fastapi-app

Mẹo khi làm việc với các dự án Docker

Khi triển khai các dự án này, hãy lưu ý những mẹo sau:

  • Bắt đầu từ nhỏ: Khởi đầu bằng các dự án hơi thách thức, sau đó chuyển sang nhiệm vụ phức tạp hơn. Xây dựng sự tự tin với các tác vụ đơn giản hơn là rất quan trọng.
  • Ghi chép tiến độ: Lưu nhật ký chi tiết về các dự án để theo dõi quá trình học và dùng làm tài liệu tham chiếu cho các nỗ lực sau này.
  • Tham gia cộng đồng Docker: Tham gia các diễn đàn trực tuyến và meetup địa phương để chia sẻ kinh nghiệm, đặt câu hỏi, và học hỏi lẫn nhau.
  • Thử nghiệm và tùy biến: Đừng ngại điều chỉnh các dự án, thử cách tiếp cận khác, và khám phá các tính năng Docker mới.
  • Không ngừng học hỏi: Tiếp tục mở rộng kiến thức về Docker bằng cách khám phá các chủ đề và công cụ nâng cao như Kubernetes, Docker Swarm, hoặc kiến trúc microservices.

Kết luận

Thành thạo Docker không chỉ là học lệnh và cấu hình. Đó còn là hiểu Docker phù hợp thế nào với phát triển ứng dụng hiện đại, quy trình khoa học dữ liệu và quản trị hạ tầng.

Những dự án tôi chia sẻ trong hướng dẫn này cung cấp một số ý tưởng để xây dựng kỹ năng nền tảng và trải nghiệm thực hành cần thiết nhằm tiến tới làm tốt trong các tình huống thực tế.

Ở thời điểm này, tôi đề xuất bạn củng cố kiến thức bằng cách theo các khóa học sau:

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

Các thực hành tốt nhất để viết Dockerfile hiệu quả là gì?

Thực hành tốt để viết Dockerfile hiệu quả bao gồm giảm số lớp bằng cách kết hợp lệnh, dùng multi-stage builds để giảm kích thước image, chọn image nền gọn nhẹ, cache phụ thuộc và tránh đưa các tệp không cần thiết vào image cuối cùng.

Multi-stage build trong Docker là gì?

Multi-stage build là phương pháp tối ưu Docker image bằng cách tách biệt môi trường build và runtime. Điều này giúp image nhỏ gọn và an toàn hơn.

Làm thế nào để giảm kích thước Docker image?

Hãy dùng image nền tối giản, quản lý phụ thuộc hiệu quả và áp dụng multi-stage builds để giảm kích thước image và cải thiện hiệu năng.

Tôi khắc phục các lỗi thường gặp khi build Docker image như thế nào?

Các lỗi thường gặp khi build Docker image gồm vấn đề phân quyền, sai cú pháp Dockerfile, và lỗi cài đặt phụ thuộc. Để khắc phục, hãy kiểm tra log build của Docker, đảm bảo bạn dùng đúng image nền, và xác nhận đường dẫn hay quyền tệp đã được thiết lập chính xác. Những công cụ như docker build --no-cache có thể giúp xác định vấn đề do cache.

Tôi có thể dùng Docker với Kubernetes cho các dự án này không?

Có. Khi bạn đã quen với Docker, Kubernetes có thể là bước tiếp theo. Kubernetes giúp quản lý ứng dụng đóng gói container ở quy mô lớn. Bạn có thể triển khai các dự án Docker lên một cụm Kubernetes để quản lý nhiều phiên bản, xử lý mở rộng và tự động hóa triển khai.

Một số thực hành tốt nhất để quản lý Docker volume và dữ liệu bền vững là gì?

Khi làm việc với Docker volume, điều quan trọng là dùng named volume để đảm bảo dữ liệu tồn tại qua các lần khởi động lại container. Thường xuyên sao lưu volume của bạn và theo dõi các nút thắt hiệu năng do I/O đĩa. Tránh lưu dữ liệu nhạy cảm trực tiếp trong container; thay vào đó hãy dùng giải pháp lưu trữ an toàn hoặc cơ sở dữ liệu bên ngoài.

Mục đích của chỉ thị ENTRYPOINT trong Dockerfile là gì?

Chỉ thị ENTRYPOINT trong Dockerfile chỉ định lệnh sẽ luôn chạy khi container khởi động. Nó cho phép coi container như một chương trình thực thi, nơi có thể truyền tham số khi chạy, tăng tính linh hoạt.

Sự khác nhau giữa CMD và ENTRYPOINT trong Dockerfile là gì?

Cả CMDENTRYPOINT đều chỉ định lệnh chạy khi container khởi động. Tuy nhiên, CMD cung cấp các đối số mặc định có thể bị ghi đè, trong khi ENTRYPOINT định nghĩa lệnh luôn chạy. ENTRYPOINT hữu ích để tạo container hoạt động như chương trình thực thi, còn CMD linh hoạt hơn để chỉ định lệnh mặc định.


Joel Wembo's photo
Author
Joel Wembo
LinkedIn
Twitter

Kiến trúc sư Giải pháp Đám mây được chứng nhận AWS, chuyên về DevOps và Kỹ sư Đám mây, am hiểu sâu về kiến trúc và các khái niệm độ sẵn sàng cao. Tôi có kiến thức về kỹ thuật đám mây và DevOps, thành thạo tận dụng các nguồn lực mã nguồn mở để triển khai ứng dụng cấp doanh nghiệp. Tôi xây dựng các ứng dụng dựa trên đám mây bằng AWS, AWS CDK, AWS SAM, CloudFormation, Serverless Framework, Terraform và Django.

Chủ đề

Tìm hiểu thêm về Docker với các khóa học này!

Tracks

Container hóa và ảo hóa với Docker và Kubernetes

13 giờ
Hãy khám phá sức mạnh của Docker và Kubernetes. Khóa học tương tác này sẽ giúp bạn xây dựng và triển khai ứng dụng trong các môi trường hiện đại.
Xem chi tiếtRight Arrow
Bắt đầu khóa học
Xem thêmRight Arrow