跳至主要内容

10 个 Docker 项目灵感:从入门到高级

通过这些适合各个水平的实践型项目学习 Docker,从入门到高级,重点聚焦于构建与优化数据科学应用。
Joel Wembo
Joel Wembo

创建您的免费账户

实践并学习路径你的进步。

使用 Google 继续继续即表示您接受我们的 使用条款,我们的 隐私政策 ,并且您的数据存储在美国。

动手实践对掌握 Docker 至关重要。Docker 是现代软件开发和数据科学中的核心工具,可让您在容器中构建、部署和管理应用程序。

本文将提供入门级、中级和高级的 Docker 项目示例,重点涵盖多阶段构建、优化 Docker 镜像,以及在数据科学中的 Docker 实践。这些项目旨在加深您对 Docker 的理解并提升实操能力。

开始上手 Docker 项目

在开始项目之前,请确保您的机器上已安装 Docker。根据您的操作系统(Windows、macOS、Linux),您可以从 Docker 官方网站下载。

您还需要对以下内容有基本了解:

  • Dockerfile(用于定义容器内部内容)
  • Docker Compose(用于多容器应用)
  • 基础命令行指令,如 docker build、docker run、docker-compose up 等。

如果您需要复习上述概念,请查看 Introduction to Docker 或 Containerization and Virtualization Concepts 课程。

让我们开始吧!

面向初学者的 Docker 项目

在开始使用 Docker 时,选择既符合您当前水平又能促使您学习新概念的项目非常重要。以下是一些入门项目灵感:

项目 1:搭建一个简单的 Web 服务器

在此项目中,您将创建一个运行 Nginx 的基础 Web 服务器的 Docker 容器。Nginx 是最流行的开源 Web 服务器之一,可用于反向代理、负载均衡等。完成本项目后,您将学会如何使用 Docker 创建并运行容器,以及如何暴露端口以便从本机访问应用程序。

难度等级: 入门

使用技术: Docker、Nginx

分步说明

  • 安装 Docker: 确保您的系统已安装 Docker。
  • 创建项目目录: 新建一个文件夹,并在其中创建一个 index.html 文件,由 Nginx 进行服务。
  • 编写 Dockerfile: Dockerfile 是定义容器环境的脚本。它告诉 Docker 使用哪个基础镜像、包含哪些文件以及暴露哪些端口:
FROM nginx:alpine
COPY ./index.html /usr/share/nginx/html
EXPOSE 80
  • 构建 Docker 镜像: 进入项目文件夹并使用以下命令构建镜像:
docker build -t my-nginx-app .
  • 运行容器: 启动容器,并将容器的 80 端口映射到本机的 8080 端口:
docker run -d -p 8080:80 my-nginx-app
  • 访问 Web 服务器: 打开浏览器并访问 http://localhost:8080 查看您创建的页面。

项目 2:将 Python 脚本容器化

该项目将一个使用 pandas 库处理 CSV 数据的简单 Python 脚本容器化。目标是学习如何管理依赖,并在 Docker 容器内执行 Python 脚本,让脚本在任意环境中可移植、可运行。

难度等级: 入门

使用技术: Docker、Python、pandas

分步说明

  • 编写 Python 脚本: 创建名为 process_data.py 的脚本,用于读取并处理 CSV 文件。示例如下:
import pandas as pd
df = pd.read_csv('data.csv')
print(df.describe())
  • 创建 requirements.txt 文件: 此文件列出脚本所需的 Python 库。本例中仅需 pandas:
pandas
  • 编写 Dockerfile: 该文件将定义 Python 脚本的运行环境:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "process_data.py"]
  • 构建 Docker 镜像:
docker build -t python-script .
  • 运行容器:
docker run -v $(pwd)/data:/app/data python-script

项目 3:构建简单的多容器应用

该项目将帮助您通过构建一个多容器应用熟悉 Docker Compose。您将创建一个使用 Flask 作为前端、MySQL 作为后端数据库的简单 Web 应用。Docker Compose 允许您管理多个协同工作的容器。

难度等级: 入门

使用技术: Docker、Docker Compose、Flask、MySQL

分步说明

  • 编写 Flask 应用: 创建一个连接 MySQL 数据库并显示消息的简单 Flask 应用。示例如下:
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')
  • 创建 docker-compose.yml 文件: Docker Compose 用于定义并运行多容器 Docker 应用。在该文件中,您将定义 Flask 应用和 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:
  • 为 Flask 编写 Dockerfile: 用于为 Flask 应用创建 Docker 镜像:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
  • 构建并运行容器: 使用 Docker Compose 启动整个应用:
docker-compose up --build
  • 访问 Flask 应用: 在浏览器中访问 http://localhost:5000。

中级 Docker 项目

以下项目适合已扎实掌握 Docker 基础的读者。这些项目将引入更复杂的概念,例如多阶段构建和优化技术。

项目 4:为 Node.js 应用进行多阶段构建

多阶段构建通过分离构建环境与运行环境,有助于减小 Docker 镜像体积。在此项目中,您将使用多阶段构建来容器化一个 Node.js 应用。

难度等级: 中级

使用技术: Docker、Node.js、Nginx

分步说明

  • 创建一个简单的 Node.js 应用: 编写一个返回简单消息的基础 Node.js 服务器。示例如下:
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'));
  • 编写带有多阶段构建的 Dockerfile: 第一阶段用于构建应用,第二阶段使用更轻量的基础镜像来运行应用。
# 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"]
  • 构建镜像:
docker build -t node-multi-stage .
  • 运行容器:
docker run -p 3000:3000 node-multi-stage

项目 5:使用 TensorFlow 将机器学习模型容器化

本项目将使用 TensorFlow 对机器学习模型进行容器化。目标是创建一个可移植的环境,使您能够在不同系统上运行 TensorFlow 模型,而无需担心底层环境配置。

难度等级: 中级

使用技术: Docker、TensorFlow、Python

分步说明

  • 在 Python 脚本中安装 TensorFlow: 创建 model.py 脚本,加载并运行预训练的 TensorFlow 模型:
import tensorflow as tf
model = tf.keras.applications.MobileNetV2(weights='imagenet')
print("Model loaded successfully")
  • 编写 Dockerfile: 在 Docker 中定义 TensorFlow 的运行环境:
FROM tensorflow/tensorflow:latest
WORKDIR /app
COPY . .
CMD ["python", "model.py"]
  • 构建镜像:
docker build -t tensorflow-model .
  • 运行容器:
docker run tensorflow-model

项目 6:使用 Jupyter 和 Docker 创建数据科学环境

本项目聚焦于使用 Docker 和 Jupyter 笔记本创建可复现的数据科学环境。该环境将包含诸如 pandas、NumPy 和 scikit-learn 等常用 Python 库。

难度等级: 中级

使用技术: Docker、Jupyter、Python、scikit-learn

分步说明

  • 创建 docker-compose.yml 文件: 定义 Jupyter Notebook 服务及所需库。示例如下:
version: '3'
services:
  jupyter:
    	image: jupyter/scipy-notebook
    	ports:
    	- "8888:8888"
    	volumes:
    	- ./notebooks:/home/joelwembo/work
  • 启动 Jupyter Notebook: 使用 Docker Compose 启动 Jupyter Notebook。
docker-compose up
  • 访问 Jupyter Notebook: 打开浏览器并访问 http://localhost:8888。

高级 Docker 项目

这些高级项目将聚焦于真实场景与进阶 Docker 概念,例如深度学习流水线与自动化数据管道。

项目 7:为 Python 应用缩小 Docker 镜像体积

在该项目中,您将通过使用 Alpine Linux 等最小化基础镜像,并采用多阶段构建来尽可能减小 Python 应用的镜像体积。

难度等级: 高级

使用技术: Docker、Python、Alpine Linux

分步说明

  • 编写 Python 脚本: 创建一个使用 pandas 进行数据分析的脚本。示例如下:
import pandas as pd
df = pd.read_csv('data.csv')
print(df.head())
  • 优化 Dockerfile: 使用多阶段构建与 Alpine Linux 来创建轻量级镜像。
# 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"]
  • 构建镜像:
docker build -t optimized-python-app .

项目 8:使用 PyTorch 将深度学习流水线容器化

本项目使用 PyTorch 将深度学习流水线容器化。重点在于优化 Dockerfile 的性能与体积,使得在不同环境中运行深度学习模型更加便捷。

难度等级: 高级

使用技术: Docker、PyTorch、Python

分步说明

  • 在 Python 脚本中安装 PyTorch: 创建一个加载预训练 PyTorch 模型并进行推理的脚本。示例如下:
import torch
model = torch.hub.load('pytorch/vision', 'resnet18', pretrained=True)
print("Model loaded successfully")
  • 编写 Dockerfile: 定义 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"]
  • 构建镜像:
docker build -t pytorch-model .
  • 运行容器:
docker run pytorch-model 

项目 9:使用 Apache Airflow 和 Docker 自动化数据管道

在此项目中,您将搭建并容器化一个 Apache Airflow 环境以实现数据管道自动化。Apache Airflow 是数据工程领域广泛使用的复杂工作流编排工具。

难度等级: 高级

使用技术: Docker、Apache Airflow、Python、PostgreSQL

分步说明

  • 创建 docker-compose.yml 文件: 定义 Airflow 服务和 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:
  • 启动 Airflow 环境: 使用 Docker Compose 启动 Airflow 环境:
docker-compose up
  • 访问 Airflow 界面: 打开浏览器并访问 http://localhost:8080。

项目 10:使用 FastAPI 和 Docker 部署数据科学 API

构建并部署一个使用 FastAPI 的数据科学 API。您将使用 Docker 对 API 进行容器化,并重点针对生产环境进行优化。

难度等级: 高级

使用技术: Docker、FastAPI、Python、scikit-learn

分步说明

  • 编写 FastAPI 应用: 创建一个使用机器学习模型进行预测的简单 API。示例如下:
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)}
  • 编写 Dockerfile: 创建一个定义 FastAPI 运行环境的 Dockerfile:
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"]
  • 构建镜像:
docker build -t fastapi-app .
  • 运行容器:
docker run -p 8000:8000 fastapi-app

开展 Docker 项目的提示

在实践这些项目时,请牢记以下建议:

  • 从小处开始: 先从略有挑战的项目入手,再逐步迈向更复杂的任务。通过相对简单的任务建立信心至关重要。
  • 记录您的进展: 对项目进行详细记录,以便追踪学习历程,并作为今后参考。
  • 加入 Docker 社区: 参与在线论坛和本地聚会,分享经验、提出问题并向他人学习。
  • 大胆试验与自定义: 不要害怕对项目进行调整,尝试不同方法,并探索新的 Docker 特性。
  • 持续学习: 通过探索 Kubernetes、Docker Swarm 或微服务架构等进阶主题与工具,不断扩展您的 Docker 知识。

结语

掌握 Docker 不仅仅是学习命令和配置,更在于理解 Docker 如何融入现代应用开发、数据科学工作流与基础设施管理。

本指南分享的项目为您提供了构建基础技能与实践经验的思路,帮助您在真实场景中不断精进。

此时,我建议通过以下课程来巩固您的知识:

FAQs

编写高效 Dockerfile 的最佳实践有哪些?

编写高效 Dockerfile 的最佳实践包括:通过合并命令来减少层数、使用多阶段构建以减小镜像体积、选择轻量级基础镜像、对依赖进行缓存,以及避免将不必要的文件包含到最终镜像中。

什么是 Docker 中的多阶段构建?

多阶段构建是一种通过分离构建环境与运行环境来优化 Docker 镜像的方法。这会产生更小、更安全的镜像。

如何减小 Docker 镜像的大小?

使用最小化基础镜像、高效管理依赖,并采用多阶段构建来减小镜像体积、提升性能。

构建 Docker 镜像时如何排查常见错误?

构建 Docker 镜像时的常见错误包括权限问题、Dockerfile 语法错误以及依赖安装失败。排查时,可查看 Docker 的构建日志,确保使用了正确的基础镜像,并确认路径或文件权限设置无误。使用 docker build --no-cache 等工具可帮助识别缓存相关问题。

这些项目可以将 Docker 和 Kubernetes 一起使用吗?

可以。一旦您熟练掌握 Docker,Kubernetes 就是下一步。Kubernetes 帮助在规模化场景中管理容器化应用。您可以将 Docker 项目部署到 Kubernetes 集群,以管理多实例、处理扩缩容并实现自动化部署。

管理 Docker 卷和持久化数据有哪些最佳实践?

在使用 Docker 卷时,务必使用命名卷以确保容器重启后数据仍可持久化。定期备份卷,并监控磁盘 I/O 导致的性能瓶颈。避免将敏感数据直接存放在容器内;请使用安全的存储方案或外部数据库。

Dockerfile 中 ENTRYPOINT 指令的作用是什么?

ENTRYPOINT 指令用于指定容器启动时始终运行的命令。它使容器像可执行文件一样,可以在运行时传入参数,从而增强灵活性。

Dockerfile 中 CMD 与 ENTRYPOINT 有何区别?

CMD 和 ENTRYPOINT 都用于指定容器启动时运行的命令。但 CMD 提供可被覆盖的默认参数,而 ENTRYPOINT 则定义始终运行的命令。ENTRYPOINT 适用于将容器构建为可执行体,而 CMD 更适合用于指定默认命令。

Joel Wembo

作者

Joel Wembo

AWS 认证云解决方案架构师、DevOps、云工程师,深谙高可用架构及相关理念。具备云工程与 DevOps 知识,善于利用开源资源交付企业级应用。使用 AWS、AWS CDK、AWS SAM、CloudFormation、Serverless Framework、Terraform 和 Django 构建云端应用。

主题