Shifter: 面向高性能计算的容器(2)

将镜像文件系统以及用户请求的目录挂载到容器里。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

 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/59069fa37b5a2447f0353d5e4ca3b8d5.html