docker容器运行和资源限制

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Chen_Victor/article/details/79052682

Docker学习笔记


一,运行容器

如图运行容器
这里写图片描述
容器执行完命令后就退出了。

容器的生命周期依赖于启动时执行的命令,只要该命令不结束,容器也就不会退出。

可以通过加上参数-d以后台方式启动容器,如图
这里写图片描述

CONTAINER ID 是容器的短id,前面启动容器时返回的使长id。短id是长id的前12个字符。
NAMES字段显示容器的名字,在启动容器时可以通过–name参数显示地为容器命名,如果不指定,docker会自动为容器分配名字。


二,两种进入容器的方法

我们经常需要进入到容器里去做一些工作,比如查看日志、调试、启动其他进程等。有两种方法进入容器:
1,docker attach
通过docker attach可以attach到容器启动命令的终端

2,docker exec
通过docker exec进入相同的容器,-it指定以交模式打开,执行exit退出容器,回到docker host

3,attach和exec的区别:

  1. attach直接进入容器启动命令的终端,不会启动新的进程。
  2. exec则是在容器中打开新的终端,并且可以 启动新的进程。
  3. 如果想直接在终端查看启动命令的输出,用attach,其他情况使用exec。
  4. 如果只是为了查看启动命令的输出,可以使用docker logs命令。

三,运行容器的最佳实践

按用途容器大致可分为两类:服务类容器和工具类容器。

服务类容器以daemon守护者进程的形式运行,对外提供服务,比如web server、数据库等。通过-d以后台方式启动这类容器是非常合适的。如果要排查问题,可以通过exec -it进入容器。

工具类容器通常能给我们提供一个临时的工作环境,通过以run -it方式运行。
工具类容器多使用基础镜像,例如debian、ubuntu等。


四,stop/kill/start/restart容器

通过docker stop可以停止运行的容器,容器在docker host中实际上是一个进程,如果想快速停止容器,可使用docker kill命令。

对于处于停止状态的容器,可以通过docker start重新启动。
docker start会保留容器的第一次启动的所有参数。即如果你是通过docker run -d以守护进程的形式启动容器,你stop后start容器,容器还是会以守护进程的形式运行。

docker restart可以重启容器,期作用就是依次执行docker stop和docker start。

容器可能会因某种错误而停止运行。对于服务类容器,我们通常希望在这种情况下容器能够自动重启。启动容器时设置–restart就可以达到这个效果。
–restart=always,意味着无论容器因何种原因退出(包括正常退出),都立即重启,该参数的形式还可以是–restart=on-failure:3,意思是如果启动进程退出代码非0,则重启容器,最多重启3次。


五,pause/unpause容器

有时我们只是希望让容器暂停工作一段时间,比如要对容器的文件系统打个快照,或者docker host需要使用CPU,这是执行docker pause。

处于暂停状态的容器不会占用CPU资源,直接通过docker unpause恢复运行。


六,删除容器

使用docker一段时间后,host上可能会有大量已经退出了的容器(可以通过docker ps -a查看正在运行或已经停止的容器),如图
这里写图片描述
这些容器依然会占用host 的文件系统,如果确认不会再重启此类容器,可以通过docker rm删除。
docker rm一次可以指定多个容器。

docker rm是删除容器,docker rmi是删除镜像。


七,资源限制

一个docker host上会运行若干个容器,每个容器都需要CPU、内存和io资源。对于VMware等虚拟化技术,用户可以控制分配多少CPU、内存资源给每个虚拟机。对于容器,docker也提供了类似的机制避免某个容器因占用太多资源而影响其他容器乃至整个host的性能。

关于docker的内存限额、CPU限额可以使用progrium/stress镜像来学习或测试,progrium/stress是专门用来做压力测试的。

1,内存限制

与操作系统类似,容器可使用的内存包括两部分:物理内存和swap。docker通过下面两组参数来控制内存的使用量。

  1. -m 或 -memory:设置内存的使用限额,例如100MB,2GB。
  2. -memory -swap:设置内存+swap的使用限额。

    当我们执行如下命令:

docker run -m 200M --memory-swap=300M ubuntu

其含义是允许该容器最多使用200MB的内存和100MB的swap。默认情况下,上面两组参数为-1,即对容器内存和swap的使用没有限制。

2,CPU限额

默认设置下,所有容器可以平等地使用host CPU资源并且没有限制。

docker可以通过 -c 或 –cpu-shares 设置容器使用CPU的权重。如果不指定,默认值为1024。

与内存限额不同,通过 -c 设置的 CPU share 并不是CPU资源的绝对数量,而是一个相对的权重值。某个容器最终能分配到CPU资源取决于它的CPU share占所有容器CPU share总和的比例。
即通过CPU share可以设置容器使用CPU的优先级。

3,Block IO 宽带限额

Block IO 是另一种可以限制容器使用的资源。Block IO 指的是磁盘的读写,docker 可通过设置权重、限制 bps 和 iops 的方式控制容器读写磁盘的带宽。

1,block io 权重
默认情况下,所有容器能平等地读写磁盘,可以通过设置 –blkio-weight 参数来改变容器 block io 的优先级。
–blkio–weight 与 –cpu-shares 类似,设置的是相对权重值,默认为500。

2,限制 bps 和 iops
bps 是 byte per second ,每秒读写的数据量。
iops 是 io per second ,每秒 IO 的次数。

可通过以下参数控制容器的 bps 和 iops:

  • –device-read-bps:限制读某个设备的 bps。
  • –device-write-bps:限制写某个设备的 bps。
  • –device-read-iops:限制读某个设备的 iops。
  • –device-write-iops:限制写某个设备的 iops。

八,参考资料

《每天5分钟 玩转Docker容器技术》

展开阅读全文

没有更多推荐了,返回首页