应用Docker+Jupyter快速搭建数据科研环境
itomcoil 2025-03-26 13:07 8 浏览
配置一个数据科研环境是一个非常痛苦的过程。比如处理各个软件包版本的一致性问题,必须非常深入理解并解决模糊晦涩的错误消息,再加上无数漫长的等待各个包的编译过程是非常令人沮丧的。这成为了数据科研难以上手的首要因素,并且是完全的没有规律可循。
在过去的几年中我们能看到有多种技术产生,来帮助我们创建隔离化的环境。在此我们将主要关注一个技术:Docker。Docker的出现让创建一个新的数据科研环境变得更快更容易,并且可以引入如Jupyter这样的工具来帮助探索你的数据。
基于Docker,我们可以下载一个镜像文件,其中已经包含了一系列的软件包和数据科研工具。我们可以基于这个镜像在极短时间内启动数据科研环境,不必花费漫长的时间来人工挨个安装编译各个软件包。这个环境就是Docker容器。容器可以帮助我们消除配置问题,即当容器被启动时,它就已经是一个所有软件包都正常工作的良好状态。
除了降低数据科研的入门门槛,Docker也可以用于快速创建虚拟环境来隔离不同的Python和其他软件包版本,而不再需要漫长的逐个安装过程。
在这个文章中,我们将会覆盖基本的Docker操作,在你自己的机器上:如何安装,如何利用Docker容器快速启动数据科研。
虚拟机
创建虚拟机的软件技术已经存在的几十年。虚拟机允许你在自己的机器上模拟其他机器环境。比如,你可以在虚拟机上跑Linux,即使你的物理机上跑的是windows。这将让你使用Linux,而不必实际在机器上安装它,它将是完全虚拟运行的,所以你能在windows之中使用Linux。实质上,你可以点击一个程序,然后Linux的桌面就会在Windows之中弹出。虚拟机使用镜像来启动,你必须使用所需要对应的操作系统镜像来启动虚拟机。假如你需要使用Linux,你必须使用包含所有必须文件的Linux镜像来创建这样的Linux环境。
一个在Linux上跑Windows的例子
容器
虽然虚拟机运行你在Windows上进行Linux的开发,但是它们也会有一些负面影响。虚拟机启动的时间会更长,会占用显著的系统资源,而且很难基于一个虚拟机镜像之上安装其他软件包,并以此创建新的镜像。Linux容器解决了这个问题,使得多个隔离的环境可以在同一台机器上运行。你可以把容器想象成更快,更方便的方式去使用虚拟机。
不幸的是,容器的使用有点棘手,并且容器的镜像管理和分发并不那么容易。我们所需要的功能是,让我们能快速下载并启动基于特殊的软件包和工具配置的数据科研环境。例如,你可能希望能快速启动一个已经包含了Jupyter,spark,pandas等软件包的镜像。
Docker
Docker容器是基于Linux容器之上的一个封装层,使得容器更容易被管理和分发。Docker也让我们能够更方便的下载对应一系列特定软件包的镜像,并快速启动。同时它也是跨平台的,可以工作于Mac,Windows,Linux。
虚拟环境同样具备这些优点,比如创建隔离化的Python环境。那么Docker比虚拟机环境更加有优势的是哪些:
- 快速启动。当你需要启动项目并分析数据时,你完全不需要等待任何软件包安装。
- 良好配置。大多数时候,Python软件包需要其他系统包以及配置的支持。这可能导致一些奇怪的问题。基于Docker,这些都已经被安装和配置完毕。
- 跨平台一致性。Python软件包是跨平台的,但是部分行为在Linux和Windows上是不一样的,并且部分相关库是无法在Windows上安装的。Docker容器总是运行于Linux环境内,所以它们永远一致。
- 设立检查点并恢复。你可以在Docker镜像中安装新软件包,然后基于这个检查点创建新的镜像。这样就可以很方便的回滚之后所做的任何改动和配置。
每一个Docker镜像运行都会创建一个Docker容器。对于我们的目的,我们可以在容器内运行Jupyter,并且使用网络浏览器来观察分析我们的数据。
安装Docker
第一步就是安装Docker。在Windows和Mac上有很方便的图形化界面安装程序。下面就是具体规格操作系统下的安装指导:
作为安装程序的一部分,你会需要先打开一个命令提示符窗口,或者也被称为终端或者命令行窗口。是一种文本界面,而不是图形化运行的计算机命令交互接口。比如,你即可以通过在windows下双击“notepad”来启动一个文本编辑器,也可以在Linux的终端下键入命令“nano”来实现同样的效果。
每个操作系统都会有相应的预配置好的命令提示符来应用Docker命令。更多信息见如下:
- Mac OS - 从启动面板来启动Docker快速启动终端。更多细节在此
- Linux - 启动任意bash终端,Docker都已经准备好
- Windows- 从桌面上点击启动Docker快速启动终端。更多细节在此
在接下来的操作中,你也会需要使用同样的命令提示符来执行任意文章提及的Docker命令。
下载镜像
下一步就是下载你所需要的镜像。以下是我们当前已有的数据科研镜像:
-
dataquestio/python3-starter – 这个包含了Python 3,Jupyter notebook以及其他很多热门的数据科研库,比如:numpy, pandas, scipy, scikit-learn,nltk.
-
dataquestio/python2-starter – 这个包含了Python 2,Jupyter notebook以及其他很多热门的数据科研库,比如:numpy, pandas, scrapy,scipy, scikit-learn,nltk.
你可以通过键入 Docker pull IMAGE_NAME来下载你所需要的镜像。比如,你需要下载
dataquestio/python3-starter,你需要在命令提示符里键入docker pull
dataquestio/python3-starter。这个的目的就是从Docker hub(比如GitHub)下载镜像文件到你的机器上,然后你就可以启动容器并使用这些镜像。
运行镜像
一旦镜像已经被下载,你就可以开始通过命令Docker run运行它。我们需要设置少数几个参数来保证它正确配置和执行。
- -p :该标志指定端口号用于我们从本地机器访问容器内的Jupyter服务器
- -d :该标志指定容器派遣模式,并在后台运行
- -v :该标志指定Jupyter可以访问存储数据的本地机器目录
这里你应该把/home/vik/notebooks换成你实际存储Jupyter数据的文件夹。并且把
dataquestio/python3-starter换成你实际使用的Docker镜像。
执行docker run即可生成Docker容器。它是从你的本地机器上隔离的,你甚至可以把它想象成一个独立的机器。在容器内部,Jupyter将会运行,并且我们可以访问许多其他数据科研软件。
Docker run执行之后会打印输出一长字符串。这个字符串即是你容器的唯一标识,并且它也被用于修改容器,该唯一的标识会把它和其他容器区别开来。从现在开始我们将把它作为容器的标识。
查看Jupyter服务器
假如你当前跑在Linux上,下一步非常简单-直接访问localhost:8888即可,你应该能够看到Jupyter正在执行。如果你是跑在Windows或者OSX上,那么你需要按照之前给出Docker的安装文档指示,使用Docker安装步骤中的docker-machine。假设你的本地机器名为default,那么执行docker-machine ip default将会告诉你当前你的Docker容器的IP地址。假如你机器用的是不同名字,那么简单替换掉命令中的default即可。然后你可以通过CONTAINER_IP:8888来看到你当前Jupyter的运行情况(这里需要把CONTAINER_IP替换为之前查询到的容器IP)。
制作Jupyter笔记
在这一步,你可以生成一个新的Jupyter笔记来测试系统的工作情况。尝试执行一段scikit代码,更多示例见此:
from sklearn import datasets
from sklearn.cross_validation import cross_val_predict
from sklearn import linear_model
import matplotlib.pyplot as plt
%matplotlib inline
lr = linear_model.LinearRegression
boston = datasets.load_boston
y = boston.target
predicted = cross_val_predict(lr, boston.data, y, cv=10)
fig, ax = plt.subplots
ax.scatter(y, predicted)
ax.plot([y.min(), y.max()], [y.min(), y.max()], 'k--', lw=4)
ax.set_xlabel('Measured')
ax.set_ylabel('Predicted')
plt.show
增加数据文件
假如你需要往这个环境中添加数据文件,你有三种选择。第一个是把它们放到你之前创建的给Jupyter用的文件夹中。放在这个位置的任意文件都自动能被Jupyter访问到。
第二种方法是使用docker cp命令。Docker CP能够从本地机器中拷贝文件到容器中,反之亦然。假设你想要拷贝一个文件/home/vik/data.csv到容器(其ID为4greg24134)中。你可以输入命令如下docker cp /home/vik/data.csv
4greg24134:/home/ds/notebooks,这就把data.csv拷贝到了容器的notebooks目录下。当然,你可以把文件拷贝到任意位置,把它们拷贝到notebooks目录只是为了让Jupyter访问方便。
第三种是使用Jupyter笔记主页面右上角的上传按钮。你可以选择文件并直接上传到容器中的notebooks目录。
无论你使用哪种方法,你还需要使用下列命令在Jupyter内部加载这些数据文件。
import pandas
data = pandas.read_csv("data.csv")
从容器中拷贝文件
你可能也需要从容器中拷贝文件到你的本地机器上。最简单的办法就是把这些文件放在/home/ds/notebooks文件夹里,这样它们就会被自动镜像到你的本地机器。
另一个选项是同样使用Docker cp。假如你需要拷贝容器(id为4greg24134 )内文件
/home/ds/notebooks/data.csv到你本地机器的文件夹/home/vik/。你可以键入如下命令:docker cp
4greg24134:/home/ds/notebooks/data.csv /home/vik/data.csv。
最后一个办法是使用Jupyter的下载。点击浏览器内的任意非笔记格式文件,它就会被下载到你本地机器。假如是需要下载Jupyter笔记文件,那么点击该文件并且选择“Download as”即可下载它到你的本地机器。
安装更多的包
如果你需要在容器内安装你自己的软件包,你可以进入容器并执行任何正常的bash命令。你需要首先执行docker exec来进入容器。Docker exec的执行需要输入指定的容器id以及命令。例如,键入docker exec -it 4greg24134 /bin/bash就会打开容器为id 4greg24134的命令提示符。这里的-it标识是标明我们要保持输入会话并且键入命令。
在执行Docker exec后,你会被放到一个容器内的命令提示符。Python在容器的虚拟环境中已经在运行,它被称为ds,并且应该已经是被激活的。
假设你需要安装任何包,只需要键入pip install PACKAGE_NAME。例如你可以用如下命令安装requests,pip install requests。
当你需要退出容器的命令提示符时,键入exit即可。
关闭docker容器
当工作完成后,我们应当关闭docker容器。使用命令docker rm -f CONTAINER_ID来停止容器。这里的容器id就是之前我们所得到的id。假如你没有,可以使用docker ps来查询。你的Jupyter笔记会仍然存在于本地机器中,即使在容器被关闭之后,它仍会保存在你之前创建的文件夹。
创建容器镜像
容器镜像由Dockerfiles来创建。Dockerfiles会标明哪些包和工具应该被安装到具体的镜像中。你可以通过修改Dockerfiles来变更镜像中的任意默认包和工具。
假如你想基于这个文章中我们所讨论过的镜像来创建新的镜像。你可以贡献它们到Github上,这里包含了dockerfiles。我们也欢迎任何帮助我们改善当前镜像,或者是贡献新的不仅仅是针对Python的工具镜像。
关于译者:王旭敏,Nokia开发工程师,关注云计算、高性能或可用等架构、容器等。
相关推荐
- Excel新函数TEXTSPLIT太强大了,轻松搞定数据拆分!
-
我是【桃大喵学习记】,欢迎大家关注哟~,每天为你分享职场办公软件使用技巧干货!最近我把WPS软件升级到了版本号:12.1.0.15990的最新版本,最版本已经支持文本拆分函数TEXTSPLIT了,并...
- Excel超强数据拆分函数TEXTSPLIT,从入门到精通!
-
我是【桃大喵学习记】,欢迎大家关注哟~,每天为你分享职场办公软件使用技巧干货!今天跟大家分享的是Excel超强数据拆分函数TEXTSPLIT,带你从入门到精通!TEXTSPLIT函数真是太强大了,轻松...
- 看完就会用的C++17特性总结(c++11常用新特性)
-
作者:taoklin,腾讯WXG后台开发一、简单特性1.namespace嵌套C++17使我们可以更加简洁使用命名空间:2.std::variant升级版的C语言Union在C++17之前,通...
- plsql字符串分割浅谈(plsql字符集设置)
-
工作之中遇到的小问题,在此抛出问题,并给出解决方法。一方面是为了给自己留下深刻印象,另一方面给遇到相似问题的同学一个解决思路。如若其中有写的不好或者不对的地方也请不加不吝赐教,集思广益,共同进步。遇到...
- javascript如何分割字符串(javascript切割字符串)
-
javascript如何分割字符串在JavaScript中,您可以使用字符串的`split()`方法来将一个字符串分割成一个数组。`split()`方法接收一个参数,这个参数指定了分割字符串的方式。如...
- TextSplit函数的使用方法(入门+进阶+高级共八种用法10个公式)
-
在Excel和WPS新增的几十个函数中,如果按实用性+功能性排名,textsplit排第二,无函数敢排第一。因为它不仅使用简单,而且解决了以前用超复杂公式才能搞定的难题。今天小编用10个公式,让你彻底...
- Python字符串split()方法使用技巧
-
在Python中,字符串操作可谓是基础且关键的技能,而今天咱们要重点攻克的“堡垒”——split()方法,它能将看似浑然一体的字符串,按照我们的需求进行拆分,极大地便利了数据处理与文本解析工作。基本语...
- go语言中字符串常用的系统函数(golang 字符串)
-
最近由于工作比较忙,视频有段时间没有更新了,在这里跟大家说声抱歉了,我尽快抽些时间整理下视频今天就发一篇关于go语言的基础知识吧!我这我工作中用到的一些常用函数,汇总出来分享给大家,希望对...
- 无规律文本拆分,这些函数你得会(没有分隔符没规律数据拆分)
-
今天文章来源于表格学员训练营群内答疑,混合文本拆分。其实拆分不难,只要规则明确就好办。就怕规则不清晰,或者规则太多。那真是,Oh,mygod.如上图所示进行拆分,文字表达实在是有点难,所以小熊变身灵...
- Python之文本解析:字符串格式化的逆操作?
-
引言前面的文章中,提到了关于Python中字符串中的相关操作,更多地涉及到了字符串的格式化,有些地方也称为字符串插值操作,本质上,就是把多个字符串拼接在一起,以固定的格式呈现。关于字符串的操作,其实还...
- 忘记【分列】吧,TEXTSPLIT拆分文本好用100倍
-
函数TEXTSPLIT的作用是:按分隔符将字符串拆分为行或列。仅ExcelM365版本可用。基本应用将A2单元格内容按逗号拆分。=TEXTSPLIT(A2,",")第二参数设置为逗号...
- Excel365版本新函数TEXTSPLIT,专攻文本拆分
-
Excel中字符串的处理,拆分和合并是比较常见的需求。合并,当前最好用的函数非TEXTJOIN不可。拆分,Office365于2022年3月更新了一个专业函数:TEXTSPLIT语法参数:【...
- 站长在线Python精讲使用正则表达式的split()方法分割字符串详解
-
欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是《在Python中使用正则表达式的split()方法分割字符串详解》。使用正则表达式分割字符串在Python中使用正则表达式的split(...
- Java中字符串分割的方法(java字符串切割方法)
-
技术背景在Java编程中,经常需要对字符串进行分割操作,例如将一个包含多个信息的字符串按照特定的分隔符拆分成多个子字符串。常见的应用场景包括解析CSV文件、处理网络请求参数等。实现步骤1.使用Str...
- 因为一个函数strtok踩坑,我被老工程师无情嘲笑了
-
在用C/C++实现字符串切割中,strtok函数经常用到,其主要作用是按照给定的字符集分隔字符串,并返回各子字符串。但是实际上,可不止有strtok(),还有strtok、strtok_s、strto...
- 一周热门
- 最近发表
- 标签列表
-
- ps像素和厘米换算 (32)
- ps图案在哪里 (33)
- super().__init__ (33)
- python 获取日期 (34)
- 0xa (36)
- super().__init__()详解 (33)
- python安装包在哪里找 (33)
- linux查看python版本信息 (35)
- python怎么改成中文 (35)
- php文件怎么在浏览器运行 (33)
- eval在python中的意思 (33)
- python安装opencv库 (35)
- python div (34)
- sticky css (33)
- python中random.randint()函数 (34)
- python去掉字符串中的指定字符 (33)
- python入门经典100题 (34)
- anaconda安装路径 (34)
- yield和return的区别 (33)
- 1到10的阶乘之和是多少 (35)
- python安装sklearn库 (33)
- dom和bom区别 (33)
- js 替换指定位置的字符 (33)
- python判断元素是否存在 (33)
- sorted key (33)