1. Docker镜像操作常用指令有哪些
docker version:查看docker版本;
docker info:查看docker详细信息;
docker --help:查看docker命令;
镜像命令
docker images:列出本地主机上的镜像,REPOSITORY:表示镜像的仓库源;TAG:镜像的标签;IMAGE
ID:镜像ID;CREATED:镜像创建时间;SIZE :镜像大小,同一个仓库源可以有多个TAG,可以表示仓库源的不同版本,使用REPOSITORY:TAG来定义不同的镜像;
docker images -a:列出本地所有的镜像;
docker images -p:只显示镜像ID;
docker images --digests:显示镜像的摘要信息;
docker images --no-trunc:显示完整的镜像信息;
docker search tomcat:从Docker Hub上查找tomcat镜像;
容器命令
docker run [OPTIONS] IMAGE:根据镜像新建并启动容器,IMAGE是镜像ID或镜像名称;
docker ps:列出当前所有正在运行的容器;
exit:退出并停止容器;
docker start 容器ID或容器名称:启动容器;
docker restart 容器ID或容器名称:重新启动容器;
docker stop 容器ID或容器名称:停止容器;
docker kill 容器ID或容器名称:强制停止容器;
docker rm 容器ID或容器名称:删除容器;
docker rm -f $(docker ps -a -q):删除多个容器。
2. 06-Docker资源限制
默认情况下,容器没有资源限制,可以使用主机内核调度程序允许的尽可能多的给定资源,Docker 提供了控制容器可以限制容器使用多少内存或CPU 的方法,设置 docker run 命令的运行时配置标志。
其中许多功能都要求宿主机的内核支持linux 功能,要检查支持,可以使用 docker info 命令,如果内核中禁用了某项功能,可能会在输出结尾处看到警告,如下所示:
对于Linux 主机,如果没有足够的内存来执行其他重要的系统任务,将会抛出OOM (Out of Memory Exception,内存溢出、内存泄漏、内存异常), 随后系统会开始杀死进程以释放内存,凡是运行在宿主机的进程都有可能被kill,包括Dockerd和其它的应用程序,如果重要的系统进程被Kill,会导致和该进程相关的服务全部宕机。
linux 会为每个进程算一个分数,最终它会将分数最高的进程kill。
Docker 可以强制执行硬性内存限制,即只允许容器使用给定的内存大小。
Docker 也可以执行非硬性内存限制,即容器可以使用尽可能多的内存,除非内核检测到主机上的内存不够用了。
这些选项中的大多数采用正整数,后跟 b、k、m、g 后缀,蚂姿棚以表示字节、千字节、兆字节或千兆字节。
--memory-swap , 只有在设置了 --memory 后才会有意义。使用Swap,可以让容器将超出限制部分的内存置换到磁盘上,
不同闷则的 --memory-swap 设置会产生不同的效果:
假如一个容器未做内存使用限制,则该容器可以利用到系统内存最大空间,默认创建的容器没有做内存资源册散限制。
启动两个工作进程,每个工作进程最大允许使用内存256M,且宿主机不限制当前容器最大内存:
接着宿主机限制容器最大内存使用:
宿主机cgroup 验证:
--memory-reservation
宿主机cgroup 验证:
一个宿主机,有几十个核的CPU,但是宿主机上可以同时运行成百上千个不同的进程用以处理不同的任务,多进程共用一个CPU 的核心依赖计数就是为可压缩资源,即一个核心的CPU 可以通过调度而运行多个进程,但是同一个单位时间内只能有一个进程在CPU 上运行,那么这么多的进程怎么在CPU 上执行和调度的呢?
Linux kernel 进程的调度基于CFS(Completely Fair Scheler),完全公平调度
默认情况下,每个容器对主机CPU 周期的访问权限是不受限制的,但是我们可以设置各种约束来限制给定容器访问主机的CPU周期,大多数用户使用的是默认的CFS 调度方式,在Docker 1.13 及更高版本中,还可以配置实时优先级。
参数 :
对于一台2核的服务器,如果不做限制,容器会把宿主机的CPU 全部占完:
在宿主机使用 dokcer stats 命令查看容器运行状态:
在宿主机查看CPU 限制参数:
宿主机CPU 利用率:
只给容器分配最多1核宿主机CPU 利用率
宿主机cgroup 验证:
当前容器状态:
宿主机CPU利用率:
容器运行状态:
宿主机CPU利用率:
启动两个容器,stress1 的 --cpu-shares 值为1000 , stress2 的 --cpu-shares 为500,观察最终效果, --cpu-shares 值为1000 的 stress1的CPU 利用率基本是 --cpu-shares 为500 的 stress1的 2 倍:
验证容器运行状态:
宿主机cgroups验证:
动态修改CPU shares的值
--cpu-shares 的值可以在宿主机cgroup 动态修改,修改完成后立即生效,其值可以调大也可以减小。
验证修改后的容器运行状态: