Docker 入门:如何使用 Docker 容器化 AI 项目(一)

引言
在人工智能(AI)项目的开发和部署过程中,环境配置和依赖管理往往是开发者遇到的挑战之一。开发者通常需要在不同的机器上运行同样的代码,确保每个人使用的环境一致,才能避免 “在我的机器上可以运行”的尴尬问题。而 Docker 作为一种轻量级的虚拟化技术,提供了一种理想的解决方案:通过容器化技术,可以确保 AI 项目在各种环境中一致性地运行,从而大大简化部署流程。
本篇文章将详细介绍如何使用 Docker 容器化 AI 项目,帮助你掌握 Docker 在 AI 开发中的应用,提升项目的可移植性和可扩展性。文章将从基础概念入手,逐步讲解 Docker 容器的创建、管理、部署等关键技能,并通过实际的示例代码来帮助你理解 Docker 容器在 AI 项目中的实际应用。
一、什么是 Docker?
Docker 是一个开源平台,用于开发、传输和运行应用程序。Docker 使得开发者能够将应用程序及其依赖打包成一个标准化的容器,并且容器能够在任何支持 Docker 的环境中运行。这种容器化的方式能够避免环境差异带来的问题,是开发、测试和生产环境的一种理想解决方案。
与传统的虚拟化技术不同,Docker 不需要为每个应用程序创建一个完整的虚拟机,而是通过共享操作系统内核,轻量化地创建多个相互隔离的容器。每个容器中包含运行应用所需的所有依赖,保证了应用在不同环境中的一致性。
Docker 的优势:
- 轻量级: Docker 容器共享主机操作系统内核,无需像虚拟机那样模拟整个操作系统,因此更加轻量,占用资源更少。
- 快速启动: 容器可以在几秒钟内启动,而虚拟机通常需要几分钟。
- 资源利用率高: 由于轻量级和快速启动的特性,Docker 可以在同一台主机上运行更多应用,提高资源利用率。
- 可移植性: Docker 容器可以在任何支持 Docker 的平台上运行,无需修改,实现了“一次构建,到处运行”的目标。
- 版本控制: Docker 镜像支持版本控制,可以轻松回滚到之前的版本。
- 生态系统: Docker 拥有庞大的生态系统,Docker Hub 上有大量的官方和社区维护的镜像,可以方便地获取和使用。
Docker 架构简介:

- Docker 引擎 (Docker Engine): Docker 的核心组件,负责构建和运行 Docker 容器。
- Docker 客户端 (Docker Client): 用户与 Docker 引擎交互的命令行工具。
- Docker 镜像 (Docker Image): 只读模板,用于创建 Docker 容器。包含应用程序及其依赖。
- Docker 容器 (Docker Container): Docker 镜像的运行实例。
- Docker 仓库 (Docker Registry): 存储和分发 Docker 镜像的地方,例如 Docker Hub。
- Docker Compose: 用于定义和运行多容器 Docker 应用的工具。
Docker vs 虚拟机:

| 特性 | Docker 容器 | 虚拟机 |
|---|---|---|
| 启动速度 | 秒级 | 分钟级 |
| 资源占用 | 更少 | 更多 |
| 性能 | 接近原生 | 有一定损耗 |
| 隔离性 | 进程级隔离 | 硬件级隔离 |
| 操作系统 | 共享宿主机内核 | 需要完整的操作系统 |
| 大小 | 通常较小 (MB) | 通常较大 (GB) |
| 可移植性 | 跨平台,只需支持 Docker | 需要兼容不同虚拟化平台 |
二、Docker 的安装与基本操作
2.1 安装 Docker
在开始使用 Docker 之前,首先需要在本地安装 Docker。不同操作系统的安装方式有所不同,以下是针对常见操作系统的安装步骤:
2.1.1 Windows 安装

- 访问 Docker 官网 下载适用于 Windows 的 Docker Desktop。
- 双击安装文件并按照安装向导完成安装。
- 重要: Docker Desktop for Windows 可以选择使用 WSL 2 (Windows Subsystem for Linux 2) 或 Hyper-V 作为后端。WSL 2 性能更好,建议选择使用 WSL 2。安装过程中可能需要启用 WSL 2 和 Hyper-V 功能。
- 安装完成后,启动 Docker Desktop,并进行初始设置。
- 验证 Docker 是否安装成功,在终端中运行以下命令:
docker --version
如果返回版本信息,则说明安装成功。
2.1.2 macOS 安装
- 访问 Docker 官网 下载适用于 macOS 的 Docker Desktop。
- 双击下载的 .dmg 文件并将 Docker 拖入应用程序文件夹。
- 启动 Docker,按照提示完成设置。
- 在终端中运行以下命令,验证安装是否成功:
docker --version
2.1.3 Linux 安装
在 Linux 上,Docker 安装通常需要使用命令行工具。
以下是在 Ubuntu的安装步骤:
设置Docker的apt存储库。
添加Docker的官方GPG密钥:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
将存储库添加到Apt源:
echo \"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
安装最新特定版本Docker包。
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
通过运行hello-world映像来验证安装是否成功:
$ sudo docker run hello-world
该命令下载一个测试映像并在容器中运行它。当容器运行时,它打印一条确认消息并退出。
centos版本的linux参照
2.2 Docker 常用命令
以下是一些常见的 Docker 命令,它们帮助我们在使用 Docker 时进行容器的管理:
- 查看 Docker 版本
sudo docker --version
- 拉取镜像
sudo docker pull <image_name>:<tag>
例如: docker pull tensorflow/tensorflow:2.6.0-py3
- 查看本地镜像
sudo docker images
- 启动容器
sudo docker run -it <image_name>:<tag> bash
- 列出所有容器
sudo docker ps -a
- 停止容器
sudo docker stop <container_id>
- 删除容器
sudo docker rm <container_id>
- 删除镜像
sudo docker rmi <image_name>:<tag>
三、理解 Dockerfile:构建 AI 项目的基础镜像

为了将 AI 项目容器化,我们需要构建一个 Docker 镜像。Docker 镜像是一个包含应用程序及其所有依赖的只读模板,容器则是镜像的一个运行实例。构建 Docker 镜像的核心是 Dockerfile,它是一种包含一系列指令的文本文件,用于自动化镜像的创建过程。
3.1 创建 Dockerfile
一个简单的 Dockerfile 用于构建一个包含 Python 和 AI 项目依赖的镜像,示例如下:
# 使用官方 Python 镜像作为基础镜像
FROM python:3.8-slim# 设置工作目录
WORKDIR /app# 复制项目文件到容器中
COPY . /app# 安装项目依赖
RUN pip install --no-cache-dir -r requirements.txt# 设置容器启动命令
CMD ["python", "main.py"]
3.1.1 说明
FROM:指定基础镜像,本例中使用的是 Python 3.8 版本的官方镜像。选择slim版本可以减小镜像体积。WORKDIR:设置工作目录,所有后续的命令都会在这个目录中执行。COPY:将当前目录的所有文件复制到容器中的/app目录。RUN:在容器中执行命令,这里用于安装项目的 Python 依赖。--no-cache-dir选项可以减小镜像大小。CMD:指定容器启动时执行的命令。
3.2 构建镜像
创建好 Dockerfile 后,可以通过以下命令构建镜像:
docker build -t my-ai-project .
这会根据 Dockerfile 中的指令构建一个名为 my-ai-project 的镜像。-t 选项用于指定镜像的名称和标签(默认为 latest)。. 表示 Dockerfile 所在的当前目录。构建过程可能需要一些时间,取决于项目的大小和依赖的安装情况。
3.3 运行容器
构建完成后,可以通过以下命令运行容器:
docker run -it my-ai-project
这将启动一个基于 my-ai-project 镜像的容器,并进入交互模式。你可以在容器内运行 AI 项目的代码,或者启动相关服务。
想要系统学习AI 项目实战?那么”AI 项目实战:从原理到落地”这个专栏将带你具体的深入研究AI 项目。每个项目包含: 问题定义与数据集介绍、 数据预处理与特征工程、 模型选择与设计 、模型训练与调优、 模型评估与结果分析、 模型部署与上线 (Web API, 移动端部署等)!
点击进入:AI 项目实战:从原理到落地
点击进入:Docker 入门:如何使用 Docker 容器化 AI 项目(二)
本文为原创内容,未经许可不得转载。
相关文章:
Docker 入门:如何使用 Docker 容器化 AI 项目(一)
引言 在人工智能(AI)项目的开发和部署过程中,环境配置和依赖管理往往是开发者遇到的挑战之一。开发者通常需要在不同的机器上运行同样的代码,确保每个人使用的环境一致,才能避免 “在我的机器上可以运行”的尴尬问题。…...
LLMs之rStar:《Mutual Reasoning Makes Smaller LLMs Stronger Problem-Solvers》翻译与解读
LLMs之rStar:《Mutual Reasoning Makes Smaller LLMs Stronger Problem-Solvers》翻译与解读 导读:这篇论文提出了一种名为rStar的自我博弈互推理方法,用于增强小型语言模型 (SLMs) 的推理能力,无需微调或依赖更强大的模型。rStar…...
【RK3588 Linux 5.x 内核编程】-内核中断与ThreadedIRQ
内核中断与ThreadedIRQ 文章目录 内核中断与ThreadedIRQ1、Threaded IRQ介绍2、Threaded IRQ相关API3、驱动实现4、驱动验证当 Interrupt 触发时,Interrupt handler 应该执行得非常快,它不应该运行更多的时间(它不应该执行耗时的任务)。 如果我们有执行更多任务的中断处理程…...
Message Processing With Spring Integration高级应用:自定义消息通道与端点
一、Spring Integration 简介 Spring Integration 是 Spring 框架的扩展,支持企业集成模式(EIP),提供轻量级的消息处理功能,帮助开发者构建可维护、可测试的企业集成解决方案。 核心目标: 提供简单的模型…...
S32K324 MCAL中的Postbuild和PreCompile使用
文章目录 前言Postbuild和PreCompile的概念MCAL中配置差异总结 前言 之前一直看到MCAL配置中有这个Postbuild和PreCompile的配置,但是不太清楚这两个的区别和使用方法。最近在使用中出现了相关问题,本文介绍一下MCAL中这两种配置的区别和使用。 Postbu…...
kubeadm_k8s_v1.31高可用部署教程
kubeadm_k8s_v1.31高可用部署教程 实验环境部署拓扑图**部署署架构****Load Balance****Control plane node****Worker node****资源分配(8台虚拟机)**集群列表 前置准备关闭swap开启ipv4转发更多设置 1、Verify the MAC address and product_uuid are u…...
【AI日记】24.12.22 容忍与自由 | 环境因素和个人因素
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 内容:看 OpenAi 这周的发布会和其他 AI 新闻,大佬视频时间:3 小时 读书 书名:富兰克林自传时间:1 小时评估:读完,总体…...
【Java基础面试题030】Java和Go的区别?
回答重点 可以从语言的设计理念、并发模型、内存管理、生态系统与应用场景来说: 1)语言设计理念: Java:Java是一种面向对象编程语言,强调继承、多态和封装等OOP特性。它运行在Java虚拟机(JVM)…...
学习嵩山版《Java 开发手册》:编程规约 - 常量定义(P5)
概述 《Java 开发手册》是阿里巴巴集团技术团队的集体智慧结晶和经验总结,他旨在提升开发效率和代码质量 《Java 开发手册》是一本极具价值的 Java 开发规范指南,对于提升开发者的综合素质和代码质量具有重要意义 学习《Java 开发手册》是一个提升 Jav…...
洛谷 P1595 信封问题 C语言递归
题目描述 某人写了 n 封信和 n 个信封,如果所有的信都装错了信封。求所有信都装错信封共有多少种不同情况。 输入格式 一个信封数 n,保证 n≤20。 输出格式 一个整数,代表有多少种情况。 输入输出样例 输入 #1 2 输出 #1 1 输入 #2 …...
QT创建一个模板槽和信号刷新UI
文章目录 信号与槽的声明work.cpp 信号与槽的连接 在Qt中,若您想设计一个仅含一个信号和槽函数框架,用以刷新UI上多个类型相同但可能属性各异的控件,我们可以借助QVariant的灵活性来传递不同种类的数据,同时利用控件的名称或某种标…...
【计算机视觉基础CV-图像分类】01- 从历史源头到深度时代:一文读懂计算机视觉的进化脉络、核心任务与产业蓝图
1.计算机视觉定义 计算机视觉(Computer Vision)是一个多学科交叉的研究领域,它的核心目标是使计算机能够像人类一样“看”并“理解”视觉信息。换句话说,它希望赋予计算机从图像、视频中自动提取、有意义地分析、理解并解释视觉场…...
C# cad启动自动加载启动插件、类库编译 多个dll合并为一个
可以通过引用costura.fody的包,编译后直接变为一个dll 自动加载写入注册表、激活码功能: 【CAD二次开发教程-实例18-启动加载与自动运行-哔哩哔哩】 https://b23.tv/lKnki3f https://gitee.com/zhuhao1912/cad-atuo-register-and-active...
Mybatis增删改查(配置文件版)
准备环境 1、数据库表tb_brand 2、实体类Brand 3、测试用例 3、1在test包中的java包中创建测试类com.xyy.test.MybatisTest.java 4、安装MyBatisX插件 添加插件后,因为在Mapper代理开发时,Mapper接口要和Mapper.xml映射文件放在同一个报下࿰…...
【Spring Security系列】5 次密码错误触发账号锁定?Spring Security 高效实现方案详解
作者:后端小肥肠 🍇 我写过的文章中的相关代码放到了gitee,地址:xfc-fdw-cloud: 公共解决方案 🍊 有疑问可私信或评论区联系我。 🥑 创作不易未经允许严禁转载。 姊妹篇: 【Spring Security系列…...
笔记day5
文章目录 1 复习2 最完美的解决方案,解决轮播图问题3 开发Floor组件4 把首页中的轮播图拆分为一个共用全局组件5 search模块开发 1 复习 完成商品分类三级列表路由跳转一级路由传参(合并参数)完成search模块中对于typeNav的使用(…...
Linux快速入门-兼期末快速复习使用
Linux快速入门-兼期末快速复习使用 一小时快速入门linux快速一:Linux操作系统概述1. Linux概述1.1 定义与特点1.2 起源与发展1.3 Linux结构1.4 版本类别1.5 应用和发展方向 2. 安装与启动2.1 Windows下VMware安装Linux2.2 安装Ubuntu 快速二:linux的桌面…...
浅谈文生图Stable Diffusion(SD)相关模型基础
1.U-Net模型基础 1.基础概念 UNet模型是一种基于卷积神经网络的图像分割算法,它采用了U型的网络结构,由编码器(下采样路径)和解码器(上采样路径)两部分组成。 编码器负责提取输入图像的特征,…...
Vivado使用VScode编译器
旧版Vivado使用Vscode编译器偶尔会出现VScode界面卡死的情况,在新版的Vivado中(我的是Vivado 2023.2),可以使用如下方式: 在设置中选择Text Editor,选择Custom Editor 在对话框中输入以下语句:…...
CEF127 编译指南 MacOS 篇 - 拉取 CEF 源码(五)
1. 引言 在完成了所有必要工具的安装和配置后,我们进入到获取 CEF 源码的阶段。对于 macOS 平台,CEF 的源码获取过程需要特别注意不同芯片架构(Intel 和 Apple Silicon)的区别以及版本管理。本文将详细介绍如何在 macOS 系统上获…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...
【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL
ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...
ArcPy扩展模块的使用(3)
管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如,可以更新、修复或替换图层数据源,修改图层的符号系统,甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...
