目录
1 容器常用指令
1.1 查看容器
1.2 创建容器
1.3 进入容器
1.4 容器的启动与停止
1.5 删除容器
1.6 容器与宿主机之间的文件拷贝
2 容器资源限制
2.1 内存限制
2.2 CPU限制
2.3 容器扩容
3 Namespace
4 CGroups
5 Docker核心组件之间关系
1 容器常用指令
1.1 查看容器
- 查看正在运行的容器:docker ps
- 查看所有容器(无论是否启动):docker ps -a
- 查看所有容器且只显示容器id:docker ps -aq
- 查看目标容器信息:docker inspect 容器名称(容器ID)
- 查看当前容器的资源消耗情况:docker stats 容器名(容器ID)
- 查看容器中的进程:docker top 容器名(容器ID)
- 容器的启动,可理解为虚拟机的开机
1.2 创建容器
- 在后台创建名为centos1的容器 ,不启动容器:docker run -d --name=centos1 centos:7
- 在后台创建名为centos2的容器 ,启动容器: docker run -id --name=centos2 centos:7
- 创建容器、启动容器并进入命令行,退出命令行则容器关闭:docker run -it --name=centos3 centos:7
- 注:指令最后面的“centos:7”表示依据镜像仓库中的 centos:7 镜像来创建容器,此外,创建容器时如果不命名,会生成随机的名字
创建容器时常用指令参数如下:
-i:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器)。
--name :为创建的容器命名。
-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
-ti:创建交互式容器,创建容器后自动进入容器,退出容器后容器自动关闭(可理解为关机)
-di:创建守护式容器,创建一个容器在后台运行,需要使用docker exec 进入容器,退出后容器不会关闭。
进入容器之后,初始化执行的命令:/bin/bash
1.3 进入容器
- docker exec -it 容器名称 (或者容器ID) /bin/bash
1.4 容器的启动与停止
- docker start 容器名称(容器ID)
- docker stop 容器名称(容器ID)
1.5 删除容器
- 删除某个容器:docker rm 容器名称(容器ID)
- 删除未在运行的容器(会有提示):docker container prune
- 强行删除所有容器:docker rm -f $(docker ps -aq)
1.6 容器与宿主机之间的文件拷贝
- 容器到宿主机:docker cp 容器名称:容器目录 需要拷贝的文件或目录(把文件从c1容器的“/”路径下的“a.txt文件”拷贝到宿主机的中的的“/root/”路径下)
docker cp c1:/a.txt /root/
- 宿主机到容器:docker cp 需要拷贝的文件或目录 容器名称:容器目录(把文件"b.txt" 从宿主机的“/root/”路径下拷贝到容器c1的“/root/” 路径下)
docker cp /root/b.txt c1:/root/
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共享(相对权重) |
创建完容器后,可输入指令:docker stats 容器id 来查看CPU和内存的情况。
2.1 内存限制
- 允许容器最多使用512M内存:docker run -id -m="512m" --name=centos5 centos:7
- 允许容器最多使用500M内存和100M的Swap(–memory-swap参数指的是:内存和swap分区大小的总和,现在内存500m,剩下允许交换给磁盘的内存就剩下100m了),并禁用OOM Killer(即便内存溢出也不会停止运行该容器)感觉这个功能一般不会用:
docker run -id --name centos6 --memory="500m" --memory-swap="600m" --oom-kill-disable centos:7
- 如果不限制容器的内存使用,则默认该容器可以使用宿主机上的所有资源
2.2 CPU限制
- 允许容器最多使用1.5个CPU:docker run -d --name nginx04 --cpus="1.5" nginx
- 允许容器最多使用0.5个CPU:docker run -d --name nginx05 --cpus=".5" nginx
2.3 容器扩容
- 如果容器已经创建,可修改部分容器配置(输入指令:docker update --help,里面有的才能修改)
- 更新容器的内存限制为256m:docker update -m="256" 容器id
3 Namespace
Linux内核从2.4.19版本开始引入了namespace概念,其目的是将特定的全局系统资源通过抽象方法使得namespace中的进程看起来拥有自己隔离的资源。Docker就是借助这个机制实现了容器资源隔离。
查看当前进程所属的 namespace 信息指令:ll /proc/$$/ns
Linux的Namespace机制提供了6种不同命名空间:
- IPC:隔离进程间通信
- MOUNT:隔离文件系统挂载点
- NET:隔离网络协议栈
- PID:隔离进程号,进程命名空间是一个父子结构,子空间对父空间可见
- USER:隔离用户
- UTS:隔离主机名和域名
4 CGroups
Docker利用namespace实现了容器之间资源隔离,但是namespace不能对容器资源进行限制,比如CPU、内存。如果某一个容器属于CPU密集型任务,那么会影响其他容器使用CPU,导致多个容器相互影响并且抢占资源。对多个容器的资源使用进行限制,可引入Control Groups(简称CGroups)。
CGroups:所有的任务就是运行在系统中的一个进程,而CGroups以某种标准将一组进程为目标进行资源分配和控制。例如CPU、内存、带宽等,并且可以动态配置。CGroups主要功能如下:
- 限制进程组使用的资源数量(Resourcelimitation):为进程组设定资源使用上限,例如内存
- 进程组优先级控制(Prioritization):可以为进程组分配特定CPU、磁盘IO吞吐量
- 记录进程组使用的资源数量(Accounting):例如使用记录某个进程组使用的CPU时间
- 进程组控制(Control):可以将进程组挂起和恢复
相关指令如下:
- 查看cgroups可控制的资源指令: ls /sys/fs/cgroup/ -l
- 容器实际资源限制位置(要保证容器在运行状态):/sys/fs/cgroup/<资源名>/docker/<容器ID>(docker update 指令实际上就是在修改其中文件的参数进行配置)
资源目录 | 描述 |
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 | 限制任务的数量 |
5 Docker核心组件之间关系
- DockerDaemon:Docker守护进程,负责与DockerClinet交互,并管理镜像、容器。
- Containerd:是一个简单的守护进程,向上给DockerDaemon提供接口,向下通过containerd-shim结合runC管理容器。
- runC:一个命令行工具,它根据OCI标准来创建和运行容器。