docker linux 快速开窗口_技术|如何使用 Docker 快速配置数据科学开发环境?

数据科学开发环境配置起来让人头疼,会碰到包版本不一致、错误信息不熟悉和编译时间漫长等问题。这很容易让人垂头丧气,也使得迈入数据科学的这第一步十分艰难。而且这也是一个完全不常见的准入门槛。

还好,过去几年中出现了能够通过搭建孤立的环境来解决这个问题的技术。本文中我们就要介绍的这种技术名叫Docker。Docker能让开发者简单、快速地搭建数据科学开发环境,并支持使用例如Jupyter notebooks等工具进行数据探索。

要使用Docker,我们要先下载含有相关包(package)和数据科学工具的镜像文件。之后,我们可以通过该镜像,在数秒之内就启动一个数据科学开发环境,免去了手动安装包的麻烦。这个环境,也被成为Docker容器(container)。容器解除了配置的问题——当你启动一个Docker容器后,它就已经处于了良好的状态,所有的包都是可以正常运转的。

除了降低进入数据科学的门槛之外,Docker还可以让我们快速搭建拥有不同Python版本和安装了不同包的孤立环境,不像虚拟环境(virtualenv)那样还要重新安装包。

在本文中,我们将介绍Docker的基础知识,如何安装Docker以及如何利用Docker容器快速地在本地机器上搭建数据科学环境。

虚拟机

能够创建虚拟机的软件已经问世数十年,可以让你在本地电脑上模拟其他的系统环境。举个例子,即使你的电脑运行的是Windows操作系统,你仍可以通过虚拟机运行Linux系统。这可以让你在不重装系统的前提下,使用Linux——也就是说,Linux系统是虚拟化运行的,所以你可以从Windows系统访问虚拟机。基本上,你可以在点击该软件的程序图标之后,看到弹出的窗口中乃是一个Linux系统桌面。而虚拟机需要镜像来启动,也就是你必须先拥有一个目标系统的镜像,才能启动相应的虚拟机。如果你想使用Linux,你使用的镜像就得包含创建Linux环境所必须的全部文件。

容器

尽管虚拟机有诸多好处,例如能够使在Windows平台进行Linux开发成为现实,但是也有着自身的缺陷。首先,虚拟机的启动时间很长,要消耗大量的系统资源。另外,在利用镜像创建完虚拟机中,很难在安装完所需要的包后,再将这个镜像保存,创建为新的镜像。而Docker提供的Linux容器,则通过让多个孤立环境在同一台机器上运行,解决了这个问题。你可以把容器看作是一种更快、更简单地使用虚拟机的方法。

但是,容器的使用却有一点麻烦,而且管理和发布容器镜像也不容易。作为开发人员,我们希望能够快速下载并启动一个拥有指定包和工具配置的数据科学环境。例如,你肯定会希望能快速启动一个安装了Jupyter notebook、spark和pandas的容器。

Docker

Docker容器的里层包裹的是Linux容器(a layer over Linux containers),可以支持更简单地对容器进行管理和发布。使用Docker,可以很容易地下载具备相应包的镜像,并且快速启动。另外,Docker是跨平台的,支持包括Mac、Windows和Linux等系统。

作为创建孤立Python环境的另一种方式,虚拟环境(virtual environment)也有这些优势。但是Docker相较于虚拟环境的主要优势有:

能够快速启动。如果你想马上就开始进行数据分析,使用Docker就免去了你等待各种包进行安装的时间。

配置测试无误。很多时候,要正常安装Python包会,需要以安装某些系统包为前提,并只有在进行相应设置后才能正常使用。如果设置不当,会引起一些很奇怪的错误。但是使用Docker后,这些包就已经配置好了,可以立即使用。

跨平台一致性。Python中的包是可以跨平台使用的,但是在Windows和Linux平台下有些不同,而且还有部分依赖包无法在Windows中安装。但是由于Docker容器运行的都是Linux环境,所以它们是高度一致的。

能够设置checkpoint并且进行恢复。你可以往Docker镜像中安装包,然后将那个checkpoint下的环境创建成一个新的镜像。这让你能够快速撤销或者回滚配置。

运行一个Docker镜像,就相当于创建了一个Docker容器。在本文中,我们在容器中运行一个Jupyter notebook,然后通过浏览器界面来处理数据。

安装Docker

第一步就是安装Docker。Docker官方为Windows和Mac用户提供了一个简便安装过程的图形界面安装器。下面是每个操作系统的安装指南。

在安装时,你需要使用shell命令提示符(shell prompt)。shell命令提示符也被称为终端或命令行,是在你的机器上通过文本界面而非图形界面运行命令的一种方式。例如,你可以在Windows系统中双击记事本就可以打开一个文本编辑器,也可以在Linux终端中输入nano达到这个目的。Docker提供了一个预先配置好的shell,可以用来运行Docker命令。请按照下面的方法操作:

Mac OS —— 从Launchpad中打开Docker Quickstart Terminal程序。详情见本篇文章。

Linux —— 打开任意bash终端,就可以使用docker命令。

Windows —— 双击桌面上的Docker QuickstartTerminal程序的图标。详情见本篇文章。

下文在提到需要运行Docker命令或输入某个命令时,你都需要使用这个shell命令提示符。

下载镜像

下一步是下载你需要的镜像。下面是我们网站(dataquestio)目前提供的数据科学开发专用镜像:

dataquestio/python3-starter —— 这个镜像已经安装好了Python 3, Jupyter notebook和许多其他流行的数据科学库,包括numpy,pandas,scipy,scikit-learn和nltk。

dataquestio/python2-starter —— 这个镜像已经安装好了Python 2, Jupyter notebook和许多其他流行的数据科学库,包括numpy,pandas,scipy,scikit-learn和nltk。

你可以通过输入docker pull IMAGE_NAME命令,下载相应的镜像。如果你想下载dataquestio/python3-starter这个镜像,那么你需要在终端输入docker pull dataquestio/python3-starter命令。输入这段命令后,程序会自动从Docker Hub下载镜像。Docker Hub与Github类似,不过却是Docker镜像的一个中枢。它会将相应的镜像文件下载至你的本地机器,这样你才能利用该镜像创建容器。

新建一个文件夹

在本地创建一个文件夹,用于存放notebooks。这个文件夹中将储存你所有的工作文件,并会持续存在于你的机器中,即使是你销毁了docker容器。在这里,我们将创建下面这个文件夹,/home/vik/notebooks。

运行镜像

镜像下载完成后,你可以通过docker run运行该镜像。我们还需要传入一些选项,确保镜像配置正确。

-p 选项用于设置虚拟机的端口,让我们可以在本地访问Jupyter notebook服务器。

-d 选项用于以detached模式运行容器,也就是作为背景进程运行。

-v 选项让我们指定在本地机器中使用哪个文件夹存储notebook。

完整的运行命令是类似这样的:

docker run -d -p 8888:8888 -v /home/vik/notebooks:/home/ds/notebooks dataquestio/python3-starter

你应该将/home/vik/notebooks更改为你用于存储文件的地址。另外,应该把dataquestio/python3-starter更改为自己喜欢的docker镜像。

执行docker run命令将会创建一个Docker容器。这是与你的本地机器相隔绝的,也可以把它看作是一台单独的电脑。在容器内部,会运行一个Jupyter notebook服务器,并可以让我们使用许多数据科学工具包。

另外,docker run命令也会在终端打印出容器的编码(container id),在通过其他docker容器对该容器进行修改时,就必须要使用这个编码。在下文中我们称该编码为容器编码。

查看notebook服务器

如果你的系统是Linux,那么下一步非常简单——只需要在浏览器中打开localhost:8888,之后应该就能看到运行中的notebook。如果你使用的是Windows或OSX,之前也按照Docker官方安装指南进行了操作,并且安装过程中使用了docker-machine,那么本地机器的名称是default,运行docker-machine ip default命令就可以得知docker容器的ip。如果使用了其他的名字,例如dev,那在命令中将default替换为dev即可。接下来,在浏览器中访问CONTAINER_IP:8888就可以看到notebook(将CONTAINER_IP替换为你的容器编码)。

创建一个notebook

到了这一步,你可以创建一个新的Jupyter notebook测试下这个孤立的开发环境。试试输入下面这个scikit-learn的例子:

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()

添加数据文件

如果你想往开发环境中添加数据文件,你有三个选择。第一个选择,就是将文件放在你之前创建用来存放notebook的文件夹中。你放那里的任何文件将可以自动通过Jupyter notebook中访问。

第二种选择就是使用docker cp命令。docker cp可以从本地机器复制文件至容器中,反之亦然。假设你想拷贝/hom/vik/data.csv文件至一个id为4greg24134的容器中,你可以输入下面的命令:

docker cp /home/vik/data.csv 4greg24134:/home/ds/notebooks

这会将data.csv文件拷贝到容器中用于存放notebook的文件夹中。当然,你可以选择将文件放到容器中的任何地方,但是把它们放在存放notebook的文件夹忠厚,你就可以轻松地通过Jupyter notebook访问这些文件了。

第三个选择就是使用Jupyter notebook首页右上方的upload按钮。这可以让你选择一个文件,并上传到容器中用于存放notebook的文件夹中。

不管你使用哪种方法,要想在Jupyter notebook中加载文件,需要按照类似下面的方式进行:

import pandas

data = pandas.read_csv("data.csv")

复制容器中的数据文件

你可能会需要从容器中拷贝文件至本地机器。最容易的办法就是把文件放置在/home/ds/notebooks文件夹中,这样的话这些文件就会自动映像到本地机器。

另一种方法也就是利用docker cp命令。假设你想从id为4greg24314的容器中,把/home/ds/notebooks/data.csv文件拷贝至本地机器的/home/vik/文件夹中,你可以输入下面的命令:

cp 4greg24134:/home/ds/notebooks/data.csv /home/vik/data.csv

最后一种方法就是使用Jupyter界面中的download选项。在网页模式下点击一个不是notebook的文件,将会将其下载至本地。如果你已经打开了一个notebook,那么可以先点击File,然后选中download as就可以下载至本地。

安装更多的工具包

如果你想在容器中安装更多的工具包,你可以通过正常的bash命令行命令就可以实现。要想在容器中执行这些命令,你需要运行docker exec命令。这个命令接受容器的id作为参数,以及一个期望运行的命令。例如输入docker exec -it 4greg24134 /bin/bash将会在编码为4greg24134的容器中开启一个shell命令提示符。-it选项确保我们在容器中打开了一个输入会话,并且可以输入命令。

在运行docker exec命令之后,你就会看到容器中的shell命令提示符出现。容器此时正通过一个名为ds的虚拟环境运行Python程序,这个虚拟环境已经是处于激活状态的。

接下来,只需要输入pip install PACKAGE_NAME就可以安装其他的工具包。例如,你可以使用pip install requests来安装requests。

当你希望退出容器的shell终端时,只需要输入exit即可。

关闭docker容器

在完成数据处理工作之后,你就可以通过docker rm -f CONTAINER_ID来停止docker容器。你应该输入之前获得的容器编码。如果你忘了,你可以运行docker ps查看。容器停止运行之后,notebooks会继续存放在你本地用于存放的文件夹中。

更进一步

Docker镜像是通过Dockerfile创建的。Dockerfile指定了镜像中应该安装的包和工具。通过修改Dockerfile,你就可以改变镜像默认按照的包和工具。

如果你想在本文中所使用的镜像基础上做一定修改,可以向我们的Github仓库提交PR,这个仓库中包含了镜像的Dockerfile。我们欢迎大家参与改善当前的镜像,或是添加其他安装了非Python包和工具的镜像。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560861.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(递归3)最大公约数

题目给定两个正整数&#xff0c;求它们的最大公约数。 输入 输入一行&#xff0c;包含两个正整数(<1,000,000,000)。 输出 输出一个正整数&#xff0c;即这两个正整数的最大公约数。 样例输入 6 9 样例输出 3 提示 求最大公约数可以使用辗转相除法&#xff1a; 假…

服务器搭建维护,服务器搭建维护方法

服务器搭建维护方法 内容精选换一换登录Windows操作系统的弹性云服务器时&#xff0c;需使用密码方式登录。因此&#xff0c;用户需先根据创建弹性云服务器时使用的密钥文件&#xff0c;获取该弹性云服务器初始安装时系统生成的管理员密码(Administrator帐户或Cloudbase-init设…

(递归4)放苹果

描述 把M个同样的苹果放在N个同样的盘子里&#xff0c;允许有的盘子空着不放&#xff0c;问共有多少种不同的分法&#xff1f;&#xff08;用K表示&#xff09;5&#xff0c;1&#xff0c;1和1&#xff0c;5&#xff0c;1 是同一种分法。 输入 第一行是测试数据的数目t&…

魔兽怀旧服服务器怎么修改,《魔兽世界怀旧服》转服功能怎么用 转服功能使用方法教程...

导读魔兽世界怀旧服不少玩家都处在高负载服务器中&#xff0c;这不仅对于服务器压力太大&#xff0c;而且对于玩家的游戏体验也不好&#xff0c;近期魔兽世界怀旧服免费角色转移功能开放&#xff0c;缓解玩家的压力和带来更好的游戏体验&#xff0c;下面小编就给大家带来魔兽..…

mac os touch命令_Mac系统忘记开机密码怎么办?

Hi~我是系统派~使用Windows系统的小伙伴都知道忘记开机密码可以通过PE工具解除实在不行还可以重装系统如果你手上的是Mac电脑同样也是不记得登录密码了有没有相似的解决方案呢&#xff1f;本教程教你两种Mac系统重置开机密码的方法万一哪天真的不记得密码了可以尝试解除千万别干…

(递归5)全排列

题目&#xff1a; 算法竞赛入门经典例7-2-1&#xff1a;输入整数n&#xff0c;按字典序从小到大的顺序输出前n个数的 所有排列 A&#xff1a;已确定的前缀数列 S&#xff1a;需要进行全排列的元素集合 伪代码&#xff1a; void print_permutation(序列A, 集合S) { if(…

sql2012怎样修改服务器名称,sql2012服务器名称怎么设置

sql2012服务器名称怎么设置 内容精选换一换您可以借助报表服务制作各种各样的报表&#xff0c;无论是简单的还是复杂的报表&#xff0c;同时系统提供订阅功能方便用户对报表进行订阅。本文主要介绍RDS使用SSRS(Reporting Services)报表服务。微软的Microsoft SQL Server产品中包…

超声波测距仪编程_超声波测距仪参考(含原理图程序)

1绪论当前社会经济的不断发展和工业科学技术的不断提高&#xff0c;汽车已逐渐进入不少百姓家。汽车使用数量的不断增加&#xff0c;从而由此导致的倒车交通安全问题也非常严重&#xff0c;道路交通压力增加&#xff0c;交通安全问题也是面临严峻挑战。在面临如此严峻的交通安全…

(回溯4)部分全排列

题目设有n个整数的集合&#xff5b;1&#xff0c;2&#xff0c;…&#xff0c;n&#xff5d;&#xff0c;从中任意取出r个数进行排列&#xff08;r< n&#xff09;&#xff0c;试着列出所有排列 #include <iostream> using namespace std; bool vis[100]; int total0…

vue.js将本地文件上传到ftp服务器,vue项目使用FTP传输部署项目服务器,node命令编写...

#!/usr/bin/env nodevar fs require(fs); // 引入需要模块var vinylFs require( vinyl-fs );var ftp require( vinyl-ftp );var vueConfig require(../vue.config) //这里是为了抓取打包文件名称var env process.argv[2]?process.argv[2].replace(…

python程序员可以做到多少岁_程序员一般做到多少岁,那些70后的程序员都消失了?...

在娱乐圈&#xff0c;哦不&#xff0c;是在程序员这个吃青春饭的行业&#xff0c;有一个人人闻之色变的话题&#xff0c;曰&#xff1a;「年老色衰」。只要是个程序员&#xff0c;心里都会惴惴不安的想&#xff1a;「我老了以后卖不动色相&#xff0c;哦不&#xff0c;写不动代…

(递归7)生成可重集的排列

题目 输入数组P&#xff0c;并按字典序输出数组A各元素的所有全排列 P数组&#xff1a;是存储基本数据的 A数组&#xff1a;是储存答案的 cur&#xff1a;当前需要确定的元素位置时存答案的位数的 c1&#xff0c;c2&#xff1a;做标记&#xff0c;if满足条件后再进行下次递…

利用next_permutation解答全排列问题

枚举所有排列的另一个方法是从字典序最小排列开始&#xff0c;不停调用“求下一个排列”的过 程。 全排列的个数A(N,N)(N)(N-1)…*2*1N! 下一个排列&#xff1a;通常按照升序顺序&#xff08;字典序&#xff09;获得下一个排列 stl next_permutation找下一个排列的算法 如…

根据大小分割大文本_场景文本检测—CTPN算法介绍

SIGAI特约作者&#xff1a;沪东三哥 原创声明:本文为SIGAI 原创文章&#xff0c;仅供个人学习使用&#xff0c;未经允许&#xff0c;不得转载&#xff0c;不能用于商业目的。其它机器学习、深度学习算法的全面系统讲解可以阅读《机器学习-原理、算法与应用》&#xff0c;清华大…

(贪心1)排队接水

问题描述   有n个人排队到r个水龙头去打水&#xff0c;他们装满水桶的时间t1、t2………..tn为整数且各不相等&#xff0c;应如何安排他们的打水顺序才能使他们总共花费的时间最少&#xff1f; 输入格式   第一行n&#xff0c;r (n<500,r<75)   第二行为n个人打…

vue 跳添加编辑页面传两个值_vue两个组件间值的传递或修改方式

1、可以用公共的父组件来实现&#xff1b;2、可以在store.js里面在设置公共变量&#xff1b;3、也可以用本地存储localStorage.setItem()和localStorage.getItem()&#xff0c;通过修改本地存储的值和获取修改后的值来实现&#xff1b;4、就是父子组件间的值的传递与修改props&…

(贪心)均分纸牌

题目描述 有 N 堆纸牌&#xff0c;编号分别为 1&#xff0c;2&#xff0c;…, N。每堆上有若干张&#xff0c;但纸牌总数必为 N 的倍数。可以在任一堆上取若于张纸牌&#xff0c;然后移动。移牌规则为&#xff1a;在编号为 1 堆上取的纸牌&#xff0c;只能移到编号为 2 的堆上…

agilebpm脑图_设计开发平台前端框架介绍 | AgileBPM 敏捷工作流开发平台—开源免费-基于 Activiti 工作流引擎、Flowable...

目前设计平台前端是独立部署的&#xff0c;引入了 Angular 和 Vue&#xff0c;您可以根据自己技术强项 选择使用 Angular 或者 Vue&#xff0c;他们引入的成本都很小。比如我们团队使用 Angular 很多年了&#xff0c;依赖注入&#xff0c;模块化概念很舒服&#xff0c;使用它构…

(贪心)删数问题

题目&#xff1a; 键盘输入一个高精度的正整数&#xff4e;&#xff08;<240位&#xff09;&#xff0c; 去掉任意&#xff53;个数字后剩下的数字按原左右次序将组成一个新的正整数。 编程对给定的&#xff4e;和&#xff53;&#xff0c;寻找一种方案&#xff0c;使得剩…

alsa的动态库安装在哪里_Linux链接库一(动态库,静态库,库放在什么路径下)...

http://www.cppblog.com/wolf/articles/74928.htmlhttp://www.cppblog.com/wolf/articles/77828.htmlhttp://www.jb51.net/article/34990.htm大部分内容抄的以上文章的。1 库的分类根据链接时期的不同&#xff0c;库又有静态库和动态库之分。静态库是在链接阶段被链接的(好像是…