随着计算机近年来的蓬勃发展,产生了大量优秀系统和软件。软件开发人员可以自由选择各种软件应用。但同时带来的问题就是需要维护一个非常庞大的开发、测试和生产环境。面对之中情况,Docker容器技术横空出世,提供了简单、灵活、高效的解决方案,不需要过多的改变现有的使用习惯,就可以和已有的工具配合使用。因此,掌握Docker相关技术也是途径云计算的必经之路。
博文大纲:
一、Docker概述
1.Docker简介
2.Docker和虚拟机的区别
3.Docker的使用场景
二、Docker的核心概念及安装
1.镜像
2.容器
3.仓库
4.安装Docker
三、Docker镜像操作
1.搜索镜像
2.获取镜像
3.查看镜像信息
4.删除镜像
5.存出镜像和载入镜像
四、Docker容器操作
1.容器的创建与启动
2.容器的运行与终止
3.容器的进入
4.容器的导入与导出
5.容器的删除
五、Docker资源控制
一、Docker概述
1.Docker简介
Docker作为开源社区最火爆的项目,它是在Linux容器里运行应用的开源工具,是一种轻量级的“虚拟机”,docker的全部源代码都在https://github.com/docker 进行相关维护,其官网是:https://www.docker.com 。
Docker的Logo设计为蓝色鲸鱼,拖着许多集装箱。
如图所示:鲸鱼可以看作宿主机,而集装箱可以理解为相互隔离的容器,每个集装箱中都包含自己的应用程序。正如 Docker的设计宗旨一样:Buid、 Ship and Run Any App、 Anywhere,即通过对应用组件的封装、发布、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”的目的。这里的组件,既可以是一个应用,也可以是一套服务,甚至是一个完整的操作系
统。
2.Docker和虚拟机的区别
作为一种轻量级的虚拟化方式,Docker与传统虚拟机相比具有显著的优势。如图:
Docker之所以拥有众多优势,与操作系统虚拟化自身的特点是分不开的。传统虚拟机需要有额外的虚拟机管理程序和虚拟操作系统层,而Docker容器是直接在操作系统层面之上实现的虚拟化,如图:
3.Docker的使用场景
现在卡者需要能方便地创建运行在云平台上的应用,必须要脱离底层的硬件,同时还需要任何时间、地点可获取这些资源,这正是Docker所能提供的。
Docker的容器技术可以在一条主句上轻松为任何应用创建一个轻量级的、可移植的、自给自足的容器。通过这种容器打包应用程序,意味着简化了重新部署、调试这些琐碎的重复工作,极大地提高了工作效率。
比如:服务器从腾讯云迁移到阿里云,如果采用了Docker容器技术,迁移只需要在新的服务器上启动需要的容器即可。
二、Docker的核心概念及安装
1.镜像
Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为是一个面向Docker容器引擎的只读模板。
Docker提供了简单的机制来创建和更新现有的进行,用户也可以从网上下载已经做好的应用进行来直接使用。
2.容器
Docker的容器是从镜像创建的运行实例。它可以被启动、停止个删除。所创建的每一个容器都是互相隔离、互不可见,可以保证安全性的平台。可以把容器看做一个简易版的Linux环境,Docker利用容器来运行和隔离应用。
3.仓库
Docker仓库是用来集中保存镜像的地方,当创建了自己的镜像之后,可以使用命令将它上传到公有仓库或私有仓库,这样一来当下次要在另外一条机器上使用这个镜像是,只需从仓库拉取下来即可!
仓库注册服务器是存放仓库的地方,其中包含了多个仓库,每个仓库集中存放某一类镜像,并且使用不同的标签来区分它们。目前最大的公有仓库Docker Hub,存放了数量庞大的镜像提供用户下载使用。
4.安装Docker
Docker支持在主流的操作系统平台上进行使用,包括Windows系统、Linux系统及MacOS系统等。目前最新的RedHat RHEL、Centos及Ubuntu系统官方软件源中都已经默认自带了Docker包,可直接安装使用,也可以用Docker自己的YUM源进行配置。
Centos系统下安装Docker可以有两种方式:
- 使用curl获得Docker的安装脚本进行安装;
- 使用YUM仓库来安装Docker;
需要注意的是,目前Docker只能支持64位系统。
本次博文使用Centos 7.3系统,采用两种方式进行安装:
(1)Docker使用系统自带的YUM源
(1)安装Docker
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0 //由于安装Docker时,SELinux会组织Docker的正常启动
[root@localhost ~]# yum -y install docker //安装Docker
(2)启动Docker
[root@localhost ~]# systemctl daemon-reload //重新加载守护进程
[root@localhost ~]# systemctl start docker //启动Docker
但是启动Docker时,可以会出现以下情况,如图:
无法正常启动,这时需要进行以下操作:
[root@localhost ~]# vim /etc/sysconfig/docker //修改Docker的配置文件,如图:
[root@localhost ~]# systemctl daemon-reload //重新加载守护进程
[root@localhost ~]# systemctl restart docker //重新加载docker
这样就启动成功了,但是也有个别的例外,还需修改配置文件:
[root@localhost ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
//注意:这个配置文件中,有时会自动生成,有时只有“{}”,但是在这个配置文件中,不允许有“,”的出现!
//这是和加速配置有关的内容
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker
//这样重新加载Docker,就不会出现错误了!
本人目前只遇到这两种情况,这里就先介绍这两种常见的问题!
[root@localhost ~]# docker -v //查看Docker版本
Docker version 1.13.1, build 7f2769b/1.13.1
//注意采用这种方法进行安装,安装的Docker版本较低!
(2)使用阿里云的yum配置文件进行安装
(1)安装Docker
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0 //由于安装Docker时,SELinux会组织Docker的正常启动
[root@localhost ~]# cd /etc/yum.repos.d/ //切换到yum源目录下
[root@localhost yum.repos.d]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
//获取阿里云的Docker的yum配置文件
[root@localhost ~]# yum makecache //建立yum元数据缓存
[root@docker ~]# yum repolist //列出yum仓库的可用包
...................... //省略部分内容
docker-ce-stable/x86_64 Docker CE Stable - x86_64 61
//确认docker.....这一列有可用的包,我这里显示的是61个(但是,一定不可以为0)
[root@docker ~]# yum install -y docker-ce-18.09.0-3.el7 docker-ce-cli-18.09.0-3.el7 containerd.io-1.2.0-3.el7
//安装docker
关于containerd的解释可以参考:containerd相关解释
若centos是最小化安装,则需要执行以下命令,以便支持Docker命令自动补全
[root@docker01 ~]# yum -y install bash-completion
[root@docker01~]# curl -L https://raw.githubusercontent.com/docker/compose/1.24.1/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
[root@docker01 ~]# source /etc/bash_completion.d/docker-compose
(2)启动Docker
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker //启动Docker,这种方法不会出现错误
[root@localhost ~]# docker -v //查看Docker版本
Docker version 18.09.0, build 4d60db4
//注意这种版本是较新的,也是最新的!
这两种安装方式,安装的Docker版本差异较大,根据实际情况自行选择!
本次博文默认使用第二种安装方式,因为第一种安装方式,Docker版本太低,导致与很多镜像版本不匹配!
安装好的Docker有两个程序:Docker服务端和Docker客户端。
- Docker服务端是一个服务进程,管理着所有的容器;
- Docker客户端则扮演着Docker服务端的远程控制器,可以用来控制Docker的服务端进程。
大部分情况Docker服务端和Docker客户端会安装在一台服务器上。
三、Docker镜像操作
Docker运行容器前需要本地存在对应的镜像,如果不存在本地镜像,Docker就会尝试从默认镜像仓库https://hub.docker.com/ 下载。这是由Docker官方维护的一个公共仓库,可以满足用户的绝大部分需求,当然用户也可通过配置来使用自定义的镜像仓库。
在下载Docker镜像时,本人强烈建议使用以下方法加速镜像下载。方法如下:
启用道云提供的下载镜像加速功能(阿里也提供了该功能,我这里就写道云了)。
道云加速器网址:https://www.daocloud.io/
流程如下:
(1)访问道云的官网;
(2)注册用户并且登录;
前两步完成后,请看图操作:
看到以下界面后,往下拖页面:
拖到此处,根据自己系统版本,复制相应的命令(基于Linux服务器就复制下面这行):
在Linux服务器上执行以下命令:
[root@localhost ~]# curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl restart docker //启用加速文件之后,需要重新启动docker
[root@localhost~]# systemctl enable docker
//在完成加速器的操作后,会在/etc/docker目录下多了一个文件
[root@localhost ~]# cat /etc/docker/daemon.json //这个就是和加速相关的文件
{"registry-mirrors": ["http://f1361db2.m.daocloud.io"]}
1.搜索镜像
[root@localhost ~]# docker search dhcp //以DHCP作为关键字进行搜索镜像
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/networkboot/dhcpd Suitable for running a DHCP server for you... 40 [OK]
docker.io docker.io/joebiellik/dhcpd DHCP server running on Alpine Linux 14 [OK]
docker.io docker.io/gns3/dhcp A DHCP container for GNS3 using dnsmasq 2 [OK]
docker.io docker.io/instantlinux/dhcpd-dns-pxe Serve DNS, DHCP and TFTP from a small Alpi... 2 [OK]
docker.io docker.io/ictu/dhcpd-tftpd dhcpd tftpd container 1 [OK]
.................#省略部分内容
返回很多包含DHCP关键字的镜像,其中返回的信息包括镜像名称(NAME)、描述(DESCRIPTION)、星级(STARS)、是否官方创建(OFFICIAL)、是否主动创建(AUTOMATED)。默认的输出结果会按照星级评价进行排序,表示该镜像的受欢迎程度,在下载镜像时,可以参考这一项,星级越高表示越受欢迎;是否为官方镜像一项是指是否由官方项目组创建和维护的镜像,一般官方项目组维护的镜像使用单个单词作为镜像名称,我们称为基础镜像或者根镜像。如/reinblau/dhcp这种命名方式的镜像,表示是由docker hub的用户reinblau创建并维护的镜像,带有用户名为前缀;是否主动创建资源则是指是否允许用户验证镜像的来源和内容。
使用docker search命令只能查找镜像,镜像的标签无法查找,因此如果需要查找docker标签,需要从网页上访问镜像仓库https://hub.docker.com/ 进行查找。
2.获取镜像
搜索到符合需求的镜像,可以使用docker pull命令从网络下载镜像到本地使用。
对于Docker镜像来说,如果下载镜像时不指定标签,则默认会下载最新版本的镜像,即选择标签为latest;也可通过指定的标签下载特定版本的某一镜像。标签就是用来区分镜像版本的。
[root@localhost ~]# docker pull docker.io/networkboot/dhcpd //获取dhcp的镜像
…………………… //省略下载过程
从整个下载过程中可以看出,镜像文件是由若干层组成,我们称为AUFS(联合文件系统),是实现增量保存与更新的基础,下载过程中会输出镜像的各层信息。镜像下载到本地之后就可以使用该镜像了。
用户也可选择从其他注册服务器仓库下载,这时需要在仓库名称前执行完整的仓库注册服务器地址。
3.查看镜像信息
[root@localhost ~]# docker images docker.io/networkboot/dhcpd //查看下载本地镜像
//如果不指定镜像名称,则默认查看本地的所有镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/networkboot/dhcpd latest 52cbff801df2 7 months ago 105 MB
从查看的信息可以看到以下信息:
- REPOSITORY :镜像属于的仓库;
- TAG:镜像的标签信息,标记同一仓库中的不同镜像;
- IMAGE ID:镜像的唯一ID号,唯一标识了该镜像;
- CREATED:镜像创建时间;
- VIRTUAL SIZE:镜像大小;
用户还可以根据镜像的唯一标识ID号,获取镜像的详细信息。比如:
[root@localhost ~]# docker inspect 52cbff801df2 //查看dhcp镜像的详细信息(dhcp镜像的ID号)
镜像的详细信息中包括创建时间、系统版本、主机名、域名、用户、卷、标签、操作系统、设备ID等各种信息。
为了在后续工作中经常使用这个镜像,可以使用docker tag命令为本地镜像添加新的标签。
[root@localhost ~]# docker tag docker.io/networkboot/dhcpd dhcp:dhcp
//将本地镜像添加一个新的名称为dhcp,标签为dhcp
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dhcp dhcp 52cbff801df2 7 months ago 105 MB
docker.io/networkboot/dhcpd latest 52cbff801df2 7 months ago 105 MB
//查看效果
4.删除镜像
删除镜像的操作有两种:使用镜像的标签删除镜像;使用镜像的ID删除镜像;
[root@localhost ~]# docker rmi docker.io/networkboot/dhcpd:latest
//指定镜像仓库名称与标签名称进行删除,也可以指定镜像的ID号进行删除
注意:当一个镜像有多个标签是,docker rmi命令只是删除该镜像多个标签中的指定标签,不会影响镜像文件。相当于只是删除了镜像的一个标签而已。但当该镜像只剩下一个标签的时候就要小心了,再使用删除命令就会彻底删除该镜像。
[root@localhost ~]# docker rmi dhcp:dhcp //再进行删除就会彻底删除镜像
Untagged: dhcp:dhcp
Deleted: sha256:52cbff801df2c6e2da3866d9f9476f20f190f64a0e886fbdfa79d843befa666a
Deleted: sha256:db0874da62cbba0cdfb80d69326ddb4b48a4867d9e62f1b905212a4ddca52cf6
Deleted: sha256:67b03dec2ec327771501cfc88560f9e6cce99fb74e892491accacc6a917fa4b0
Deleted: sha256:e783d8ee44ce099d51cbe699f699a04e43c9af445d85d8576f0172ba92e4e16c
Deleted: sha256:cc7fae10c2d465c5e4b95167987eaa53ae01a13df6894493efc5b28b95c1bba2
Deleted: sha256:99fc3504db138523ca958c0c1887dd5e8b59f8104fbd6fd4eed485c3e25d2446
Deleted: sha256:762d8e1a60542b83df67c13ec0d75517e5104dee84d8aa7fe5401113f89854d9
当使用docker rmi命令后面跟上镜像的ID号时,必须确保该镜像没有被容器使用才能进行,删除时系统会先删除掉所有指向该镜像的标签,然后删除该镜像文件本身。如果该镜像已经被容器使用,正确的做法是先删除依赖该镜像的所有容器,再去删除镜像。
5.存出镜像和载入镜像
当需要把一台机器上的镜像迁移到另一台机器上时,需要将镜像保存成本地文件,这一过程叫做存出镜像,可以使用docker save命令进行存出操作。之后就可以复制该文件到其他机器。方法如下:
[root@localhost ~]# docker save -o dhcp docker.io/networkboot/dhcpd
//将本地的dhcp镜像存出为文件dhcp
将存出的镜像从A机器复制到B机器,需要在B机器上使用该镜像,就可以将该导出文件导入B机器的镜像库中,这一过程叫做载入镜像。
[root@localhost ~]# scp 192.168.1.1:/root/dhcp . //B机器使用scp的方式将dhcp文件复制到本地
[root@localhost ~]# docker load --input dhcp //将dhcp文件中载入镜像到本地镜像库中
[root@localhost ~]# docker load < dhcp //这条命令,跟上一条命令一个意思,选择其中一种即可!
四、Docker容器操作
容器是Docker的另一个核心的概念,简单来说,容器是镜像的一个运行实例,是独立运行的一个或一组应用及他们所必需的运行环境,包括文件系统、系统类库、shell环境等。镜像是只读模板,而容器会给这个只读模板提供一个额外的可写层。
1.容器的创建与启动
Docker的创建就是将镜像加载到容器的过程,Docker的容器十分轻量级,用户可以随时创建或者删除。新创建的容器默认处于停滞状态,不运行任何程序,需要在其中发起一个进程来启动容器,这个过程是该容器的唯一进程,所以当该进程结束的时候,容器自然也会停滞。停滞的容器可以重新启动并保留原来的修改。可以使用“docker create”命令新建一个容器。
[root@localhost ~]# docker create -it networkboot/dhcpd /bin/bash
93cfa68ee12f8ea569e5a627ff241c6652641103425a32d863279ef6e459114d
//使用dhcp的镜像创建一个容器。-i:表示让容器的输入保持打开;-t表示让Docker分配一个伪终端
//下面的数字则是容器的唯一ID号
如果创建容器命令出现报错“WARNING:IPV4 forwarding is disable Networking will not work”这样的信息。这时需要使用修改/usr/lib/sysctl.d/00-system.conf文件,在文件中添加一条“net.ipv4.ip_forward = 1”,然后重启网络服务即可!
创建完容器之后,可以使用“docker ps”命令查看容器的运行状态。添加“-a”选项可以列出系统最近一次启动的容器。
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
93cfa68ee12f networkboot/dhcpd "/entrypoint.sh /bin…" 9 minutes ago Created nifty_pascal
//输出的信息显示容器的ID号、加载的镜像、运行的程序、创建时间、目前所处的状态、端口映射、容器名称等。
//其中状态一栏为“Created”则表示当前的容器是新创建的并处于停止状态。
启动停止状态的容器可以使用“docker start ”命令。
[root@localhost ~]# docker start 93cfa68ee12f //启动容器(后面是容器的ID号/名称)
93cfa68ee12f
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
93cfa68ee12f networkboot/dhcpd "/entrypoint.sh /bin…" 12 minutes ago Up 2 minutes nifty_pascal
//状态变为UP状态,表示容器已经处于启动状态
如果用户想创建并启动容器,可以直接执行“docker run”命令。等同于先执行“docker create”命令,再执行“docker start”命令,需要注意只要后面的命令运行结束,容器就会停止。
[root@localhost ~]# docker run networkboot/dhcpd /bin/bash -c ls
//指定一个终端,-c后面是执行的命令
bin
boot
dev
entrypoint.sh
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e555cebe89ea networkboot/dhcpd "/entrypoint.sh /bin…" 47 seconds ago Exited (0) 46 seconds ago heuristic_galileo
//查询状态时,Exited为退出、停止状态
当利用“docker run”命令来创建容器时,Docker在后台的标准运行过程是这样:
- 检查本地是否存在指定的镜像,当镜像不存在时,会从公有仓库首先进行下载;
- 利用镜像创建并启动一个容器;
- 分配一个文件系统给容器;
- 在只读的镜像层外面挂载一层可读写层;
- 从宿主主机配置的网桥接口桥接一个虚拟机接口到容器中;
- 分配一个地址池中的IP地址给容器;
- 执行用户指定的应用程序;
- 执行完毕后容器将终止运行;
优势需要在后台持续地运行这个容器,就需要让docker容器在守护形式在后台进行运行,可以在“docker run”命令之后添加“-d”选项来实现,但是需要注意容器所运行的程序不能结束。比如:
[root@localhost ~]# docker run -d networkboot/dhcpd /bin/bash -c "while true;do echo ok;done;"
9a69dac64cb36c43f37bbd1a7f23c8d64f83148ab8ab6ef983d30be70cc73b47
//-d选项表示在后台运行,后面跟一个死循环的脚本即可!
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9a69dac64cb3 networkboot/dhcpd "/entrypoint.sh /bin…" 7 seconds ago Up 7 seconds kind_mendeleev
//这样,查看状态则是“UP”状态,表示容器始终在启动
2.容器的运行与终止
如果需要终止运行的容器,可以使用“docker stop”命令完成。比如:
[root@localhost ~]# docker stop 9a69dac64cb3 //停止容器,后面可以是容器的ID或名称
9a69dac64cb3
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9a69dac64cb3 networkboot/dhcpd "/entrypoint.sh /bin…" 2 minutes ago Exited (143) 2 seconds ago kind_mendeleev
//再次查看状态则是Exited状态,表示终止状态
3.容器的进入
需要进入容器进行相关操作时,可以使用“docker exec”命令进入运行着的容器。比如:
[root@localhost ~]# docker exec -it 93cfa68ee12f /bin/bash
//-i表示让容器的输入保持打开,-t选项表示让docker分配一个伪终端
//指定容器的ID,使用的shell进入容器中
root@93cfa68ee12f:/# ls //进入容器中,命令提示符发生了变化
bin dev etc lib media opt root sbin sys usr
boot entrypoint.sh home lib64 mnt proc run srv tmp var
root@93cfa68ee12f:/# exit //使用exit退出容器
exit
4.容器的导入与导出
用户可以将任何一个Docker容器从一台机器迁移到另一台机器。在迁移过程中,首先需要将已经创建好的容器导出为文件,可以使用“docker export”命令实现,无论这个容器是处于运行状态还是停止状态均可导出。导出之后可将导出文件传输到其他机器,通过相应的导入命令实现容器的迁移。
[root@localhost ~]# docker export 93cfa68ee12f > dhcpd
//将容器导出为dhcpd文件,可以是容器的名称也可是容器的ID号
导出的文件从A机器传输到B机器,之后使用“docker import”命令导入,成为镜像。
[root@localhost ~]# scp 192.168.1.1:/root/dhcpd . //使用scp命令将容器生成的文件传输到本地
[root@localhost ~]# cat dhcpd | docker import - dhcp:dhcp //导入dhcpd文件成为本地镜像
sha256:897fc38054e773e1798db8ba9ea41ac8565b970ec7f2d34babc478b527505e81
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dhcp dhcp 897fc38054e7 4 seconds ago 84.7 MB
5.容器的删除
可以使用“docker rm”命令将一个已经终止状态的容器进行删除。
[root@localhost ~]# docker stop 9a69dac64cb3 //通过容器的ID号进行停止
9a69dac64cb3
[root@localhost ~]# docker rm 9a69dac64cb3 //通过容器的ID号进行删除
9a69dac64cb3
[root@localhost ~]# docker ps -a | grep 9a69dac64cb3 //最后确认一下
如果删除一个正在运行的额容器,可以添加“-f”选项强制删除,但是建议先将容器停止再进行删除操作。
Docker默认的存储目录在/var/lib/docker,Docker的镜像、容器、日志等内容全部都存储在此,可以单独使用大容量的分区来存储这些内容,并且一般选择建立LVM逻辑卷,从而避免Docker运行过程中存储目录容量不足的问题。
五、Docker资源控制
1.限制cpu使用率
[root@node3 ~]# cd /sys/fs/cgroup/cpu,cpuacct/system.slice/docker-3364d6aee72d0c01e606c047737683790ccfe2a1df14933e172cfcaf8ba2b820.scope/
[root@node3 docker-3364d6aee72d0c01e606c047737683790ccfe2a1df14933e172cfcaf8ba2b820.scope]# echo 2000 >cpu.cfs_quota_us
//最大值是100000,表示100%。
我们看到 /sys/fs/cgroup 目录中有若干个子目录,我们可以认为这些都是受 cgroups 控制的资源以及这些资源的信息。
• blkio — 这个子系统为块设备设定输入/输出限制,比如物理设备(磁盘,固态硬盘,USB 等等)。
• cpu — 这个子系统使用调度程序提供对 CPU 的 cgroup 任务访问。
• cpuacct — 这个子系统自动生成 cgroup 中任务所使用的 CPU 报告。
• cpuset — 这个子系统为 cgroup 中的任务分配独立 CPU(在多核系统)和内存节点。
• devices — 这个子系统可允许或者拒绝 cgroup 中的任务访问设备。
• freezer — 这个子系统挂起或者恢复 cgroup 中的任务。
• memory — 这个子系统设定 cgroup 中任务使用的内存限制,并自动生成内存资源使用报告。
• net_cls — 这个子系统使用等级识别符(classid)标记网络数据包,可允许 Linux 流量控制程序(tc)识别从具体 cgroup 中生成的数据包。
• net_prio — 这个子系统用来设计网络流量的优先级
hugetlb — 这个子系统主要针对于HugeTLB系统进行限制,这是一个大页文件系统。
2.多任务按比例分享cpu
当多个容器任务运行时,很难计算CPU的使用率,为了使容器合理使用CPU资源,可以通过以下方式对单个容器进行限制。
[root@node3 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dhcp dhcp 56c1dba24f3e 23 hours ago 96.6 MB
[root@node3 ~]# docker run -tid --cpu-shares 1024 56c1dba24f3e /bin/bash -c ls
3.限制cpu内核使用
限制新建的容器使用第一个内核
[root@node3 ~]# cat /proc/cpuinfo| grep "processor"| wc -l
2
[root@node3 ~]# docker run -tid --cpuset-cpus 1 56c1dba24f3e /bin/bash -c ls
4.对内存使用的限制
限制新建的容器使用内存512MB
[root@node3 ~]# docker run -tid -m 512MB 56c1dba24f3e /bin/bash -c ls
一旦容器中Cgroup使用的内存超过了限制的容量,Linux内核将会尝试收回这些内存,如果仍然没办法控制使用内存在限制范围内,进程将会被杀死。
5.对blkio的限制
如果一个服务器上运行容器的混合部署,那么会存在同时几个程序写磁盘数据的情况,这时就需要使用一下方式来进行限制。
限制新建的容器的/dev/sda的写入速度为1MB
[root@node3 ~]# docker run -tid -device-write-bps 56c1dba24f3e /bin/bash -c ls
关于Docker就先简单介绍这么多!
———————— 本文至此结束,感谢阅读 ————————