singularity 安装教程

[TOC] 首先是下载源码,singularity下载地址:http://singularity.lbl.gov/all-releases 下载到本地之后,解压 tar xvf singularity-2.2.1.tar.gz mkdir /gensoft/singularity cd singularity-2.2.1/ ./configure make make install 到这里其实singularity已经安装完毕,下面是参照官网说明做的一个镜像 BootStrap: yum OSVersion: 7 MirrorURL: http://mirror.centos.org/centos/7/os/x86_64/ Include: yum [yhu@master ~]$sudo [root@7-2 singularity-2.2.1]#singularity shell –contain /tmp/Centos7.img Singularity: Invoking an interactive shell within container… Singularity.Centos7.img> id uid=0(root) gid=0(root) groups=0(root) Singularity.Centos7.img> ls / bin dev etc lib lost+found mnt proc run singularity sys usr boot environment home lib64 media opt root sbin srv tmp var Singularity.Centos7.img> exit exit ...

June 11, 2017

singularity使用手册

[TOC] 制作容器 选项一 导入docker容器 使用现成的docker容器,比如docker hub上面的tensorflow: sudo singularity create --size 4000 tensorflow.img sudo singularity import tensorflow.img docker://tensorflow/tensorflow:latest 选项二 自己制作singularity容器 制作一个singularity容器需要两步,需要在任何一台有root权限的linux计算机上进行: 1 创建空白镜像文件 sudo singularity create --size 1200 keras2.0_cpu.img 其中 size用来制定大小,单位是MB,上面将创建一个1.2GB的空白镜像文件。 2 接下来需要在这个镜像中写入系统和预装的软件 创建 keras2.0_cpu.def 文件,内容通过符号%分割成几个部分,分别代表不同的功能。 我们主要要写的内容是1) %setup; 2)%post # 基于docker的ubuntu镜像 BootStrap: docker From: ubuntu:16.04 %runscript echo "This is what happens when you run the container..." bash %setup # 1)这一步可以先设置好环境变量,通过wget等下载好必要的软件库等,注意这些指令都只是在host机器上运行,不是container里面。 # 内容请参考https://git.oschina.net/sg-ai/singularityimages/blob/master/keras-tf-1.0.1-gpu.setup %post # non interactive debian DEBIAN_FRONTEND=noninteractive # Install the necessary packages (from repo) apt-get update && apt-get install -y --no-install-recommends curl ca-certificates # 2)这些指令都在container里面运行,在这里写你要安装和设置的东西,可以使用apt install之类的安装需要的软件,这样就会被安装到容器里面去 # 内容请参考https://git.oschina.net/sg-ai/singularityimages/blob/master/keras-tf-1.0.1-gpu.post 接着运行: ...

June 9, 2017

docker repository使用方法

[TOC] 1.查看repository中的image 假设集群上docker 私有仓库做到了master节点,172.16.10.10:5000。 获取已有image 私有仓库目前已有images如下: $curl http://172.16.10.10:5000/v2/_catalog|python2 -m json.tool % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 289 100 289 0 0 1125 0 --:--:-- --:--:-- --:--:-- 1128 { "repositories": [ "centos", "gitlab/gitlab-ce", "gitlab/gitlab-runner", "gitlab-runner", "keras", "mongo", "nvidia/cuda", "nvidia/digits", "paddledev/paddle", "paddlepaddle/book", "paddlepaddle/paddle", "redis", "registry", "superman/registry", "ubuntu", "yhu/centos", "yhu/gitlab-runner", "yhu/registry" ] } 获取制定image的所有版本号 如果想要查看对应的images拥有哪些版本, 例如paddlepaddle/paddle 这个镜像的版本 $curl http://172.16.10.10:5000/v2/paddlepaddle/paddle/tags/list|python2 -m json.tool % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 84 100 84 0 0 20771 0 --:--:-- --:--:-- --:--:-- 28000 { "name": "paddlepaddle/paddle", "tags": [ "latest", "0.10.0", "0.10.0-dev", "0.10.0-gpu" ] } 只需要修改中间对应的名字即可 ...

May 31, 2017

docker镜像上增加安装包

[TOC] 前提 有时候我们会遇到这样的问题,一个镜像能满足我们的大部分需求,想在此基础上添加一部分功能.有三种方法 1.dockerfile构建 找到这个镜像的dockerfile,修改后build. 2.作为基础镜像 也是写一个dockerfile,只不过这次把这个有较多功能的镜像作为基础镜像,添加所需功能.然后build. 3.导出container为image 直接在运行的container中添加所需功能,然后commit成image. 第一步 使用root用户进入一个新容器,不要用--rm(否则当你退出容器的时候,容器没有了 你添加的功能自然就不复存在了) docker run --user 0 -it --name superman sgdockerfilebox/mitosis_cpu:latest bash 第二步 在container中直接添加你要的功能 apt update apt install ... npm install -g n n stable ... pip3 install ... 然后退出容器 exit 第三步 新的容器 commit成新的image docker commit superman sgdockerfilebox/wewo_cpu:v1 (这里的sgdockerfilebox/wewo_cpu:v1 名字和版本号自己定义) 查看一下commit的image root@gyw:~# docker images REPOSITORY TAG IMAGE ID CREATED SIZE sgdockerfilebox/wewo_cpu v1 e4f2c829d1eb 23 minutes ago 4.42GB 没有问题就可以删除 之前创建的容器了, docker rm superman ...

May 25, 2017

docker设置devicemapper存储驱动

[TOC] 背景 在 Ubuntu/Debian 上有 UnionFS 可以使用,如 aufs 或者 overlay2,而 CentOS 和 RHEL 的内核中没有相关驱动。因此对于这类系统,一般使用 devicemapper 驱动利用 LVM 的一些机制来模拟分层存储。这样的做法除了性能比较差外,稳定性一般也不好,而且配置相对复杂。Docker 安装在 CentOS/RHEL 上后,会默认选择 devicemapper,但是为了简化配置,其 devicemapper 是跑在一个稀疏文件模拟的块设备上,也被称为 loop-lvm。这样的选择是因为不需要额外配置就可以运行 Docker,这是自动配置唯一能做到的事情。但是 loop-lvm 的做法非常不好,其稳定性、性能更差,无论是日志还是 docker info 中都会看到警告信息。官方文档有明确的文章讲解了如何配置块设备给 devicemapper 驱动做存储层的做法,这类做法也被称为配置 direct-lvm。 除了前面说到的问题外,devicemapper + loop-lvm 还有一个缺陷,因为它是稀疏文件,所以它会不断增长。用户在使用过程中会注意到 /var/lib/docker/devicemapper/devicemapper/data 不断增长,而且无法控制。这个稀疏文件的空间释放后基本不进行垃圾回收的问题。因此往往会出现即使删除了文件内容,空间却无法回收,随着使用这个稀疏文件一直在不断增长。 所以对于 CentOS/RHEL 的用户来说,在没有办法使用 UnionFS 的情况下,一定要配置 direct-lvm 给 devicemapper,无论是为了性能、稳定性还是空间利用率。 配置过程 1.直接修改daemon.json 官方文档里面有两种方法,第一种就是直接修改/etc/docker/daemon.json 这个文档,然后重启docker即可. { "storage-driver": "devicemapper", "storage-opts": [ "dm.directlvm_device=/dev/xdf", #这里修改成主机存储谁被,可以整个硬盘,或者一个分区 "dm.thinp_percent=95", "dm.thinp_metapercent=1", "dm.thinp_autoextend_threshold=80", "dm.thinp_autoextend_percent=20", "dm.directlvm_device_force=false" ] } 修改完了之后,重启docker即可 sudo systemctl restart docker docker info Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 0 Server Version: 17.03.1-ce Storage Driver: devicemapper #看这里 .... 但是有些时候修改了配置,并不会生效.需要手动修改添加逻辑卷等. ...

May 20, 2017

docker常用命令

[TOC] 1.基本概念 Docker 包括三个基本概念 镜像(Image) Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会改变。 容器(Container) 容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。 仓库(Repository) 一个集中的存储、分发镜像的服务。 理解了这三个概念,就理解了 Docker 的整个生命周期。 2.docker安装 官方安装教程 nvidia-docker安装 阿里云镜像源docker安装方式 #ubuntu sudo apt-get update sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" sudo apt-get -y update sudo apt-get -y install docker-ce #CentOS sudo yum install -y yum-utils device-mapper-persistent-data lvm2 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sudo yum makecache fast sudo yum -y install docker-ce sudo service docker start 3.docker命令 a、镜像相关 docker image --help Usage: docker image COMMAND Commands: ls List images pull Pull an image or a repository from a registry push Push an image or a repository to a registry rm Remove one or more images save Save one or more images to a tar archive (streamed to STDOUT by default) load Load an image from a tar archive or STDIN tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE build Build an image from a Dockerfile Run 'docker image COMMAND --help' for more information on a command. 1.docker images 列出主机上已存在镜像 ...

May 13, 2017

django的使用3-编写视图

[TOC] 编写视图 一个视图函数(或简称为视图)是一个 Python 函数,它接受 Web 请求并返回一个 Web 响应。这个响应可以是 Web 页面的 HTML 内容,或者重定向,或者404错误,或者 XML 文档,或一个图片…或是任何内容。视图本身包含返回响应所需的任何逻辑。这个代码可以存在任何地方,只要它在你的 Python 路径上就行。可以说,不需要其他东西,这里并没有魔法。为了将代码放置在某处,约定将视图放在名为 views.py 的文件里,这个文件放置在项目或应用目录里。 一个简单的视图 参考: https://docs.djangoproject.com/

February 12, 2017

django的使用3-URL调度器

[TOC] Django 允许你自由地设计你的URL,不受框架束缚。 概况 对于高质量的Web 应用来说,使用简洁、优雅的URL 模式是一个非常值得重视的细节。 为了给一个应用设计URL,你需要创建一个Python 模块,通常被称为URLconf(URL configuration)。这个模块是纯粹的Python 代码,包含URL 模式(简单的正则表达式)到Python 函数(你的视图)的简单映射。 映射可短可长,随便你。它可以引用其它的映射。而且,因为它是纯粹的Python 代码,它可以动态构造。 Django 如何处理一个请求 当一个用户请求Django 站点的一个页面,下面是Django 系统决定执行哪个Python 代码使用的算法: Django 确定使用根 URLconf 模块。通常,这是 ROOT_URLCONF 设置的值,但如果传入 HttpRequest 对象拥有 urlconf 属性(通过中间件设置),它的值将被用来代替 ROOT_URLCONF 设置。 Django 加载该 Python 模块并寻找可用的 urlpatterns 。它是 django.urls.path() 和(或) django.urls.re_path() 实例的序列(sequence)。 Django 会按顺序遍历每个 URL 模式,然后会在所请求的URL匹配到第一个模式后停止,并与 path_info 匹配。 一旦有 URL 匹配成功,Djagno 导入并调用相关的视图,这个视图是一个Python 函数(或基于类的视图 class-based view )。视图会获得如下参数: 一个 HttpRequest 实例。 如果匹配的 URL 包含未命名组,那么来自正则表达式中的匹配项将作为位置参数提供。 关键字参数由路径表达式匹配的任何命名部分组成,并由 django.urls.path() 或 django.urls.re_path() 的可选 kwargs 参数中指定的任何参数覆盖。 如果没有 URL 被匹配,或者匹配过程中出现了异常,Django 会调用一个适当的错误处理视图。 实例 下面是一个简单的 URLconf: ...

February 10, 2017

django的使用3-聚合

[TOC] 聚合 Django 数据库抽象 API 描述了使用 Django queries 来增删查改单个对象的方法。 然而,有时候你要获取的值需要根据一组对象聚合后才能得到。 模型示例: 作者,出版社,书,商店。 from django.db import models class Author(models.Model): name = models.CharField(max_length=100) age = models.IntegerField() class Publisher(models.Model): name = models.CharField(max_length=300) class Book(models.Model): name = models.CharField(max_length=300) pages = models.IntegerField() price = models.DecimalField(max_digits=10, decimal_places=2) rating = models.FloatField() authors = models.ManyToManyField(Author) publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE) pubdate = models.DateField() class Store(models.Model): name = models.CharField(max_length=300) books = models.ManyToManyField(Book) 常见的聚合查询 expressions output_field filter Avg Count Max Min Sum Variance: 返回给定表达式中数据的方差 StdDev: 返回给定表达式中数据的标准差 # Total number of books. >>> Book.objects.count() 2452 # Total number of books with publisher=BaloneyPress >>> Book.objects.filter(publisher__name='BaloneyPress').count() 73 # Average price across all books. >>> from django.db.models import Avg >>> Book.objects.all().aggregate(Avg('price')) {'price__avg': 34.35} # Max price across all books. >>> from django.db.models import Max >>> Book.objects.all().aggregate(Max('price')) {'price__max': Decimal('81.20')} # Difference between the highest priced book and the average price of all books. >>> from django.db.models import FloatField >>> Book.objects.aggregate( ... price_diff=Max('price', output_field=FloatField()) - Avg('price')) {'price_diff': 46.85} # All the following queries involve traversing the Book<->Publisher # foreign key relationship backwards. # Each publisher, each with a count of books as a "num_books" attribute. >>> from django.db.models import Count >>> pubs = Publisher.objects.annotate(num_books=Count('book')) >>> pubs <QuerySet [<Publisher: BaloneyPress>, <Publisher: SalamiPress>, ...]> >>> pubs[0].num_books 73 # Each publisher, with a separate count of books with a rating above and below 5 >>> from django.db.models import Q >>> above_5 = Count('book', filter=Q(book__rating__gt=5)) >>> below_5 = Count('book', filter=Q(book__rating__lte=5)) >>> pubs = Publisher.objects.annotate(below_5=below_5).annotate(above_5=above_5) >>> pubs[0].above_5 23 >>> pubs[0].below_5 12 # The top 5 publishers, in order by number of books. >>> pubs = Publisher.objects.annotate(num_books=Count('book')).order_by('-num_books')[:5] >>> pubs[0].num_books 1323 aggregate Django 提供了两种生成聚合的方法。第一种方法是从整个 QuerySet 生成汇总值。比如你想要计算所有在售书的平均价格。Django 的查询语法提供了一种用来描述所有图书集合的方法: ...

February 7, 2017

django的使用3-数据库抽象API

[TOC] 数据库抽象API 一旦创建数据模型后,Django 自动给予你一套数据库抽象 API,允许你创建,检索,更新和删除对象。下面介绍这些API。 先创建三个模型:博客,作者,记录 from django.db import models class Blog(models.Model): name = models.CharField(max_length=100) tagline = models.TextField() def __str__(self): return self.name class Author(models.Model): name = models.CharField(max_length=200) email = models.EmailField() def __str__(self): return self.name class Entry(models.Model): blog = models.ForeignKey(Blog, on_delete=models.CASCADE) headline = models.CharField(max_length=255) body_text = models.TextField() pub_date = models.DateField() mod_date = models.DateField() authors = models.ManyToManyField(Author) number_of_comments = models.IntegerField() number_of_pingbacks = models.IntegerField() rating = models.IntegerField() def __str__(self): return self.headline 创建新数据 一个模型类代表一张数据表,一个模型类的实例代表数据库表中的一行记录。要创建一个对象,用关键字参数初始化它,然后调用 save() 将其存入数据库。 ...

February 5, 2017