前言:在docker1.12中默认增加了swarm mode 编排功能,并且官方支持更多的插件来进行docker的网路和外接存储插件,不过目前测试swarm mode的功能并不是特别理想,还存在一些问题,以后文章可能会讲到,当然毕竟swarm是在docker1.12中新加进来的,想必以后会做的更好,赶超mesos+marathon和kubernetes还是很有希望的。
1.Docker存储驱动详解:
http://blog.csdn.net/zhangyifei216/article/details/50697855
需要注意的是,docker默认支持集中存储驱动:devicemapper,aufs,overlay,btrfs等。在ubuntu系列,默认的的存储驱动是aufs,这种方式是比较适合上生产的;在centos系列上默认的存储驱动是devicemapper,这种方式目前不建议上生产,因为默认使用的是/dev/loop1虚拟设备进行存储数据的,这样可能导致数据的不稳定,以及未来的不可扩展(官方建议是使用devicemapper的时候使用direct-lvm)。
详细的存储驱动官方文档如下:
https://docs.docker.com/engine/userguide/storagedriver/selectadriver/#select-a-storage-driver
Device Mapper:
Ubuntu默认使用AUFS作为存储驱动,但是AUFS并没有被包括在Linux的主线内核中。CentOS中可以使用Device Mapper作为存储驱动,这是在2.6.9内核版本引入的新功能。我们需要先确认是否启用该功能(相应的包为device-mapper):
# ll /sys/class/misc/device-mapper
lrwxrwxrwx 1 root root 0 Jul 20 14:27 /sys/class/misc/device-mapper -> ../../devices/virtual/misc/device-mapper
然而从官方文档以及上面的各种存储驱动比较图中可以看到,devicemapper在centos上默认使用的/dev/loop设备还是不建议在生产中使用的。然而解决这个问题办法就两种,使用lvm方式存放在存储上,或者直接使用额外的分区。
http://www.youruncloud.com/blog/92.html
使用官方建议的direct-lvm模式进行搭建docker存储:
https://docs.docker.com/engine/userguide/storagedriver/device-mapper-driver/
DOCKER_STORAGE_OPTIONS="--storage-driver devicemapper --storage-opt dm.fs=xfs --storage-opt dm.thinpooldev=/dev/mapper/centos-docker--pool --storage-opt dm.use_deferred_removal=true --storage-opt dm.use_deferred_deletion=true "
2.基本环境搭建
- 环境基础:centos7.2 Docker1.12:
# uname -r
3.10.0-327.el7.x86_64
# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
必须要使用centos7的yum源,因为安装过程中需要依赖某些组件,比如libgroup之类的
不建议直接使用docker官方的docker yum源进行安装,因为会依据系统版本去选择docker版本,不能指定相应的版本进行选择安装。本篇文章将使用docker1.12进行部署。 可以直接在github上获取docker各个版本包:
https://github.com/docker/docker/releases
http://yum.dockerproject.org/repo/main/centos/7/Packages/
上面链接中提供了所有的docker核心包,详细包如下:
- 安装docker1,12
可以直接使用yum localinstall进行安装部署。默认会从centos7的官方源中安装依赖(audit-libs-python.x86_64 0:2.4.1-5.el7 checkpolicy.x86_64 0:2.1.12-6.el7 libcgroup.x86_64 0:0.41-8.el7 libseccomp.x86_64 0:2.2.1-1.el7 libsemanage-python.x86_64 0:2.1.10-18.el7 libtool-ltdl.x86_64 0:2.4.2-20.el7 policycoreutils-python.x86_64 0:2.2.5-20.el7
python-IPy.noarch 0:0.75-6.el7 setools-libs.x86_64 0:3.3.7-46.el7 )
#yum localinstall docker-engine-1.12.0-1.el7.centos.x86_64.rpm docker-engine-debuginfo-1.12.0-1.el7.centos.x86_64.rpm docker-engine-selinux-1.12.0-1.el7.centos.noarch.rpm -y
- 验证docker是否安装成功:
注意:centos7中docker1.12中默认使用docker作为客户端程序,使用dockerd作为服务端程序。
# docker version
Client:
Version: 1.12.0
API version: 1.24
Go version: go1.6.3
Git commit: 8eab29e
Built:
OS/Arch: linux/amd64
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
注意:以上显示当前docker版本为1.12,并且docker 服务端程序没有启动。可以使用默认的dockerd启动,也可以使用默认 systemctl status docker .同时也可以使用docker --help查看相关功能特性
- 启动docker daemon程序:
在docker1.12中,默认的daemon程序是dockerd,可以执行dockerd或者使用系统再带systemd去管理服务。但是需要注意的是,默认用的都是默认的参数,比如私有网段默认使用172.17.0.0/16 ,网桥使用docker0等等
# dockerd
INFO[0000] libcontainerd: new containerd process, pid: 10622
WARN[0000] containerd: low RLIMIT_NOFILE changing to max current=1024 max=4096
WARN[0001] devmapper: Usage of loopback devices is strongly discouraged for production use. Please use `--storage-opt dm.thinpooldev` or use `man docker` to refer to dm.thinpooldev section.
WARN[0001] devmapper: Base device already exists and has filesystem xfs on it. User specified filesystem will be ignored.
INFO[0001] [graphdriver] using prior storage driver "devicemapper"
INFO[0001] Graph migration to content-addressability took 0.00 seconds
WARN[0001] mountpoint for pids not found
INFO[0001] Loading containers: start.
INFO[0001] Firewalld running: false
INFO[0001] Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to set a preferred IP address
INFO[0001] Loading containers: done.
INFO[0001] Daemon has completed initialization
INFO[0001] Docker daemon commit=8eab29e graphdriver=devicemapper version=1.12.0
INFO[0001] API listen on /var/run/docker.sock
注意:其实在提示中我们可以看出来使用的桥接网络docker0的172.17.0.0/16,并且用的是devicemapper存储引擎,以及当前docker的版本。
通过centos系统自带的systemd服务管理docker:
#systemctl restart/stop/start/reload/status docker
- 查看docker相关参数以及相关使用帮助
先看docker 服务客户端程序以及服务端启动的相关参数:
# docker info
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 0
Server Version: 1.12.0
Storage Driver: devicemapper #默认使用的存储引擎,centos使用devicemapper,ubuntu系列使用的是aufs
Pool Name: docker-8:2-34118597-pool
Pool Blocksize: 65.54 kB
Base Device Size: 10.74 GB
Backing Filesystem: xfs #当前系统使用的文件系统
Data file: /dev/loop0 #docker的数据存储设备,默认使用的是本地虚拟的一块设备,局限是最大只能承受100G。
Metadata file: /dev/loop1 #docker的元数据存储设备
Data Space Used: 11.8 MB
Data Space Total: 107.4 GB
Data Space Available: 31.06 GB
Metadata Space Used: 581.6 kB
Metadata Space Total: 2.147 GB
Metadata Space Available: 2.147 GB
Thin Pool Minimum Free Space: 10.74 GB
Udev Sync Supported: true
Deferred Removal Enabled: false
Deferred Deletion Enabled: false
Deferred Deleted Device Count: 0
Data loop file: /var/lib/docker/devicemapper/devicemapper/data #docker数据存储文件
WARNING: Usage of loopback devices is strongly discouraged for production use. Use `--storage-opt dm.thinpooldev` to specify a custom block storage device.
Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata #元数据存储目录
Library Version: 1.02.107-RHEL7 (2015-10-14)
Logging Driver: json-file
Cgroup Driver: cgroupfs #cgroup驱动使用的是cgroupfs
Plugins: #当前docker使用的插件
Volume: local #volume默认使用的是本地,之后我们会扩展使用nfs
Network: null overlay bridge host #默认使用的是本地桥接方式,overlay方式可以支持多主机之间的容器互相通信,当然也可以使用一些第三方插件,比如pipnetwork
Swarm: inactive #swarm目前是可以用的,一种docker集群编排方式
Runtimes: runc
Default Runtime: runc
Security Options: seccomp
Kernel Version: 3.10.0-327.el7.x86_64 #内核以及操作系统相关信息
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 3.702 GiB
Name: xxxxx
ID: JUNK:WIJU:463W:VBKM:YT2X:FTE3:F5G4:T5DK:2HTP:HPFB:J4ER:3Y72
Docker Root Dir: /var/lib/docker #docker默认的家目录,数据相关的最后都会存储在这个地方
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
Insecure Registries:
127.0.0.0/8
注意:上面bridge-nf-call-iptables的警告是内核没有开启桥接模式的iptables。这个应该只是影响nat表中的prerouting链,所以之后的实验中应该用不到,但是如果想要开启的话执行以下命令。
#echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
#echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
使用dockerd –help可以查看docker启动相关的参数:
https://docs.docker.com/engine/reference/commandline/dockerd/
#dockerd --help(其实dockerd就相当于之前的docker -d)
-b, --bridge #指定容器使用的网络接口,默认为docker0,也可以指定其他网络接口
--bip #指定桥接地址,即定义一个容器的私有网络
--cgroup-parent #为所有的容器指定父cgroup
--cluster-advertise #为集群设定一个地址或者名字
--cluster-store #后端分布式存储的URL
--cluster-store-opt=map[] #设置集群存储参数
--config-file=/etc/docker/daemon.json #指定配置文件
-D #启动debug模式
--default-gateway #为容器设定默认的ipv4网关(--default-gateway-v6)
--dns=[] #设置dns
--dns-opt=[] #设置dns参数
--dns-search=[] #设置dns域
--exec-opt=[] #运行时附加参数
--exec-root=/var/run/docker #设置运行状态文件存储目录
--fixed-cidr #为ipv4子网绑定ip
-G, --group=docker #设置docker运行时的属组
-g, --graph=/var/lib/docker #设置docker运行时的家目录
-H, --host=[] #设置docker程序启动后套接字连接地址
--icc=true #是内部容器可以互相通信,环境中需要禁止内部容器访问
--insecure-registry=[] #设置内部私有注册中心地址
--ip=0.0.0.0 #当映射容器端口的时候默认的ip(这个应该是在多主机网络的时候会比较有用)
--ip-forward=true #使net.ipv4.ip_forward生效,其实就是内核里面forward
--ip-masq=true #启用ip伪装技术(容器访问外部程序默认不会暴露自己的ip)
--iptables=true #启用容器使用iptables规则
-l, --log-level=info #设置日志级别
--live-restore #启用热启动(重启docker,保证容器一直运行1.12新特性)
--log-driver=json-file #容器日志默认的驱动
--max-concurrent-downloads=3 #为每个pull设置最大并发下载
--max-concurrent-uploads=5 #为每个push设置最大并发上传
--mtu #设置容器网络的MTU
--oom-score-adjust=-500 #设置内存oom的平分策略(-1000/1000)
-p, --pidfile=/var/run/docker.pid #指定pid所在位置
-s, --storage-driver #设置docker存储驱动
--selinux-enabled #启用selinux的支持
--storage-opt=[] #存储参数驱动
--swarm-default-advertise-addr #设置swarm默认的node节点
--tls #使用tls加密
--tlscacert=~/.docker/ca.pem #配置tls CA 认证
--tlscert=~/.docker/cert.pem #指定认证文件
--tlskey=~/.docker/key.pem #指定认证keys
--userland-proxy=true #为回环接口使用用户代理
--userns-remap #为用户态的namespaces设定用户或组
注意:因为默认的dockerd参数不一定适合我们使用的环境,因此在启动的时候我们需要针对实际情况去配置相应的参数,比如docker数据家目录以及默认容器的私有地址等等
- Docker 启动参数的配置
1.docker存储驱动的配置,devicemapper下的direct-lvm模式,创建一个/dev/mapper/docker-thinpool设备.lvm管理就不再多讲了,网上资料太多。。。
#!/bin/bash
pvcreate /dev/vda1
vgcreate docker /dev/vda1
lvcreate --wipesignatures y -n thinpool docker -l 95%VG
lvcreate --wipesignatures y -n thinpoolmeta docker -l 1%VG
lvconvert -y --zero n -c 512K --thinpool docker/thinpool --poolmetadata docker/thinpoolmeta
echo "activation {
thin_pool_autoextend_threshold=80
thin_pool_autoextend_percent=20
}" > /etc/lvm/profile/docker-thinpool.profile
lvchange --metadataprofile docker-thinpool docker/thinpool
echo "Print the vgs:"
vgdisplay
echo "Print the lvs:"
lvdisplay
lvs -o+seg_monitor
systemctl daemon-reload
systemctl start docker
2.修改和配置centos7中docker启动配置文件:
centos系统的配置文件/usr/lib/systemd/system/docker.service,这个是模板文件:
#mkdir /etc/systemd/system/docker.service.d
#touch /etc/systemd/system/docker.service.d/docker.conf
#cat /etc/systemd/system/docker.service.d/docker.conf
#
#线上详细配置
ExecStart=/bin/dockerd --storage-driver=devicemapper --storage-opt=dm.thinpooldev=/dev/mapper/docker-thinpool --storage-opt dm.use_deferred_removal=true -D -H tcp://0.0.0.0:5256 -H unix:///var/run/docker.sock --pidfile=/var/run/docker.pid --swarm-default-advertise-addr=172.25.47.210 --bip=10.0.0.1/24 --icc=false --insecure-registry=172.25.46.8:5001
注意:
#存储驱动参数--storage-opt详情
dm.thinpooldev 为docker存储的thin pool指定一个可用的块存储设备(默认的是/dev/loop设备;生产环境建议使用direct-lvm)
dm.basesize 当创建一个基础设备(用来限制images和container的大小)的时候,指定大小。默认会给一个容器10G。需要注意的是,base device size 可用在docker重启的时候增加。但是每次修改完配置后必须把相应的/var/lib/docker底下的相关目录删除掉。否则重启会检测失败。
dm.fs 为base device指定使用的文件系统类型(ext4,xfs默认)
dm.mkfsarg 指定额外的格式化参数(--storage-opt "dm.mkfsarg=-O ^has_journal")
dm.datadev/dm.metadatadev 设置docker存储的data和metadata,不过已经过时了,目前使用的基本都是dm.thinpooldev参数(--storage-opt dm.datadev=/dev/sdb1 --storage-opt dm.metadatadev=/dev/sdc1)
修改完配置文件之后需要刷新下配置:
systemctl daemon-reload
systemctl restart docker
查看相关日志:
journalctl -u docker
ubuntun系统的配置文件默认在/etc/default/docker
- Docker1.12容器管理-自动启动容器
1.当使用docker start -a参数,docker会自动attach到容器里面,或者在需要的时候启动它,为了当一个容器停止并且重启它的时候管理程序(systemd)够检测到.
实例:
[Unit]
Description=Redis container
Requires=docker.service
After=docker.service
[Service]
Restart=always
ExecStart=/usr/bin/docker start -a redis_server
ExecStop=/usr/bin/docker stop -t 2 redis_server
[Install]
WantedBy=default.target
如果把这个容器作为一个系统服务,需要将上面的配置添加到文件/etc/systemd/system/docker-redis_server.service.
如果需要传入参数到到容器里面,比如–env那你必须使用docker run,而不是docker start,这样在每次服务启动的时候会创建一个新的容器。
[Service]
...
ExecStart=/usr/bin/docker run --env foo=bar --name redis_server redis
ExecStop=/usr/bin/docker stop -t 2 redis_server
ExecStopPost=/usr/bin/docker rm -f redis_server
...
启动上面的docker容器:
systemctl daemon-reload
systemctl start docker-redis_server.service
systemctl enable docker-redis_server.service
- Docker1.12容器管理-docker不可用期间保持容器存活
1.首先我们得确认docker在启动的时候支持热加载选项,两种方式如下: docker已启动,又不想停止,可以增加一个配置文件到docker服务的配置文件中
#vim /etc/docker/daemon.json
{
"live-restore": true
}
修改完配置之后必须发送一个SIGHUB
信号给docker守护进程以便重新加载配置。 要么就在启动的时候加上--live-restore参数
2.这种热启动其实可以用在docker的升级期间。但是如果你是跳过一个版本去升级的,守护进程可能不会重新加载连接到容器,如果不能连接到容器的话,你就必须手动的去管理容器了,守护进程不会去关掉这些断开连接的容器。
3.热重启用在restart docker守护进程的时候,可以减少用户的卡顿(但是前提是重启的时候主配置不能变,比如网桥啦,还有数据存储目录啦)
4.热重启对运行中的容器的影响。守护进程的长时间卡顿可能影响运行中的容器。因为容器进程会写FIFO日志,以便供守护进程消费,如果守护进程不可用,不能消费容器输出内容,buffer酒会慢,并且堵塞不能写进日志。默认的buffer大小为64k,此时必须重启docker去刷新buffer。
buffer大小的修改:
/proc/sys/fs/pipe-max-size
5.热重启和swarm 模式
热重启参数和docker swarm模式不兼容,当docker1⃣️swarm模式运行,整个docker流程主要用来管理任务和保证容器按照一定的服务标准运行。
- Docker1.12容器管理-使用systemd管理和配置docker
1.使用systemd管理docker
#systemctl stop/start/status/enable/restart docker
`默认systemd管理的服务都会放在/usr/lib/systemd/system/docker.service类此这样的目录.当然也是可以自定义加载配置文件的`
2.自定义docker启动选项
有多种推荐的方式去自定义修改docker启动参数,这里推荐的一种就是使用systemd的drop-in文件去加载相应的参数。其实就是创建一个目录/etc/systemd/system/docker.service.d,然后在目录里面加载相应的配置文件*.conf. 注意:这种方式需要注意会默认包含/etc/systemd/system/docker.service,因为这个文件是从/lib/systemd/system/docker.service复制过来的
# cat /etc/systemd/system/docker.service.d/docker.conf
[Service]
ExecStart=
ExecStart=/bin/dockerd -D -H tcp://0.0.0.0:5256 -H unix:///var/run/docker.sock --pidfile=/var/run/docker.pid --swarm-default-advertise-addr=172.25.47.210 --bip=10.0.0.1/24 --icc=false -g /export/lib/docker --insecure-registry=172.25.46.8:5001
需要注意的是,必须配置两个execstart才能正确启动docker
使用systemctl show可以查看服务相关的配置,比如以下查看启动时加载参数:
也可以查看docker环境加载配置
systemctl show docker | grep EnvironmentFile
EnvironmentFile=-/etc/sysconfig/docker (ignore_errors=yes)
# systemctl show docker | grep ExecStart
ExecStart={ path=/bin/dockerd ; argv[]=/bin/dockerd -D -H tcp://0.0.0.0:5256 -H unix:///var/run/docker.sock --pidfile=/var/run/docker.pid --swarm-default-advertise-addr=172.25.47.210 --bip=10.0.0.1/24 --icc=false -g /export/lib/docker --insecure-registry=172.25.46.8:5001 ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }
配置运行时目录以及存储引擎相关:
其实上面的启动配置中已经加载了运行时目录为-g /export/lib/docker 设置存储引擎–storage-driver=overlay/devicemapper/aufs
配置http代理
#cat /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80/"
如果:内部的docker registries 不需要通过代理去连接,可以按照以下配置:
Environment="HTTP_PROXY=http://proxy.example.com:80/" "NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com"
刷新配置查看配置文件正确后重启:
systemctl daemon-reload
systemctl show –property=Environment docker
systemctl restart docker
- Docker1.12容器管理-格式化命令以及输出:
https://docs.docker.com/engine/reference/commandline/images/#formatting
https://docs.docker.com/engine/reference/commandline/inspect/#examples
https://docs.docker.com/engine/admin/logging/log_tags/
https://docs.docker.com/engine/reference/commandline/network_inspect/
https://docs.docker.com/engine/reference/commandline/ps/#formatting
https://docs.docker.com/engine/reference/commandline/volume_inspect/
https://docs.docker.com/engine/reference/commandline/version/#examples
示例:
# docker ps --format '{{json .Names}}'
"xxbandy-1"
"xxbandy"
# docker ps --format '{{json .Ports}}'
"0.0.0.0:2221-\u003e8000/tcp"
"0.0.0.0:2222-\u003e8000/tcp"
#docker inspect --format '{{json .Config}}' xxbandy
{"Hostname":"jupyterhub","Domainname":"","User":"","AttachStdin":false,"AttachStdout":false,"AttachStderr":false,"ExposedPorts":{"8000/tcp":{}},"Tty":true,"OpenStdin":true,"StdinOnce":false,"Env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"],"Cmd":["bash"],"Image":"172.25.46.8:5001/jupyter","Volumes":null,"WorkingDir":"/export","Entrypoint":null,"OnBuild":null,"Labels":{"build-date":"20160701","license":"GPLv2","name":"CentOS Base Image","vendor":"CentOS"}}
# docker inspect --format '{{json .NetworkSettings.IPAddress}}' xxbandy
"10.0.0.2"
# docker inspect --format '{{json .NetworkSettings.Ports}}' xxbandy
{"8000/tcp":[{"HostIp":"0.0.0.0","HostPort":"2222"}]}
默认是map映射格式:
# docker inspect --format '{{ .NetworkSettings.Ports}}' xxbandy
map[8000/tcp:[{0.0.0.0 2222}]]
- Docker1.12容器管理-日志相关:
1.配置日志驱动:
https://docs.docker.com/engine/admin/logging/overview/
默认支持很多种日志驱常见的有json-file,rsyslog,journald,可以使用在docker run 的时候使用–log-driver= 设定需要的日志驱动,默认使用的是json-flie格式。
需要注意的是,docker logs命令目前只吃吃json-file和journald格式
json-file格式相关参数:
–log-opt max-size= 当容器日志达到一定程度就会回滚
2.为日志打标签
- Docker1.12容器管理-运行状态测量:
1.docker使用docker stats命令来查看容器的运行状态,支持查看CPU ,MEM,NET等状态。
# docker stats --no-stream xxbandy
CONTAINER CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
xxbandy 0.01% 123.2 MiB / 3.702 GiB 3.25% 6.632 MB / 4.066 MB 52.11 MB / 6.328 MB 0
2.Cgroups
linux容器技术依赖于cgroup技术,通过cgroup相关文件可以暴露出来cpu,内存以及I/0的使用情况。cgroup通过一个pseudo-filesystem暴露使用详情,因此你可以在/sys/fs/cgroup中去找到相关的查找。当然也有一些老的linux系统会将cgroup挂载在/cgroup下,这个可以查看cgroup包具体讲一些软件装在什么地方。当然也可以直接使用以下命令发现当前系统挂载点:
# grep cgroup /proc/mounts
3.列举cgroup可以管控的资源信息:
# cat /proc/cgroups
当然也可以使用/proc/pid/cgroup查看一个进程属于哪个控制组信息,或者通过查看某一个正在运行容器使用的内存限制:/sys/fs/cgroup/memory/docker/longid/.
4.内存,cpu,block I/O上的限制:
可以使用memory.stat文件进行内存上的限制,
# cat /sys/fs/cgroup/memory/docker/memory.stat
cache 20082688
rss 0
rss_huge 0
mapped_file 6488064
swap 0
pgpgin 4903
pgpgout 0
pgfault 0
pgmajfault 0
inactive_anon 0
active_anon 0
inactive_file 13438976
active_file 6643712
unevictable 0
hierarchical_memory_limit 9223372036854775807
hierarchical_memsw_limit 9223372036854775807
total_cache 20082688
total_rss 3604480
total_rss_huge 0
total_mapped_file 6488064
total_swap 0
total_pgpgin 7694
total_pgpgout 2422
total_pgfault 5083
total_pgmajfault 0
total_inactive_anon 0
total_active_anon 3604480
total_inactive_file 13438976
total_active_file 6643712
total_unevictable 0
上图中前半部分没有以total_开头的是在cgroups中有关进程的统计,后半部分包含sub-cgrouops的统计。
cache:这个被cgroup控制进程的内存值会在block设备上分配一个block,当在读写disk上的文件,这个值会增加。这也是被tmpfs使用的内存值
rss:这个值不会和磁盘上的一致:stacks,heaps, anonymous memory maps
mapped_file:表示映射到cgroup里面进程的内存量,不会告诉你使用了多少内存信息,只会告诉你他怎样被使用的。
swap:cgroup中被进程使用的当前swap值
可以使用cpuacct.stat文件对容器的cpu进行相关限制:
显示当前所有容器中进程占用的cpu
# cat /sys/fs/cgroup/cpu,cpuacct/docker/cpuacct.stat
user 1153
system 717
/sys/fs/cgroup/blkio目录中存放block I/O相关信息
5.网络资源的测量:
网络资源部直接由cgroup控制,网络接口直接存在于network namespace。内核能够通过一组进程计算每个包和发送/接受字节的长度,但是这些值一般并没有什么用。
So,一般会使用以下工具进行收集网络状况信息:
# iptables -I OUTPUT -p tcp --sport 80
# iptables -nxvL OUTPUT
Chain OUTPUT (policy ACCEPT 3 packets, 396 bytes)
pkts bytes target prot opt in out source destination
0 0 tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp spt:80
来源:oschina
链接:https://my.oschina.net/u/1026229/blog/735532