容器核心技术

[TOC] 1.容器的重要特征 随着互联网和软件技术的发展,容器技术越来越为大家所熟知和使用,那么容器技术到底好在哪里呢? 主要是他有如下四个重要特征: 隔离性:基于Linux kernel提供的 namespace资源隔离方案。 安全性:资源隔离,资源访问自然受到了严格的限制,因此同时也把安全问题解决了 便捷性:相对于虚拟机技术,容器技术启动速度非常快 可配额:基于Linux 的Cgroups 即:Control Groups,可以对一个或一组资源控制和监控 docker优势 资源利用率高 启动快 运行环境一致 便于持续交付和部署 便于迁移 便于维护和扩展 ​ docker劣势 2 Linux namespace Linux Namespace是Linux提供的一种内核级别环境隔离的方法。提供了对UTS、IPC、mount、PID、network、User等的隔离机制。 分类 系统调用参数 相关内核版本 隔离内容 Mount namespaces CLONE_NEWNS Linux 2.4.19 挂载点(文件系统) UTS namespaces CLONE_NEWUTS Linux 2.6.19 主机名与域名,影响uname(hostname, domainname) IPC namespaces CLONE_NEWIPC Linux 2.6.19 信号量、消息队列和共享内存, inter-process communication,有全局id PID namespaces CLONE_NEWPID Linux 2.6.24 进程编号 Network namespaces CLONE_NEWNET Linux 2.6.29 网络设备、网络栈、端口等等 User namespaces CLONE_NEWUSER Linux 3.8 用户和用户组 三个系统调用 调用 作用 clone() 实现线程的系统调用,用来创建一个新的进程,并可以通过设计上述参数达到隔离。 创建时传入 flags参数,可选值有 CLONE_NEWIPC, CLONE_NEWNET, CLONE_NEWNS, CLONE_NEWPID, CLONE_NEWUTS, CLONE_NEWUSER, 分别对应上面六种namespace。 unshare() 使某进程脱离某个namespace setns() 把某进程加入到某个namespace 常用操作 ...

January 1, 2021

horovod

[TOC] 官方介绍 Horovod is a distributed training framework for TensorFlow, Keras, and PyTorch. The goal of Horovod is to make distributed Deep Learning fast and easy to use. 官方测试效果 Running Horovod The example commands below show how to run distributed training. See the Running Horovod page for more instructions, including RoCE/InfiniBand tweaks and tips for dealing with hangs. 1. 单机4卡: # docker nvidia-docker run -it 172.16.10.10:5000/horovod:0.12.1-tf1.8.0-py3.5 mpirun -np 4 -H localhost:4 python keras_mnist_advanced.py # singularity singularity shell --nv /scratch/containers/ubuntu.simg mpirun -np 4 -H localhost:4 python keras_mnist_advanced.py 2. 多机多卡: $ mpirun -np 16 \ -H server1:4,server2:4,server3:4,server4:4 \ ... python train.py 3. 完整 Docker 使用horovod ​ ...

March 10, 2018

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

CentOS安装Docker

[TOC] Docker 安装 docker 简单又实用,一起来学习吧.现在官方也给出了比较全面(各种系统各种版本)的安装方法.链接在此.下面简单记录一下centos下的安装. 卸载旧版本 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine yum源安装 通过添加docker仓库,只要有网在哪里都可以下载.有版本更新也可以直接一条命令解决. 安装依赖包 sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2 添加docker仓库 sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo 一键安装 sudo yum install docker-ce sudo usermod -aG docker your-user #普通用户要使用docker需要添加到docker组 启动docker sudo systemctl start docker docker version #查看版本 rpm包安装 下载好的rpm安装快速,可离线安装. sudo yum install /path/to/package.rpm sudo usermod -aG docker your-user #普通用户要使用docker需要添加到docker组 sudo systemctl start docker docker version #查看版本 脚本安装 curl -fsSL get.docker.com -o get-docker.sh sudo sh get-docker.sh sudo usermod -aG docker your-user #普通用户要使用docker需要添加到docker组 sudo systemctl start docker docker version #查看版本 镜像加速器 在国内下载docker镜像很可能会很慢,甚至有的都不能下载.使用加速器将会提升在国内获取Docker官方镜像的速度.其实就是阿里等先把官方的镜像下载到自己的机房,定时更新然后做成一个仓库站点,供国内使用,所以要快很多.添加方法很简单,通过修改daemon配置文件/etc/docker/daemon.json来使用加速器. ...

March 13, 2016