内容简介:Docker是“一种实现在操作系统层面的虚拟化软件,也称为容器”。这是Wikepedia的定义,对于不熟悉的人来说太晦涩难懂了。简单说,Docker是一类程序,使得在自己的机器上(称为host)调度(启动或者停止)多个操作系统(称为容器)。假设有10台运行不同Linux系统的树莓派,每台都运行不同服务,实际上可以在自己的机器上启停这些树莓派设备。Docker可以实现在映像或者容器中内置环境,意味着可以在Macbook上运行Linux,或者在本机运行R 3.5而同时在虚机里运行R 3.3环境。同时,也意味着为
什么是Docker
Docker是“一种实现在操作系统层面的虚拟化软件,也称为容器”。这是Wikepedia的定义,对于不熟悉的人来说太晦涩难懂了。
简单说,Docker是一类程序,使得在自己的机器上(称为host)调度(启动或者停止)多个操作系统(称为容器)。假设有10台运行不同 Linux 系统的树莓派,每台都运行不同服务,实际上可以在自己的机器上启停这些树莓派设备。
为什么要在R中使用Docker
Docker可以实现在映像或者容器中内置环境,意味着可以在Macbook上运行Linux,或者在本机运行R 3.5而同时在虚机里运行R 3.3环境。同时,也意味着为某些特殊目的在虚拟环境中使用较老版本的环境包,而本机则保持最新状态。
这样可以解决“依赖性”问题,如果担心环境改变会影响最新华景,可以建立一个虚拟容器运行需要的环境,可以是Linux、R或者任何其他需要的包。
Docker映像和 Docker 容器
在机器上,需要两类东西,映像和容器。映像可以看做操作系统,而容器可以认为是映像的运行态。映像只需要运行一次,而容器则在需要时候随时启动,当然一个映像可以同时运行多个实例。
和R对比,安装和装载package类似于映像和容器,一个package只需要下载一次,但是可以运行多个实例。同样在metaphore概念上也有类比:通过install.packages()来编译映像,用library()来运行映像。
Dockerfile
Docker映像根据Dockerfile建立。Dockerfile是配置文件,其中定义了:依赖的docker映像,如何配置操作系统,运行容器时做什么。有点类似于R包中的DESCRIPTION NAMESPACE文件,其中也定义了依赖包,元信息,以及使用library调用后用户可用的函数和数据。
因此,可以为R写一个非常基础的Dockerfile文件,目的是可重复性。也就是说:假如生成了一个分析环境(例如,在一个R文件中定义),而且希望不管以后系统如何升级这个分析环境仍然可以工作。
首先,创建一个分析目录和Dockerfile:
mkdir ~/mydocker cd ~/mydocker touch Dockerfile
假如运行程序为位于~/mydocker目录下的myscript.R:
library(tidystringdist) df <- tidy_comb_all(iris, Species) p <- tidy_stringdist(df) write.csv(p, "p.csv")
FROM
每个dockerfile都以FROM开头,定义从哪个image开始创建。网上有很多官方发布的映像,也可以从本地自己建一个开始。FROM定义了映像的依赖关系,就跟R中生成一个包需要依赖一个另外的包一样(当然一般都是依赖base包)。
如果需要一个基于R的基础包,Dirk Eddelebuettel和Carl Boettiger维护了 rocker ,这里集中了R可以使用的所有容器映像。基础包位于rocker/r-base下,我们期望映像可以重现,也就是任何时候运行都会产生同样的结果,为了达到目的,在rocker/r-ver目录下维护了3.1.0版本之前的R,这样可以运行任何日期之前的程序(感谢Dirk Eddelebuettel)。接下来我们需要查找满足R要求的映像,可以使用如下命令获得R版本:
R.Version()$version.string
因此,可以以如下标识开始一个Dockerfile:
FROM rocker/r-ver:3.4.4
RUN
到这一步,可以加入一些运行时的短指令,例如创建接收分析数据的目录:
FROM rocker/r-ver:3.4.4 RUN mkdir /home/analysis
Install our package
这条命令让R执行一些命令行,R -e "my code",用这个模式在特定日期安装依赖脚本,可以设置“repos”到特定日期,并且使用CRAN的映像。
FROM rocker/r-ver:3.4.4 RUN mkdir /home/analysis RUN R -e "options(repos = \ list(CRAN = 'http://mran.revolutionanalytics.com/snapshot/2019-01-06/')); \ install.packages('tidystringdist')"
Aside : making it more programmable with ARG
如果使用ARG参数可以修改生成时间,参数是:--build-arg WHEN=
FROM rocker/r-ver:3.4.4 ARG WHEN RUN mkdir /home/analysis RUN R -e "options(repos = \ list(CRAN = 'http://mran.revolutionanalytics.com/snapshot/${WHEN}')); \ install.packages('tidystringdist')"
{tidystringdist} 将会安装我们要求日期的版本,即使我们在很久之后才执行这条命令。
COPY
现在,需要将主机上的分析脚本放到容器中,可以使用COPY localfile pathinthecontainer 方式。注意这里的myscript.R和Dockerfile要在同一个目录下:
FROM rocker/r-ver:3.4.4 ARG WHEN RUN mkdir /home/analysis RUN R -e "options(repos = \ list(CRAN = 'http://mran.revolutionanalytics.com/snapshot/${WHEN}')); \ install.packages('tidystringdist')" COPY myscript.R /home/analysis/myscript.R
CMD
CMD是每次运行docker都要运行的命令。
FROM rocker/r-ver:3.4.4 ARG WHEN RUN mkdir /home/analysis RUN R -e "options(repos = \ list(CRAN = 'http://mran.revolutionanalytics.com/snapshot/${WHEN}')); \ install.packages('tidystringdist')" COPY myscript.R /home/analysis/myscript.R CMD R -e "source('/home/analysis/myscript.R')"
Build 和 run
Build
我们的需求是:运行过去日期的分析工作,需要使用 --build-arg WHEN= 参数,只要在=后加入日期即可。在终端Dockerfile目录下,运行:
docker build --build-arg WHEN=2019-01-06 -t analysis .
-t name是映像的名字,. 意味着Dockerfile在同一个目录下
run
执行命令:
docker run analysis
分析作业即可被执行。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 使用二进制保存用户状态
- Laravel 用户授权系统使用小结
- 使用装饰器完成用户身份验证
- 使用 FCM 通知您的用户
- 使用Redis保存用户会话Session
- 039.Python使用TCP实现多用户并发
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
鸟哥的Linux私房菜
鸟哥 / 人民邮电出版社 / 2010-6-28 / 88.00元
本书是最具知名度的Linux入门书《鸟哥的Linux私房菜基础学习篇》的最新版,全面而详细地介绍了Linux操作系统。全书分为5个部分:第一部分着重说明Linux的起源及功能,如何规划和安装Linux主机;第二部分介绍Linux的文件系统、文件、目录与磁盘的管理;第三部分介绍文字模式接口 shell和管理系统的好帮手shell脚本,另外还介绍了文字编辑器vi和vim的使用方法;第四部分介绍了对于系......一起来看看 《鸟哥的Linux私房菜》 这本书的介绍吧!