一、docker简介
容器( container-based )虚拟化方案,充分利用了操作系统本身已有的机制和特性,以实现轻量级的虚拟化(每个虚拟机安装的不是完整的虚拟机),甚至有人把他称为新一代的虚拟化技术, Docker 无疑就是其中的佼佼者。
在一台服务器上同时运行上百个虚拟机,肯定会被认为是痴人说梦,而在一台机器上同时运行一千个 Docker 容器,这已成为现实。
1、Docker 的目标:
Build,Ship and Run Any App,Anywhere— 即通过对应用组件的封装 (Packaging), 发布(Distribution), 运行(runing) 等生命周期的管理 , 达到应用组件级别的“一次封装 , 到处运行”
2、docker的特点
优点:
启动快,资源占用小,资源利用高,快速构建标准化运行环境
创建分布式应用程序时快速交付和部署,更轻松的迁移和扩展,更简单的更新管理
局限性:
docker是基于Linux 64bit的,无法在Windows/unix 或32bit 的linux环境下使用
LXC是基于cgroup等linux kernel 功能的,因此container的guest系统只能是linux
隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库
管理相对简单,主要是基于namespace隔离
cgroup的cpu和cpuset提供的cpu功能相比kvm的等虚拟化方案相比难以度量 (所以dotcloud主要是按内存收费)
docker对disk的管理比较有限
container随着用户进程的停止而销毁,container中的log等用户数据不便收集
3、docker与虚拟机比较
启动快比虚拟机 , 可以秒级启动
对资源占用小 , 宿主机上可运行千台容器
方便用户获取 , 分布 , 和更新应用镜像 , 指令简单 , 学习费用低
通过 Dockerfile 配置文件来灵活的自动创建和部署镜像 & 容器 , 提高工作效率
Docker 除了运行其中应用外 , 基本不消耗其他系统资源 , 保证应用性能同时尽量减小系统开销
4、docker重要网站
https://hub.docker.com/ (官方镜像站)
https://docs.docker.com/ (官方文档站)
二、docker安装
环境准备
操作系统:CentOS 7.6.1810
软件源:阿里云镜像(在阿里云镜像站上面可以找到docker-ce的软件源,使用国内的源速度比较快)
安装docker-ce
1、安装依赖
docker依赖于系统的一些必要的工具,可以提前安装。
yum install -y yum-utils device-mapper-persistent-data lvm2
2、添加软件源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3、安装docker-ce
yum clean all
yum makecache
yum -y install docker-ce
4、启动服务
systemctl start docker
5、查看安装版本
[root@ceph-dp ~]# docker version
Client:
Version: 18.03.0-ce
API version: 1.37
Go version: go1.9.2
Git commit: 0520e24
Built: Wed Mar 21 23:05:52 2018
OS/Arch: linux/amd64
Experimental: false
Orchestrator: swarm
Server:
Engine:
Version: 18.03.0-ce
API version: 1.37 (minimum version 1.12)
Go version: go1.9.4
Git commit: 0520e24
Built: Wed Mar 21 23:14:54 2018
OS/Arch: linux/amd64
Experimental: false
三、docker镜像
镜像(docker image) — Docker 运行容器之前需要本地存在镜像,若本能地不存在,那么 Docker 会找默认镜像仓库( Docker Hub 公共注册服务器中的仓库)下载,用户也可以通过配置使用自己的镜像库
(1)下载镜像
#docker pull NAME:TAG
下载某个被打上了某个标签的叫 ×× 名字 的镜像
eg:
docker pull centos:latest
若在下载时你未指定标签,默认追加 latest标签,表示库中最新镜像 镜像在下载过程中是分层的,并且在每层前会有各层的 ID号,层(Layer ) 是 AUFS (联合文件系统)的重要概念,是实现增量保存与更新的基础
实际上面的命令的原型是
#docker pull registry.hub.docker.com/centos:7
即从默认的注册服务器下载指定的镜像当然,以此你也可以用这种格式到其他仓库下载你所需要的镜像了!!!
(2)查看本地镜像相关信息
#docker images
显示结果:
[root@ceph-dp ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mariadb latest 56089178535f 12 days ago 349MB
centos latest 9f38484d220f 3 months ago 202MB
a.源自哪个仓库
b.标签信息 —用于区分同一个仓库的同名镜像可用 docker tag仓库名: 标签名 新库名:新标签
c. 镜像 ID
d. 创建时间
e. 镜像大小
(3)搜索库中满足需求的镜像,以此下载符合需求的镜像文件
#docker search centos
显示结果:
[root@ceph-dp ~]# docker search centos
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
centos The official build of CentOS. 5406 [OK]
ansible/centos7-ansible Ansible on Centos7 121 [OK]
jdeathe/centos-ssh CentOS-6 6.10 x86_64 / CentOS-7 7.5.1804 x86… 110 [OK]
consol/centos-xfce-vnc Centos container with "headless" VNC session… 91 [OK]
a.哪个库
b.绝对路径,库中的带有搜索关键字的镜像
c.描述
d.官方
e.是否自动创建
(4)删除本地镜像
#docker rmi image[ image== 库:标签 ][ ID 号 ]
eg:
[root@ceph-dp ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 719cd2e3ed04 6 days ago 109MB
mariadb latest 56089178535f 12 days ago 349MB
centos latest 9f38484d220f 3 months ago 202MB
[root@ceph-dp ~]# docker rmi nginx:latest
Untagged: nginx:latest
Untagged: nginx@sha256:bdbf36b7f1f77ffe7bd2a32e59235dff6ecf131e3b6b5b96061c652f30685f3a
Deleted: sha256:719cd2e3ed04781b11ed372ec8d712fac66d5b60a6fb6190bf76b7d18cb50105
Deleted: sha256:e9b6506fb887de50972aefd99d7c5eb56b1a8e757ed953cdfecb86b5359bcb22
Deleted: sha256:55d9d9692a9615a28d183a42bc3881a72a39393feba3664e669e7affb78daa76
Deleted: sha256:cf5b3c6798f77b1f78bf4e297b27cfa5b6caa982f04caeb5de7d13c255fd7a1e
当有别名镜像时,是同一个ID 号多个名字 ,删除任一个对互相无伤害,直至删除最后一个,镜像被彻底删除用ID号删除,默认会删除同一个ID的多个镜像,除非该镜像创建的容器存在,那么镜像能够不被删除,所以在删除时正确顺序是先删除使用镜像的容器,再删除镜像.
四、docker镜像分层
docker镜像的分层结构:支持通过扩展现有镜像,创建新的镜像
可以看到,新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就 在现有镜像的基础上增加一层。
分层结构的优势:
共享资源:
有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘 上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享,我们将在后面更深入地讨论 这个特性。
这时可能就有人会问了:如果多个容器共享一份基础镜像,当某个容器修改了 基础镜像的内容,比如 /etc 下的文件,这时其他容器的 /etc 是否也会被修改?
答案是不会! 修改会被限制在单个容器内。 这就是我们接下来要学习的容器 Copy-on-Write 特性。
可写的容器层:
当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层” , “容器层”之下的都叫“镜像层” 。
所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。
只有容器层是可写的,容器层下面的所有镜像层都是只读的。
镜像层数量可能会很多,所有镜像层会联合在一起组成一个统一的文件系统。如果不同层中有一个相同路径的文件,比如 /a,上层的 /a 会覆盖下层的 /a,也就是说用户只能访问到上层中的文件 /a。在容器层中,用户看到的是一个叠加之后的文件系统。
添加文件
在容器中创建文件时,新文件被添加到容器层中。
读取文件
在容器中读取某个文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,打开并读入内存。
修改文件
在容器中修改已存在的文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后修改之。
删除文件
在容器中删除文件时,Docker 也是从上往下依次在镜像层中查找此文件。找到后,会在容器层中记录下此删除操作。
只有当需要修改时才复制一份数据,这种特性被称作 Copy-on-Write。可见,容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改。
这样就解释了我们前面提出的问题:容器层记录对镜像的修改,所有镜像层都是只读的,不会被容器修改,所以镜像可以被多个容器共享。
五、docker镜像创建
创建镜像的三种方法
(1)基于修改后的容器创建:docker commit 命令
(2)基于本地模板导入
(3)基于 Dockerfile 文件创建
1、基于修改后的容器创建
#docker run -it centos:latest /bin/bash
#mkdir /testdir
#exit
此时容器较镜像已经发生改变,我们以此生成新镜像
#docker commit container-ID image-name
顺利的话会返回一个新的 ID 号
#docker images
查看镜像列表,会看到本地多了一个名为新名字的镜像
例:
[root@ceph-dp ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mariadb latest 56089178535f 12 days ago 349MB
centos latest 9f38484d220f 3 months ago 202MB
[root@ceph-dp ~]# docker run -it centos:latest /bin/bash
[root@7af23b99a11f /]# ls
anaconda-post.log dev home lib64 mnt proc run srv tmp var
bin etc lib media opt root sbin sys usr
[root@7af23b99a11f /]# mkdir /testdir
[root@7af23b99a11f /]# ls
anaconda-post.log dev home lib64 mnt proc run srv testdir usr
bin etc lib media opt root sbin sys tmp var
[root@7af23b99a11f /]# exit
exit
[root@ceph-dp ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7af23b99a11f centos:latest "/bin/bash" 17 minutes ago Exited (0) 17 minutes ago festive_payne
[root@ceph-dp ~]# docker commit 7af23b99a11f centos7:latest
sha256:c70f570d285a11eb2161571b1577f0c0a6eb674228282bfaf017caaed8e02f89
[root@ceph-dp ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos7 latest c70f570d285a 57 seconds ago 202MB
mariadb latest 56089178535f 12 days ago 349MB
centos latest 9f38484d220f 3 months ago 202MB
2、基于模板导出和导入镜像
导出:将镜像保存为本地文件
[root@ceph-dp ~]# docker save -o centos.tar.gz centos:latest
[root@ceph-dp ~]# ls | grep centos
centos.tar.gz
导入 :将压缩包文件导入到本地镜像列表
#docker load --input centos.tar.gz 或者
#docker load -i centos.tar.gz
#docker images
简单来说,容器是镜像的运行实体。所不同的是它带有额外的可写层
3、基于 Dockerfile 文件创建
Dockerfile 是一个文本文件,用来配置 image,记录了镜像构建的所有步骤Docker 根据 该文件生成二进制的 image 文件。如何可以生成 image 文件如果你要推广自己的软件,势必要自己制作 image 文件。
下面通过一个实例,演示如何编写 Dockerfile 文件:
1、用 Dockerfile 创建 centos-with-vi,其内容则为:
[root@ceph-dp ~]# mkdir dockerfile
[root@ceph-dp ~]# cd dockerfile
[root@ceph-dp dockerfile]# ls
[root@ceph-dp dockerfile]# vim dockerfile
FROM centos:latest
RUN yum install -y vim
[root@ceph-dp dockerfile]# docker build -t centostest:latest .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM centos:latest
---> 9f38484d220f
Step 2/2 : RUN yum install -y vim
---> Running in 9ffd2e9cccb6
Loaded plugins: fastestmirror, ovl
......
Removing intermediate container 9ffd2e9cccb6
---> 2420444962c4
Successfully built 2420444962c4
Successfully tagged centostest:latest
[root@ceph-dp dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centostest latest 2420444962c4 3 minutes ago 357MB
centos7 latest c70f570d285a 32 minutes ago 202MB
mariadb latest 56089178535f 12 days ago 349MB
centos latest 9f38484d220f 3 months ago 202MB
[root@ceph-dp dockerfile]# docker history 2420444962c4
IMAGE CREATED CREATED BY SIZE COMMENT
2420444962c4 7 minutes ago /bin/sh -c yum install -y vim 155MB
9f38484d220f 3 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 3 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 3 months ago /bin/sh -c #(nop) ADD file:074f2c974463ab38c… 202MB
下面列出了 Dockerfile 中最常用的指令,完整列表和说明可参看官方文档。
FROM:指定 base 镜像。
MAINTAINER:设置镜像的作者,可以是任意字符串。
COPY:将文件从 build context 复制到镜像。
COPY 支持两种形式: COPY src dest COPY ["src", "dest"]
注意:src 只能指定 build context 中的文件或目录。
ADD:与 COPY 类似,从 build context 复制文件到镜像。不同的是,如果 src 是归档文件(tar, zip, tgz, xz 等),文件会 被自动解压到 dest。
ENV:设置环境变量,环境变量可被后面的指令使用。例如:
...
ENV MY_VERSION 1.3
RUN apt-get install -y mypackage=$MY_VERSION
...
EXPOSE:指定容器中的进程会监听某个端口,Docker 可以将该端口暴露出来。我们会在容器网络部分详细讨论。
VOLUME:将文件或目录声明为 volume。
WORKDIR:为后面的 RUN, CMD, ENTRYPOINT, ADD 或 COPY 指令设置镜像中的当前工作目录。
RUN:在容器中运行指定的命令,RUN 指令通常用于安装应用和软件包。
CMD:容器启动时运行指定的命令。
Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效。CMD 可以被 docker run 之后的参数替换。
ENTRYPOINT:设置容器启动时运行的命令,可让容器以应用程序或者服务的形式运行。
Dockerfile 中可以有多个 ENTRYPOINT 指令,但只有最后一个生效。CMD 或 docker run 之后的参数会被当做参数传递给ENTRYPOINT。
[root@ceph-dp dockerfile]# docker build -t centostest:latest /root/dockerfile/
或者:docker build -t centostest:latest .
build:创建镜像
-t:为镜像指定名字
.:指明 build context 为当前目录,我们也可以通过 -f 参数指定 Dockerfile 的位置
完整的dockerfile:
[root@ceph-dp ~]# mkdir docker2
[root@ceph-dp ~]# cd docker2/
[root@ceph-dp docker2]# touch {a,b,c}
[root@ceph-dp docker2]# ls
a b c
[root@ceph-dp docker2]# tar czvf test.tar.gz ./*
./a
./b
./c
[root@ceph-dp docker2]# ls
a b c test.tar.gz
[root@ceph-dp docker2]# rm -rf a b c
[root@ceph-dp docker2]#vim dockerfile
FROM centos:latest
MAINTAINER ryan
WORKDIR /testdir
RUN touch tmpfile1
COPY ["test1","."]
ADD ["test.tar.gz","."]
ENV WELCOME "you are in my container.welcome!"
[root@ceph-dp docker2]# touch test1
构建新image过程:
[root@ceph-dp docker2]# docker build -t my-image .
Sending build context to Docker daemon 3.584kB
Step 1/7 : FROM centos:latest
---> 9f38484d220f
Step 2/7 : MAINTAINER ryan
---> Using cache
---> 2eaef50f12c0
Step 3/7 : WORKDIR /testdir
---> Using cache
---> feb488e2b879
Step 4/7 : RUN touch tmpfile1
---> Using cache
---> d0c4416129ec
Step 5/7 : COPY ["test1","."]
---> 54d20621082d
Step 6/7 : ADD ["test.tar.gz","."]
---> bb31ebe4d7a8
Step 7/7 : ENV WELCOME "you are in my container.welcome!"
---> Running in 41eeeceae57a
Removing intermediate container 41eeeceae57a
---> d45517822b8a
Successfully built d45517822b8a
Successfully tagged my-image:latest
运行新创建的容器:
[root@ceph-dp docker2]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my-image latest d45517822b8a 6 minutes ago 202MB
centostest latest 2420444962c4 37 minutes ago 357MB
centos7 latest c70f570d285a About an hour ago 202MB
mariadb latest 56089178535f 12 days ago 349MB
centos latest 9f38484d220f 3 months ago 202MB
registry latest f32a97de94e1 3 months ago 25.8MB
[root@ceph-dp docker2]# docker run -it d45517822b8a
[root@075cc24a95f2 testdir]# ls
a b c test1 tmpfile1
[root@075cc24a95f2 testdir]# pwd
/testdir
[root@075cc24a95f2 testdir]# echo $WELCOME
you are in my container.welcome!
六、docker使用
(1)创建容器,create命令是创建并不启动容器
#docker create -it centos:7
(2)查看所有状态的容器
#docker ps -a
#docker ps
(3)启动停止的容器
#docker start ID
(4)运行一个容器
#docker run -ti docker.io/centos:7 /bin/bash
创建并运行一个容器 ,此时你会直接被切换到容器中
#ctrl+d//exit退出,并且容器也退出
#ctrl+p+q退出容器,并且保持容器up的状态
-t 分配一个伪终端
-i 让容器的标准输入持续打
用/bin/bash环境显示
(5)以后台守护进程(Daemonized)形态运行 用-d参数实现
#docker run -dti docker.io/centos:7
#docker ps -a
(6)终止容器
#docker stop NAME/ID
#docker kill NAME/ID
#docker ps -a
(7)重启容器
#docker restart NAME/ID
#docker ps -a
需要注意,非持久后台守护状态的虚拟机,在重启后当你查看时还是关闭状态
(8)删除容器
语法: docker rm 参数 NAME NAME …
#docker -rm -f NAME/ID
-f 强制删除处于运行中的容
-l 删除链接,保留容器
-v 删除挂载的数据卷
(9)进入容器 docker attach 和 docker exec 两种方式:
docker attach直接进入容器 启动命令的终端,不会启动新的进程
#docker run -d centos /bin/bash -c “while true; do sleep 1;echo I_am_docker;done”
#docker attach NAME/ID
docker exec则是在容器中打开新的终端,并且可以启动新的进程
#docker exec -it NAME/ID /bin/bash
(10)导入和导出容器
a. 导出容器:导出一个已经创建的容器到文件,不管容器是否运行
#docker ps -a 假设当前系统中有两个处于运行和停止状态的容器
#docker export ID > *.tar
#ls
b.将容器导入系统成为镜像
#cat *.tar | docker import - test
(11)查看容器日志 显示容器启动进程的控制台输出
#docker logs -f NAME/ID
(12)暂停容
#docker pause NAME/ID
(13)取消暂停继续运行容器
#docker unpause NAME/ID
下面是容器的常用操作命令:
七、docker镜像的仓库
1、仓库分为公共仓库和私有仓库
DockerHub的官方仓库 https://hub.docker.com
DockerPool社区仓库 https://dl.dockerpool.com
Dockern Pool (http://dockerpool.com)是国内专业的Docker社区,目前也提供了官方镜像的下载管理服务
2、创建自己的私有仓库
环境:
私有仓库:192.168.30.175
客户端:192.168.30.169
(1)docker私有仓库端执行
[root@ceph-dp ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 00022b5b6a7e 14 minutes ago 209MB
busybox latest e4db68de4ff2 3 days ago 1.22MB
mariadb latest 56089178535f 13 days ago 349MB
registry latest f32a97de94e1 3 months ago 25.8MB
[root@ceph-dp ~]# docker run -d -p 5000:5000 -v /var/lib/registry:/var/lib/registry/ --restart=always --name registry registry:latest
0b8c242ac4e6d8ebf97ca0415f4e3e061d4e8fae3456d41bcd25297fb7ad4e4a
[root@ceph-dp ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0b8c242ac4e6 registry:latest "/entrypoint.sh /etc…" 7 seconds ago Up 5 seconds 0.0.0.0:5000->5000/tcp registry
(2)docker客户端设置
修改/etc/docker/daemon.json文件,添加以下内容
"insecure-registries": ["192.168.30.175:5000"],
{
"registry-mirrors": ["http://cc83932c.m.daocloud.io"],
"insecure-registries": ["192.168.30.175:5000"],
"max-concurrent-downloads": 10,
"log-driver": "json-file",
"log-level": "warn",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
(3)重新启动docker服务
systemctl restart docker
(4)给已有的镜像更换一个新标签
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest e4db68de4ff2 3 days ago 1.22MB
[root@localhost ~]# docker tag busybox:latest 192.168.30.175:5000/busybox1:latest
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest e4db68de4ff2 3 days ago 1.22MB
192.168.30.175:5000/busybox1 latest e4db68de4ff2 3 days ago 1.22MB
(5)上传镜像
[root@localhost ~]# docker push 192.168.30.175:5000/busybox1
The push refers to repository [192.168.30.175:5000/busybox1]
6194458b07fc: Pushed
latest: digest: sha256:bf510723d2cd2d4e3f5ce7e93bf1e52c8fd76831995ac3bd3f90ecc866643aff size: 527
(6)删除本地原有的busybox镜像,然后向私有库192.168.30.175重新下载
[root@localhost ~]# docker rmi 192.168.30.175:5000/busybox1
Untagged: 192.168.30.175:5000/busybox1:latest
Untagged: 192.168.30.175:5000/busybox1@sha256:bf510723d2cd2d4e3f5ce7e93bf1e52c8fd76831995ac3bd3f90ecc866643aff
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest e4db68de4ff2 3 days ago 1.22MB
[root@localhost ~]# docker pull 192.168.30.175:5000/busybox1
Using default tag: latest
latest: Pulling from busybox1
Digest: sha256:bf510723d2cd2d4e3f5ce7e93bf1e52c8fd76831995ac3bd3f90ecc866643aff
Status: Downloaded newer image for 192.168.30.175:5000/busybox1:latest
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.30.175:5000/busybox1 latest e4db68de4ff2 3 days ago 1.22MB
busybox latest e4db68de4ff2 3 days ago 1.22MB
八、docker底层依赖的核心技术
命名空间 (Namespaces)
控制组 (Control Groups)
联合文件系统 (Union File System)
Linux 虚拟网络支持:本地和容器内创建虚拟接口
(1)命名空间 (Namespaces):实现了容器间资源的隔离
每个容器拥有自己独立的命名空间 , 运行其中的应用就像是运行在独立的操作系统中一样 , 我们都可以看到文件系统,网卡等资源保证了容器之间互不影响,namespaces管理进程号 , 每个进程命名空间有一套自己的进程号管理方法 , 进程命名空间是一个父子关系的结构 , 子空间中的进程对于父空间是可见的。
网络命名空间—有了 PID 命名空间 , 那么每个名字中的进程就可以相互隔离 ,但是 , 网络端口还是共享本地的端口 . 网络命名空间就是为进程提供一个完全独立的网络协议栈的视图包括 : 网络设备接口 ,IPv4 和 IPv6 协议栈 ,IP 路由表 , 防火墙规则 ,sockets等等 …
目前容器所使用的命名空间提供5种不同的类型 :
(2)控制组功能 cgroups:
控制组 (Control groups)–CGroups 是 Linux 内核的一个特性 ,主要用来对共享资源进行隔离、限制、审计等 。cgroups 允许对于进程或进程组公平 ( 不公平 ) 的分配 CPU 时间、内存分配和 I/O 带宽。
容器通过 cgroups 来得到所能够管理资源的分配和使用。因此容器所获得资源仅为所有系统 资源的一个部分
资源限制 : 内存子系统为进程组设置内存使用上限,内存达到上限后再申请内存,就会发 出 Out of Memory
优先级 : 通过优先级让一些组得到更多 CPU 等资源
资源审计 : 用来统计系统上实际把多少资源用到适合的目的上 , 可以使用 cpuacct 子系统 记录某个进程组使用的 CPU 时间
隔离 : 为组隔离名字空间 , 这样一个组不会看到其他组的进程 .网络连接和文件系统
控制 : 挂起 . 恢复和启动等操作
(3)联合文件系统 (Union FS)
docker 中使用AUFS(another Union File System 或 v2 版本以后的Advanced multi-layered Unification File System) 控制为每一个成员目录设定只读 / 读写 / 写出权限 , 同时 AUFS 有一个类似分层的概念 , 对只读权限的分支可以逻辑上进行增量的修改。
轻量级的高性能分层文件系统 , 它支持将文件系统中的修改信息作为一次提交 ,并层层叠加 , 并且可以将不同目录挂载到同一个虚拟文件系统下,docker目前支持的联合文件系统包括AUFS/btrfs/vfs/DeviceMappe。