1、创建容器常用选项
-i 交互式
-t 分配一个伪终端
-d 运行容器到后台
-e 设置环境变量
-p 发布容器端口到主机
-P 发布容器所有EXPOSE的端口到宿主机随机端口
-name 指定容器名称
-h 设置容器主机名
-ip 指定容器IP,只能用于自定义网络
-network 连接容器到一个网络
-mount 将文件系统附加到容器
-v 绑定挂载一个卷
-restart 容器退出时重启策略,默认no,可选值:[always | on-failure]
2、容器资源限制
-m ,-memory 容器可以使用的最大内存量
-memory-swap 允许交换到磁盘的内存量
-memory-swappiness=<0-100> 容器使用SWAP分区交换的百分比(0-100,默认-1)
-oom-kill-disable 禁用OOM Killer
--cpus 可以使用CPU数量
-cpuset-cpus 限制容器使用特定的cpu核心,如(0-3,0,1)
-cpu-shares CPU共享(相对权重)
3、管理容器常用命令
ls 列出容器
inspect 查看一个或多个容器详细信息
exec 在运行容器中执行命令
commit 创建一个新镜像来自一个容器
cp 拷贝文件/文件夹到一个容器
logs 获取一个容器日志
port 列出或指定容器端口映射
top 显示一个容器运行的进程
stats 显示容器资源使用统计
stop/start/restart 停止/启动一个或多个容器
rm 删除一个或多个容器
prune 移除已停止的容器
4、容器实现核心技术:Namespace
在容器化中,一台物理机可以运行多个不同操作系统,需要解决“隔离性”。
Linux内核从2.4.19版本开始引进namespace概念,其目的是将特定的全局系统资源通过抽象方法使得namespace中的进程看起来拥有自己隔离的资源
docker就是借助这个机制实现了容器资源隔离
LINUX 的Namespace机制提供了6个不同命名空间:
IPC:隔离进程间通信
MOUNT:隔离文件系统挂载点
NET:隔离网络协议栈
PID:隔离进程号,进程命名空间是一个父子结构,子空间对父空间可见
USER:隔离用户
UTS:隔离主机名和域名
5、容器实现核心技术:CGroups
docker利用namespace实现容器之间资源隔离,不能对容器资源限制,例如CPU,内存
如果某个容器属于cpu密集型任务,那么会影响到其他容器使用cpu,导致多个容器相互抢占资源
需要对多个容器的资源使用进行限制就成了容器化主要问题---------Contorl Groups(简称: CGroups),限制容器资源
CGroups: 所有的任务就是运行在系统中的一个进程,而CGroups以某种标准将一组进程为目标进行资源分配和控制(例如cpu,内存,带宽等,并可以动态配置)
CGroups主要功能:
限制进程组使用的资源数量:可以为进程设定资源上线,如内存
进程组优先级控制:可以为进程分配特定cpu,磁盘IO吞吐量
记录进程组使用的资源数量:例如使用记录某个进程组使用的cpu时间
进程组控制:可以将进程组挂起和恢复
ls /sys/fs/cgroup/ -l 查看cgroups可控制的资源:
blkio:对块设备的IO进行限制
cpu:限制CPU时间片的分配,与cpuacct挂在同一目录
cpuacct:生成cgroup中的任务占用cpu资源的报告,与cpu挂载同一目录
cpuset:给cgroup中的任务分配独立的cpu(多核处理器)和内存节点
devices:允许或者拒绝cgroup中的任务访问设备
freezer:暂停/恢复cgroup中的任务
hugetlb:限制使用的内存业数量
memory:对cgroup中任务的可用内存进行限制,并自动生成资源占用报告
net_cls:使用等级标识符(classid)标记网络数据包,这让Linux流量控制程序(tc)可以识别来自特定从cgroup任务的数据包,并进行网络限制
net_prio:允许基于cgroup设置网络流量的优先级
perf_event:允许使用perf工具来监控cgroup
pids:限制任务数量
容器实际资源限制位置:
/sys/fs/cgroup/<资源名>/docker/<容器ID>