如何在CDSW中定制Docker镜像

温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。 Fayson的github:https://github.com/fayson/cdhproject 提示:代码块部分可以左右滑动查看噢

1.文档编写目的


前面Fayson介绍了Cloudera的产品CDSW(Cloudera Data Science WorkBench)的安装及示例代码的运行,在《如何基于CDSW基础镜像定制Docker》中已经介绍了Docker镜像的定制,在这里我们基于CDSW1.2.2的基础镜像来再次描述下。

在使用的过程中,如果用户的环境与公网是通的则还好,对于多数企业来说搭建CDSW平台都是在业务网无法访问外网,在需要使用第三方Packages时比较麻烦需要将包从外网下载然后上传至Docker容器使用命令进行安装,对于有依赖的包安装时更加麻烦,本篇文章主要介绍如何深度定制CDSW的Docker镜像。在学习本章知识前,你可能需要了解以下知识:

《如何在Windows Server2008搭建DNS服务并配置泛域名解析》

《如何利用Dnsmasq构建小型集群的本地DNS服务器》

《如何在Windows Server2012搭建DNS服务并配置泛域名解析》

《如何在CDH5.13中安装CDSW1.2》

《如何在CDSW中使用R绘制直方图》

《如何使用CDSW在CDH集群通过sparklyr提交R的Spark作业》

  • 内容概述

1.配置Python和R的私有源地址

2.预装Python和R的依赖包

3.定制Docker镜像及自定义镜像在CDSW中使用

4.测试及总结

  • 测试环境

1.RedHat7.2

2.CDSW1.2.2

  • 前置条件

1.Python私有源已搭建

2.R私有源已搭建

2.查看镜像并使用镜像启动一个容器


1.使用管理员登录CDSW查看当前使用的Docker镜像

可以看到当前使用的镜像为docker.repository.cloudera.com/cdsw/engine:4

2.登录CDSW Master服务器上使用如下命令查看镜像

[root@cdsw1 ~]<20180123 15:04:00># docker images

(可左右滑动)

3.通过如下命令使用docker.repository.cloudera.com/cdsw/engine:4镜像启动一个容器

[root@cdsw1 ~]<20180123 15:06:30># docker run -it --network='host' docker.repository.cloudera.com/cdsw/engine:4 /bin/bash

(可左右滑动)

如上图所示我们已成功启动了一个Docker容器。

3.配置Python私有源


在前面章节我们已成功找到了CDSW使用的镜像并使用docker命令启动了该镜像的一个容器,那么我们在这个启动的容器里配置Python的私有源。

1.编辑/etc/pip.conf配置文件,文件内容如下

root@cdsw1:/home/cdsw# vim /etc/pip.conf 
[install]
user = true
trusted-host=99.12.105.77
[global]
index-url=http://99.12.105.77:8081/artifactory/api/pypi/pypi/simple

(可左右滑动)

注意:user = true配置表示是否允许非root用户使用pip命令安装依赖包。

2.保存配置文件,测试私有源是否正常

root@cdsw1:/home/cdsw# pip install bit-array

(可左右滑动)

从上面安装bit-array包可以看到是从私有源地址进行下载的,到此我们的Python私有源地址就配置完成。

4.预装Python包


前面一章节我们配置好了Python的私有源地址,接下来就可以安装我们需要的Python包了,在基础镜像中安装需要的依赖包后,在新建的工程中就不需要重复的安装Python包。

1.在docker中的/root目录下创requirements.txt文件,内容如下:

root@cdsw1:~# vim requirements.txt 
scikit-learn==0.19.1
tensorflow==1.5.0rc1

(可左右滑动)

requirements.txt文件列出所有需要安装的依赖包及具体的版本号,每个依赖包占一行。

2.在命令行使用pip命令批量安装依赖包

root@cdsw1:~# pip install -r requirements.txt

(可左右滑动)

等待安装完成即可。

5.配置R私有源


需要使用R的环境,在内网环境下也需要考虑配置R的私有源地址,这样可以方便的使用install.packages命令来安装我们需要的依赖包。

1.进入容器的/usr/local/lib/R/etc目录下

2.在该目录下创建Rprofile.site文件,内容如下:

root@cdsw1:/usr/local/lib/R/etc# vim Rprofile.site 
# Site R configuration.
local({
  r <- getOption("repos")
  r["CRAN"] <- "http://99.12.105.77:8081/artifactory/CRAN/"
  options(repos = r)
})

(可左右滑动)

将上面的地址修改为我们私有源的地址即可,

注意:这个地址有些特别不是具体到R的Packages路径,在安装依赖包时会在该地址后面拼上/src/contrib/路径。

3.测试R私有源配置是否正常

进入R命令行,执行install.packages(“bfa”)命令安装依赖包

由上图可以看到依赖包的下载地址指向了私有源地址,这里可以看到依赖包真实的下载地址是私有源地址拼接/src/contrib/coda_0.19-1.tar.gz

6.预装R依赖包


私有源地址配置好后,接下来就可以根据需要安装R的Package。

1.在命令运行R的命令,进入R的命令行

2.进入R的命令行后,在命令行执行install.packages(“xxxx”)进行安装xxx即为我们的包名

安装包会自动编译,等编译完成即可。

7.定制Docker镜像


前面很多章节都在讲通过docker.repository.cloudera.com/cdsw/engine:4镜像启动一个容器,然后再容器里面进行Python和R的私有源配置及Package的安装。我们在该容器做了这么多修改,那接下来到了关键部分就是将该容器另存为一个新的镜像,通过这种方式来实现Docker镜像的定制。

通过将正在运行的Container另存为一个新的镜像,所以这里需要特别注意我们上面操作完成后不能退出容器,因为退出后该容器就会被销毁,上面所做的修改都会丢失,所以需要在新的会话窗口进行如下操作。

1..使用如下命令找到我们启动docker.repository.cloudera.com/cdsw/engine:4镜像的容器ID

root@cdsw1 ~]<20180123 15:48:39># docker ps |grep /bin/bash

(可左右滑动)

CONTAINER ID字段即为该容器的ID,获取到容器的ID执行如下命令将该容器保存为新的镜像。

2.使用docker命令保存当前运行的容器为新的镜像

[root@cdsw1 ~]<20180125 16:37:19># docker commit d0c2bcff46b7 docker.repository.cloudera.com/cdsw/engine:6
sha256:d2d10fe605d761eeb0846f6ec472757daa3bc49745f42149582aed91cb6a5cf6
[root@cdsw1 ~]<20180125 16:37:59># 

(可左右滑动)

3.查看镜像是否保存成功

[root@cdsw1 ~]<20180125 16:38:19># docker images
REPOSITORY                                                                    TAG                 IMAGE ID            CREATED             SIZE
docker.repository.cloudera.com/cdsw/engine                                    6                   d2d10fe605d7        52 seconds ago      6.54 GB 

(可左右滑动)

可以看到镜像已经保存成功,到此就完成了我们自定义镜像的制作。

8.自定义镜像使用


1.登录CDSW,进入admin菜单

2.在“Engine Images”栏添加我们自定义的镜像

将我们前面自定义的镜像docker.repository.cloudera.com/cdsw/engine:6添加到如下图配置

3.测试自定义镜像

4.进入“settings”界面,选择我们自定义的镜像

5.打开WorkBench

可以看到使用的Docker镜像为我们自定义的镜像

6.启动Session会话

7.验证python定制的包否以存在

输入!pip show tensorflow 命令查看是否为我们安装的版本

显示结果如下:

使用pip命令安装包,确认python源是否正常

8.启动一个R工程的Session,测试R的源和预装的Packages是否正常

通过终端使用install.packages命令安装packages正常

在CDSW界面使用library(sparklyr)加载安装好的packages

如上图显示加载packages未出现异常,则表示加载成功。

9.总结


  • 在定制Docker镜像是启动的容器一定不能退出,否则对容器做出的修改都会丢失,无法保存新的镜像。
  • R的私有源通过Session会话的终端可以正常使用安装,直接使用会话窗口install.packages(“xxxx”),未能正常使用私有源地址。
  • 在做Docker镜像时可以在定制镜像的基础上修改,避免了做重复的工作。
  • 在新建Project的时候就可以选择该定制化Docker,已经预安装好了一些R和Python依赖包,在开发具体的算法工程时,就不用再去连接公有/私有源下载。当然因为配置好了私有源,以防止有些包没有预安装,也可以临时安装。

注意:这里我们在使用自定义镜像时有一个小的问题,就是在启动会话时有时会出现如下显示:

这时我们直接Stop该会话,再重新启动即可。启动会话的时跟Kubernetes有关,查看相关日志发现启动正常的是启动失败的Events事件顺序不一样,具体什么原因目前Fayson也无法得到确切的解释。

提示:代码块部分可以左右滑动查看噢 为天地立心,为生民立命,为往圣继绝学,为万世开太平。 温馨提示:要看高清无码套图,请使用手机打开并单击图片放大查看。

推荐关注Hadoop实操,第一时间,分享更多Hadoop干货,欢迎转发和分享。

原创文章,欢迎转载,转载请注明:转载自微信公众号Hadoop实操

原文发布于微信公众号 - Hadoop实操(gh_c4c535955d0f)

原文发表时间:2018-01-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏写代码的海盗

Nodejs课堂笔记-第三课 构建一个nodejs的Docker镜像

  因为一直做Linux有关的开发工作,所以不习惯在Windows平台编译和测试代码。在没有Docker之前,windows基本就是一个IDE平台。在wind...

33860
来自专栏友弟技术工作室

macOS 安装 Docker

前几天,docker入门是在aws的ubuntu机器上演示的,下面介绍如何在macOS安装Docker。 ? 系统要求 Docker for Mac 要求系统最...

1K110
来自专栏三木的博客

QEMU 1: 使用QEMU创建虚拟机

一、QEMU简介# QEMU是一款开源的模拟器及虚拟机监管器(Virtual Machine Monitor, VMM)。QEMU主要提供两种功能给用户使用。一...

43270
来自专栏编程坑太多

『中级篇』Docker Compose到底是什么(38)

PS:上节通过image 和container的方式创建wordpress,一般麻烦吧还不算特别麻烦,但是相比今天的docker-compose.yml来说,还...

18440
来自专栏搜云库

Ubuntu 17.04 x64 安装 Docker CE

Docker 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的运行效率,降低了云计算资源供应的成本!使用 Docker,可以让应用的部署、测...

368100
来自专栏JMCui

Docker 系列五(Docker Compose 项目).

    Docker Compose 是官方编排项目之一,负责快速的部署分布式应用。它允许用户通过一个单独的 docker-compose.yml 模板文件(Y...

10320
来自专栏云计算

Docker for Devs:创建一个开发版镜像

Docker for Devs 系列包括以下6篇文章,这是第二篇。

36390

Docker – 清理磁盘占用

最近,我们开始对一些应用进行 docker 化,不得不说,我已经爱上 Docker 了!这是一个非常棒的工程,在 AWS EC2 上,它让我们的生活变得更加轻松...

52390
来自专栏大愚Talk

Dockerfile 与 Compose 环境搭建学习笔记(二)

上一篇文章对整体结构进行了简单记录,这一篇介绍下关于Dockerfile自定义镜像以及各个服务的配置。

17720
来自专栏编程坑太多

『中级篇』Docker Compose到底是什么(38)

PS:上节通过image 和container的方式创建wordpress,一般麻烦吧还不算特别麻烦,但是相比今天的docker-compose.yml来说,还...

12730

扫码关注云+社区

领取腾讯云代金券