将镜像文件系统以及用户请求的目录挂载到容器里。Shifter 直接从镜像存储目录加载镜像文件,以只读方式将镜像文件作为回环 (loopback) 设备挂载到容器中。镜像文件一般存储在网络文件系统中,这种挂载方式可以有效利用操作系统的文件缓存机制,加快访问文件系统中的数据。
为了保持应用运行环境一致性,环境变量也会被传递到容器。
通过 chroot()系统调用,将系统运行时环境切换到已经挂载的镜像文件系统中,完成容器启动,开始运行应用程序。
输出数据将会被写入主机映射到容器的目录里面,固化到磁盘中。
对于容器,由于 Shifter 是为高性能批处理作业系统设计的,它的运行时容器环境和一般意义上的容器,比如 Docker,在概念上有点不同。在隔离性上,Shifter 只使用了挂载点(mount points)命名空间,做了基本的文件系统隔离。容器相关的资源管理和资源控制都交给作业管理系统来处理。另外,Shifter 基于基本的隔离和 chroot()系统调用来实现容器,相比于 Docker 容器,这可以让它运行在很多旧的 Linux 发布版本中。这在注重系统稳定性,更新系统谨慎的高性能计算领域是很有用的。Shifter 的用户管理机制也很简单,运行容器的用户即是容器内操作的用户,容器内不存在权限提升问题。
Shifter 容器的安装和使用 在 Linux 中安装 Shifter我们以 Ubuntu 系统为例,说明它的安装过程。
1.安装编译依赖
Shifter 需要进行编译安装。它依赖于基本的编译工具 gcc 和 make,同时需要工具集 libtool 和 autoconf。原代码编译依赖于库:libcap-dev, libmunge-dev, libcurl4-openssl-dev 和 libjson-c-dev.
清单 1. 获取依赖组件
1
$ apt-get install libtool autoconf libcap-dev libmunge-dev libcurl4-openssl-dev libjson-c-dev
2.下载源代码并编译安装 我们可以从https://github.com/NERSC/shifter下载最新的源代码并编译,安装。
清单 2. Shifter 源码安装
1 2 3 4 5 6 7 8 9 10 11 12 13
$ git clone https://github.com/NERSC/shifter Cloning into 'shifter'... remote: Counting objects: 6512, done. remote: Compressing objects: 100% (91/91), done. remote: Total 6512 (delta 49), reused 0 (delta 0), pack-reused 6421 Receiving objects: 100% (6512/6512), 1.46 MiB | 1.10 MiB/s, done. Resolving deltas: 100% (4241/4241), done. Checking connectivity... done. $ cd shifter $ ./autogen.sh $ ./configure $ make $ make install
3.安装第三方支撑软件
Shifter 需要第三方软件的配合运行,这部分依赖主要用于支持镜像管理器。
清单 3. 安装第三方软件
1 2 3 4
$ apt-get install mongodb munge redis-server redis-tools squashfs-tools $ apt-get install python-pymongo python-celery python-flask python-redis $ lsmod | grep squashfs squashfs 48362 0
4.配置 Shifter 系统
配置文件模版已经安装在系统里,我们通过拷贝,创建本地配置文件/usr/local/etc/定制镜像管理和容器管理行。
清单 4. 创建配置文件
1 2
$ cp imagemanager.json.example imagemanager.json $ cp udiRoot.conf.example udiRoot.conf
基本的安装过程到这里就结束了。接下来,还要做简单的配置:
创建系统镜像存储目录:
默认为/images。但是一般使用网络文件系统路径,便于多节点共享镜像文件。后台进程和 shifter 命令行都会使用这个目录存储和访问容器镜像。
配置 udiRoot.conf,设置 imageGateway 的地址和端口:
镜像管理工具 shifterimg 通过这个配置访问后台进程。
使用 Shifter 容器运行程序在启动镜像管理器后,Shifter 的命令行可以让我们直接将程序运行在容器中。
1.启动镜像管理器服务
在命令行环境下,可以直接运行命令行启动镜像管理器后台进程和 Celery 工作者进程,如清单 4 所示。
清单 4. 启动镜像管理器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
$ python imagegwapi.py 2016-09-08 05:12:52,973 [shifter_imagegw.api] INFO : initializing with /usr/local/etc/imagemanager.json INFO:shifter_imagegw.api:initializing with /usr/local/etc/imagemanager.json <shifter_imagegw.imagemngr.imagemngr instance at 0x7f663871b638> 2016-09-08 05:12:53,266 [shifter_imagegw.api] INFO : initializing with /usr/local/etc/imagemanager.json INFO:shifter_imagegw.api:initializing with /usr/local/etc/imagemanager.json <shifter_imagegw.imagemngr.imagemngr instance at 0x7f261ce04638> $ celery worker -A shifter_imagegw.imageworker -Q mycluster -------------- celery@ host01 v3.1.6 (Cipater) ---- **** ----- --- * *** * -- Linux-3.16.0-30-generic-x86_64-with-Ubuntu-14.04-trusty -- * - **** --- - ** ---------- [config] - ** ---------- .> broker: redis://127.0.0.1:6379// - ** ---------- .> app: tasks:0x7f3532809250 - ** ---------- .> concurrency: 2 (prefork) - *** --- * --- .> events: OFF (enable -E to monitor this worker) -- ******* ---- --- ***** ----- [queues] -------------- .> mycluster exchange=mycluster(direct) key=mycluster [2016-09-08 04:36:34,004: WARNING/MainProcess] celery@host01 ready.
2.获取所需镜像,执行程序
通过 shifterimg 命令,从 dockerhub 服务器上下载镜像到本地镜像管理系统。Shifter 命令启动容器,运行程序,如清单 5 所示。
清单 5. 启动容器
1 2 3 4 5 6 7 8 9 10 11 12
$ shifterimg pull busybox 2016-09-23T01:50:54 Pulling Image: docker:busybox, status: READY $ shifterimg lookup busybox b05baf071fd542c3146f08e5f20ad63e76fa4b4bd91f274c4838ddc41f3409f8 $ shifter --image busybox sh / $ ls -l bin/busybox -rwxr-xr-x 369 root 0 1010960 Jun 23 20:13 bin/busybox / $ exit $ $ ls -l bin/busybox ls: cannot access bin/busybox: No such file or directory