欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

docker总结——容器

程序员文章站 2022-04-18 23:16:52
...

一、运行容器 attach VS exec

attach 与 exec 主要区别如下:

  • attach 直接进入容器 启动命令 的终端,不会启动新的进程。
  • exec 则是在容器中打开新的终端,并且可以启动新的进程。
  • 如果想直接在终端中查看启动命令的输出,用 attach;其他情况使用 exec。

docker exec -it <container> bash|sh是执行 exec 最常用的方式

ps: 如果只是为了查看启动命令的输出,可以使用 docker logs 命令;-f的作用与tail -f类似,能够持续打印输出

二、容器分类

  • 服务类的容器
    • 以 daemon 的形式运行,对外提供服务。比如 web server,数据库等。通过 -d 以后台方式启动这类容器是非常合适的。如果要排查问题,可以通过exec -it进入容器。
  • 工具类的容器
    • 通常给能我们提供一个临时的工作环境,通常以run -it方式运行

三、容器的状态和操作

docker总结——容器

  • pause/unpause暂时让容器暂停工作一段时间,比如要对容器的文件系统打个快照,或者 dcoker host 需要使用 CPU,处于暂停状态的容器不会占用 CPU 资源
  • --restart=always意味着无论容器因何种原因退出(包括正常退出),就立即重启。该参数的形式还可以是 --restart=on-failure:3,意思是如果启动进程退出代码非0,则重启容器,最多重启3次
  • docker rm一次可以指定多个容器,如果希望批量删除所有已经退出的容器,可以执行如下命令:docker rm -v $(docker ps -aq -f status=exited)
  • docker rm是删除容器,而docker rmi是删除镜像

四、限制容器对资源的使用

4.1 限制内存

  • -m--memory:设置内存的使用限额,例如 100M, 2G
  • --memory-swap:设置内存+swap的使用限额
  • docker run -m 200M --memory-swap=300M ubuntu其含义是允许该容器最多使用 200M 的内存和100M的 swap。默认情况下,上面两组参数为 -1,即对容器内存和 swap 的使用没有限制。

测试: docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M

  • --vm1:启动 1 个内存工作线程。
  • --vm-bytes 280M:每个线程分配 280M 内存。

4.2 限制CPU

  • 通过-c--cpu-shares设置容器使用 CPU 的权重。如果不指定,默认值为 1024
  • 通过 cpu share 可以设置容器使用 CPU 的优先级。与内存限额不同,通过 -c 设置的 cpu share 并不是 CPU 资源的绝对数量,而是一个相对的权重值。某个容器最终能分配到的 CPU 资源取决于它的 cpu share 占所有容器 cpu share 总和的比例
  • 需要特别注意的是,这种按权重分配 CPU 只会发生在 CPU 资源紧张的情况下。如果 container_A 处于空闲状态,这时,为了充分利用 CPU 资源,container_B 也可以分配到全部可用的 CPU

4.3 限制Block IO

Block IO 指的是磁盘的读写,docker 可通过设置权重、限制 bps 和 iops 的方式控制容器读写磁盘的带宽

  • 目前 Block IO 限额只对 direct IO(不使用文件缓存)有效
  • 默认情况下,所有容器能平等地读写磁盘,可以通过设置 --blkio-weight参数来改变容器 block IO 的优先级
  • --blkio-weight--cpu-shares类似,设置的是相对权重值,默认为 500

4.4 限制 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。

下面这个例子限制容器写 /dev/sda 的速率为 30 MB/s

docker run -it --device-write-bps /dev/sda:30MB ubuntu

五、容器的底层技术

5.1 cgroup 资源限额

cgroup 全称 Control Group。Linux 操作系统通过 cgroup 可以设置进程使用 CPU、内存 和 IO 资源的限额。相信你已经猜到了:前面我们看到的--cpu-shares-m--device-write-bps实际上就是在配置 cgroup

5.2 namespace 资源隔离

Linux 使用了六种 namespace,分别对应六种资源:Mount、UTS、IPC、PID、Network 和 User

  • Mount namespace让容器看上去拥有整个文件系统
  • UTS namespace让容器有自己的 hostname
  • IPC namespace让容器拥有自己的共享内存和信号量(semaphore)来实现进程间通信,而不会与 host 和其他容器的 IPC 混在一起
  • PID namespace让容器拥有自己独立的一套 PID
  • Network namespace让容器拥有自己独立的网卡、IP、路由等资源
  • User namespace让容器能够管理自己的用户,host 不能看到容器中创建的用户

小结

create      创建容器  
run         运行容器  
pause       暂停容器  
unpause     取消暂停继续运行容器  
stop        发送 SIGTERM 停止容器  
kill        发送 SIGKILL 快速停止容器  
start       启动容器  
restart     重启容器  
attach      attach 到容器启动进程的终端  
exec        在容器中启动新进程,通常使用 "-it" 参数  
logs        显示容器启动进程的控制台输出,用 "-f" 持续打印  
rm          从磁盘中删除容器

摘自:CloudMan

相关标签: docker