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
进入容器。
- 以 daemon 的形式运行,对外提供服务。比如 web server,数据库等。通过 -d 以后台方式启动这类容器是非常合适的。如果要排查问题,可以通过
- 工具类的容器
- 通常给能我们提供一个临时的工作环境,通常以
run -it
方式运行
- 通常给能我们提供一个临时的工作环境,通常以
三、容器的状态和操作
-
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
-
--vm
1:启动 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
上一篇: kibana5.5.2部署-02