当前位置: 首页 > news >正文

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 项目(一)

引言 在人工智能&#xff08;AI&#xff09;项目的开发和部署过程中&#xff0c;环境配置和依赖管理往往是开发者遇到的挑战之一。开发者通常需要在不同的机器上运行同样的代码&#xff0c;确保每个人使用的环境一致&#xff0c;才能避免 “在我的机器上可以运行”的尴尬问题。…...

LLMs之rStar:《Mutual Reasoning Makes Smaller LLMs Stronger Problem-Solvers》翻译与解读

LLMs之rStar&#xff1a;《Mutual Reasoning Makes Smaller LLMs Stronger Problem-Solvers》翻译与解读 导读&#xff1a;这篇论文提出了一种名为rStar的自我博弈互推理方法&#xff0c;用于增强小型语言模型 (SLMs) 的推理能力&#xff0c;无需微调或依赖更强大的模型。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 框架的扩展&#xff0c;支持企业集成模式&#xff08;EIP&#xff09;&#xff0c;提供轻量级的消息处理功能&#xff0c;帮助开发者构建可维护、可测试的企业集成解决方案。 核心目标&#xff1a; 提供简单的模型…...

S32K324 MCAL中的Postbuild和PreCompile使用

文章目录 前言Postbuild和PreCompile的概念MCAL中配置差异总结 前言 之前一直看到MCAL配置中有这个Postbuild和PreCompile的配置&#xff0c;但是不太清楚这两个的区别和使用方法。最近在使用中出现了相关问题&#xff0c;本文介绍一下MCAL中这两种配置的区别和使用。 Postbu…...

kubeadm_k8s_v1.31高可用部署教程

kubeadm_k8s_v1.31高可用部署教程 实验环境部署拓扑图**部署署架构****Load Balance****Control plane node****Worker node****资源分配&#xff08;8台虚拟机&#xff09;**集群列表 前置准备关闭swap开启ipv4转发更多设置 1、Verify the MAC address and product_uuid are u…...

【AI日记】24.12.22 容忍与自由 | 环境因素和个人因素

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】 工作 内容&#xff1a;看 OpenAi 这周的发布会和其他 AI 新闻&#xff0c;大佬视频时间&#xff1a;3 小时 读书 书名&#xff1a;富兰克林自传时间&#xff1a;1 小时评估&#xff1a;读完&#xff0c;总体…...

【Java基础面试题030】Java和Go的区别?

回答重点 可以从语言的设计理念、并发模型、内存管理、生态系统与应用场景来说&#xff1a; 1&#xff09;语言设计理念&#xff1a; Java&#xff1a;Java是一种面向对象编程语言&#xff0c;强调继承、多态和封装等OOP特性。它运行在Java虚拟机&#xff08;JVM&#xff09…...

学习嵩山版《Java 开发手册》:编程规约 - 常量定义(P5)

概述 《Java 开发手册》是阿里巴巴集团技术团队的集体智慧结晶和经验总结&#xff0c;他旨在提升开发效率和代码质量 《Java 开发手册》是一本极具价值的 Java 开发规范指南&#xff0c;对于提升开发者的综合素质和代码质量具有重要意义 学习《Java 开发手册》是一个提升 Jav…...

洛谷 P1595 信封问题 C语言递归

题目描述 某人写了 n 封信和 n 个信封&#xff0c;如果所有的信都装错了信封。求所有信都装错信封共有多少种不同情况。 输入格式 一个信封数 n&#xff0c;保证 n≤20。 输出格式 一个整数&#xff0c;代表有多少种情况。 输入输出样例 输入 #1 2 输出 #1 1 输入 #2 …...

QT创建一个模板槽和信号刷新UI

文章目录 信号与槽的声明work.cpp 信号与槽的连接 在Qt中&#xff0c;若您想设计一个仅含一个信号和槽函数框架&#xff0c;用以刷新UI上多个类型相同但可能属性各异的控件&#xff0c;我们可以借助QVariant的灵活性来传递不同种类的数据&#xff0c;同时利用控件的名称或某种标…...

【计算机视觉基础CV-图像分类】01- 从历史源头到深度时代:一文读懂计算机视觉的进化脉络、核心任务与产业蓝图

1.计算机视觉定义 计算机视觉&#xff08;Computer Vision&#xff09;是一个多学科交叉的研究领域&#xff0c;它的核心目标是使计算机能够像人类一样“看”并“理解”视觉信息。换句话说&#xff0c;它希望赋予计算机从图像、视频中自动提取、有意义地分析、理解并解释视觉场…...

C# cad启动自动加载启动插件、类库编译 多个dll合并为一个

可以通过引用costura.fody的包&#xff0c;编译后直接变为一个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插件 添加插件后&#xff0c;因为在Mapper代理开发时&#xff0c;Mapper接口要和Mapper.xml映射文件放在同一个报下&#xff0…...

【Spring Security系列】5 次密码错误触发账号锁定?Spring Security 高效实现方案详解

作者&#xff1a;后端小肥肠 &#x1f347; 我写过的文章中的相关代码放到了gitee&#xff0c;地址&#xff1a;xfc-fdw-cloud: 公共解决方案 &#x1f34a; 有疑问可私信或评论区联系我。 &#x1f951; 创作不易未经允许严禁转载。 姊妹篇&#xff1a; 【Spring Security系列…...

笔记day5

文章目录 1 复习2 最完美的解决方案&#xff0c;解决轮播图问题3 开发Floor组件4 把首页中的轮播图拆分为一个共用全局组件5 search模块开发 1 复习 完成商品分类三级列表路由跳转一级路由传参&#xff08;合并参数&#xff09;完成search模块中对于typeNav的使用&#xff08;…...

Linux快速入门-兼期末快速复习使用

Linux快速入门-兼期末快速复习使用 一小时快速入门linux快速一&#xff1a;Linux操作系统概述1. Linux概述1.1 定义与特点1.2 起源与发展1.3 Linux结构1.4 版本类别1.5 应用和发展方向 2. 安装与启动2.1 Windows下VMware安装Linux2.2 安装Ubuntu 快速二&#xff1a;linux的桌面…...

浅谈文生图Stable Diffusion(SD)相关模型基础

1.U-Net模型基础 1.基础概念 UNet模型是一种基于卷积神经网络的图像分割算法&#xff0c;它采用了U型的网络结构&#xff0c;由编码器&#xff08;下采样路径&#xff09;和解码器&#xff08;上采样路径&#xff09;两部分组成。 编码器负责提取输入图像的特征&#xff0c;…...

Vivado使用VScode编译器

旧版Vivado使用Vscode编译器偶尔会出现VScode界面卡死的情况&#xff0c;在新版的Vivado中&#xff08;我的是Vivado 2023.2&#xff09;&#xff0c;可以使用如下方式&#xff1a; 在设置中选择Text Editor&#xff0c;选择Custom Editor 在对话框中输入以下语句&#xff1a;…...

CEF127 编译指南 MacOS 篇 - 拉取 CEF 源码(五)

1. 引言 在完成了所有必要工具的安装和配置后&#xff0c;我们进入到获取 CEF 源码的阶段。对于 macOS 平台&#xff0c;CEF 的源码获取过程需要特别注意不同芯片架构&#xff08;Intel 和 Apple Silicon&#xff09;的区别以及版本管理。本文将详细介绍如何在 macOS 系统上获…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...