中级 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 更适合用于指定默认命令。
AWS 认证云解决方案架构师、DevOps、云工程师,深谙高可用架构及相关理念。具备云工程与 DevOps 知识,善于利用开源资源交付企业级应用。使用 AWS、AWS CDK、AWS SAM、CloudFormation、Serverless Framework、Terraform 和 Django 构建云端应用。

动手实践对掌握 Docker 至关重要。Docker 是现代软件开发和数据科学中的核心工具,可让您在容器中构建、部署和管理应用程序。
本文将提供入门级、中级和高级的 Docker 项目示例,重点涵盖多阶段构建、优化 Docker 镜像,以及在数据科学中的 Docker 实践。这些项目旨在加深您对 Docker 的理解并提升实操能力。
开始上手 Docker 项目
在开始项目之前,请确保您的机器上已安装 Docker。根据您的操作系统(Windows、macOS、Linux),您可以从 Docker 官方网站下载。
您还需要对以下内容有基本了解:
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
分步说明
index.html文件,由 Nginx 进行服务。项目 2:将 Python 脚本容器化
该项目将一个使用 pandas 库处理 CSV 数据的简单 Python 脚本容器化。目标是学习如何管理依赖,并在 Docker 容器内执行 Python 脚本,让脚本在任意环境中可移植、可运行。
难度等级: 入门
使用技术: Docker、Python、pandas
分步说明
process_data.py的脚本,用于读取并处理 CSV 文件。示例如下:requirements.txt文件: 此文件列出脚本所需的 Python 库。本例中仅需pandas:项目 3:构建简单的多容器应用
该项目将帮助您通过构建一个多容器应用熟悉 Docker Compose。您将创建一个使用 Flask 作为前端、MySQL 作为后端数据库的简单 Web 应用。Docker Compose 允许您管理多个协同工作的容器。
难度等级: 入门
使用技术: Docker、Docker Compose、Flask、MySQL
分步说明
docker-compose.yml文件: Docker Compose 用于定义并运行多容器 Docker 应用。在该文件中,您将定义 Flask 应用和 MySQL 数据库服务: