文章目录
一、运行容器 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
让容器有自己的 hostnameIPC namespace
让容器拥有自己的共享内存和信号量(semaphore)来实现进程间通信,而不会与 host 和其他容器的 IPC 混在一起PID namespace
让容器拥有自己独立的一套 PIDNetwork namespace
让容器拥有自己独立的网卡、IP、路由等资源User namespace
让容器能够管理自己的用户,host 不能看到容器中创建的用户
小结
create 创建容器
run 运行容器
pause 暂停容器
unpause 取消暂停继续运行容器
stop 发送 SIGTERM 停止容器
kill 发送 SIGKILL 快速停止容器
start 启动容器
restart 重启容器
attach attach 到容器启动进程的终端
exec 在容器中启动新进程,通常使用 "-it" 参数
logs 显示容器启动进程的控制台输出,用 "-f" 持续打印
rm 从磁盘中删除容器
摘自:CloudMan