01.如何运行容器
#启动容器 -d 后台,--name指定容器运行的名称
[email protected]:~# docker run --name "my_httpd_server" -d httpd
8bd623b3e7b88c585f99aeab17e97c597e2e0193d65f581a61d0c58ebb0d6043
#查看容器
[email protected]:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8bd623b3e7b8 httpd "httpd-foreground" 22 seconds ago Up 20 seconds 80/tcp my_httpd_server
#干掉容器 短ID=长ID的前12位 如何指定容器:1)长ID 2)短ID 3)name
[email protected]:~# docker stop 8bd623b3e7b8
8bd623b3e7b8
02.进入容器
#运行一个
docker run -d centos /bin/bash -c "while true;do sleep 1;echo hha;done"
#attached进入 attach 直接进入容器 启动命令 的终端,不会启动新的进程
docker attach a4967bf73180af7f5a02f9fa464bb50d46798060ae57b427e000dfb7d4f03f64
#exec进入 exec 则是在容器中打开新的终端,并且可以启动新的进程
docker exec -it a4967bf73180af7f5a02f9fa464bb50d46798060ae57b427e000dfb7d4f03f64
#查看log
docker logs -f a4967bf73180af7f5a02f9fa464bb50d46798060ae57b427e000dfb7d4f03f64
03.容器运行的最佳实践
按用途容器大致可分为两类:服务类容器和工具类的容器
A.服务类容器以 daemon 的形式运行,对外提供服务。比如 web server,数据库等。通过 -d 以后台方式启动这类容器是非常合适的。如果要排查问题,可以通过 exec -it 进入容器。
B.工具类容器通常给能我们提供一个临时的工作环境,通常以 run -it 方式运行,比如
04.docker create start stop restart pause unpause rm/rmi
--restart=always 意味着无论容器因何种原因退出(包括正常退出),就立即重启。该参数的形式还可以是 --restart=on-failure:3,意思是如果启动进程退出代码非0,则重启容器,最多重启3次。
下面是容器的常用操作命令:
create 创建容器
run 运行容器
pause 暂停容器
unpause 取消暂停继续运行容器
stop 发送 SIGTERM 停止容器
kill 发送 SIGKILL 快速停止容器
start 启动容器
restart 重启容器
attach attach 到容器启动进程的终端
exec 在容器中启动新进程,通常使用 "-it" 参数
logs 显示容器启动进程的控制台输出,用 "-f" 持续打印
rm 从磁盘中删除容器
05.限制对内存的使用
内存限额
与操作系统类似,容器可使用的内存包括两部分:物理内存和 swap。 Docker 通过下面两组参数来控制容器内存的使用量。
-m 或 --memory:设置内存的使用限额,例如 100M, 2G。
--memory-swap:设置 内存+swap 的使用限额。
当我们执行如下命令:
docker run -m 200M --memory-swap=300M ubuntu
其含义是允许该容器最多使用 200M 的内存和 100M 的 swap。默认情况下,上面两组参数为 -1,即对容器内存和 swap 的使用没有限制。
06.限制对CPU的使用
Docker 可以通过 -c 或 --cpu-shares 设置容器使用 CPU 的权重。如果不指定,默认值为 1024。
与内存限额不同,通过 -c 设置的 cpu share 并不是 CPU 资源的绝对数量,而是一个相对的权重值。某个容器最终能分配到的 CPU 资源取决于它的 cpu share 占所有容器 cpu share 总和的比例。
换句话说:通过 cpu share 可以设置容器使用 CPU 的优先级。
比如在 host 中启动了两个容器:
docker run --name "container_A" -c 1024 ubuntu
docker run --name "container_B" -c 512 ubuntu
container_A 的 cpu share 1024,是 container_B 的两倍。当两个容器都需要 CPU 资源时,container_A 可以得到的 CPU 是 container_B 的两倍。
07.限制容器的BLOCK IO
Block IO 是另一种可以限制容器使用的资源。Block IO 指的是磁盘的读写,docker 可通过设置权重、限制 bps 和 iops 的方式控制容器读写磁盘的带宽,下面分别讨论。
注:目前 Block IO 限额只对 direct IO(不使用文件缓存)有效。
block IO 权重
默认情况下,所有容器能平等地读写磁盘,可以通过设置 --blkio-weight 参数来改变容器 block IO 的优先级。
--blkio-weight 与 --cpu-shares 类似,设置的是相对权重值,默认为 500。在下面的例子中,container_A 读写磁盘的带宽是 container_B 的两倍。
docker run -it --name container_A --blkio-weight 600 ubuntu
docker run -it --name container_B --blkio-weight 300 ubuntu
08.底层实现技术
cgroup 全称 Control Group。Linux 操作系统通过 cgroup 可以设置进程使用 CPU、内存 和 IO 资源的限额。/sys/fs/cgroup/下有container的ID
namespace 管理着 host 中全局唯一的资源,并可以让每个容器都觉得只有自己在使用它。换句话说,namespace 实现了容器间资源的隔离。