容器长期运行
容器的生命周期依赖于启动时执行的命令,只要该命令不结束,容器也就不会退出。根据这个原理,我们就可以通过执行一个长期运行的命令来保持容器的运行状态。
进入容器的两种方法
attach
docker attach CONTAINER_ID
exec
docker exec -it <container> bash|sh
attach VS exec
两者的主要区别如下:
- attach直接进入容器启动命令的终端,不会启动新的进程;
- exec 则是在容器中打开新的终端,并且可以启动新的进程。
查看启动命令的输出:
docker logs -f <container> # -f类似tail -f,持续打印输出
stop/start/restart 容器
停止/启动/重启
注:对于服务类容器,我们通常希望在容器因某种错误而停止运行的情况下,能够自动重启。通过启动容器时设置 --restart参数就可以达到效果。
举例:
docker run -d --restart=always httpd
docker run -d --restart=on-failure:3
pause/unpause 容器
暂停容器/恢复容器
处于暂停的容器不会赞同cpu资源,知道通过docker unpause恢复运行
容器状态图
docker run = docker created + docker start
容器退出包括正常的退出和异常退出。这里举了两个例子:启动进程正常退出或者发生OOM,此时Docker会根据 --restart 的策略判断是否需要重启容器。但是如果容器执行了docker stop 或 docker kill 退出,则不会自动重启。
资源限制
内存限额
容器可以使用的内存:物理内存和swap
- -m或–memory:设置内存的使用限额, 例如:100MB, 2GB
- –memory-swap: 设置内存+swap的使用限额。
docker run -m 200M --memory-swap=300 ubuntu
其含义是允许容器最多使用200MB的内存和100MB的swap。
CPU 限额
docker 可以通过 -c 或–cpu-shares 设置容器使用CPU的权重。这个值不是CPU资源的绝对数量,而是一个相对的权重值。某个cpu最终能分配到的CPU资源取决于它的CPU share占所有cpu share总和的比例。
注意:这种按权重分配CPU只会发生在cpu资源紧张的情况下。
Block IO带宽限额
Block IO指的是磁盘的读写,docker 可通过设置权重、限制bps和iops的方式控制容器读写磁盘的带宽。
注:目前Block IO限额只对direct IO(不使用文件缓存)有效。
- block IO权重
通过设置–blkio-weight参数来改变容器block IO的优先级。
docker run -ti --name container_A --blkio-weight 600 ubuntu
docker run -ti --name container_B --blkio-weight 300 ubuntu
- 限制bps和iops
bps:byte per second,每秒读写的数据量
iops:io per second,每秒IO的次数- –device-read-bps:
- –device-write-bps:
- –device-read-iops:
- –device-write-iops:
下面这个例子限制容器写/dev/sda的速率为30MB/s
docker run -ti --devce-write-bps /dev/sda:30MB ubuntu