文章目录
- 前言
- 一、cpu资源限制
- 1、概述
- 2、cgroups的四大功能
- 3、限制cpu的使用
- 3.1、设置cpu使用率上限
- 3.2、设置cpu占比
- 3.3、容器进程绑定到指定cpu
- 3.4、压力测试-cpu
- 3.5、小结
- 4、内存使用限制
- 4.1、介绍
- 4.2、设置内存限制
- 4.3、建议
- 5、磁盘io控制
- 5.1、概述
- 5.2、常用docker参数(blkio)
- 5.3、限制io
- 二、数据卷容器
- 1、数据卷
- 1.1、数据卷介绍
- 1.2、创建与挂载数据卷
- 2、数据卷容器
- 2.1、概述
- 2.2、数据卷容器的使用
- 2.3、小结
- 3、端口映射
- 3.1、概述
- 3.2、随机端口映射
- 3.3、指定端口映射
- 三、容器互联
- 1、概述
- 2、容器互联的使用
- 3、小结
- 总结
前言
Docker 容器资源调度与网络配置是容器化运维核心能力,本文围绕 CPU、内存、磁盘 IO 资源限制展开实操讲解,同时介绍数据卷容器与容器互联技术,助力实现容器高效管控。
一、cpu资源限制
1、概述
- cgroups (Control Groups)是 Linux 内核提供的资源控制机制。对容器非常重要,可控制:资源限制、优先级分配、资源统计、任务控制(挂起/恢复/终止)。
- Docker 通过 cgroups 来实现 CPU、内存、IO 等限制与度量
2、cgroups的四大功能
资源限制:限制任务使用的总资源量
优先级分配:如通过 cpu 时间片和 IO 带宽分配优先级
资源统计:统计 cpu 时长、内存用量等。
任务控制:对 cgroup 中的进程执行挂起/恢复等操作。
3、限制cpu的使用
3.1、设置cpu使用率上限
原理:
Linux 使用 CFS(Completely Fair Scheduler)。通过两个参数控制:
cpu.cfs_period_us (周期,微秒)和 cpu.cfs_quota_us (配额,微秒)。
- quota / period = 可用 CPU 核心数的 小数 表示(相对于 1 个 CPU)。
- 默认 period = 100000 (100 ms)。 quota = -1 表示不限制。
示例:限制容器为50%的一个cpu
docker run -itd --name c1 --cpu-quota50000centos:7 /bin/bash docker run -itd --name c2 --cpus="0.5"centos:7 /bin/bash因为有四个逻辑核,所以0.5个cpu,每个核数是0.5 / 4 = 0.125。即 12.5% 的整机 CPU能力
注意:最小值/范围: --cpu-period 有效范围通常 1000 ~ 1000000(单位 us)。 --cpu-quota 必须 >= 1000(1 ms)或者 -1(不限制)。
3.2、设置cpu占比
原理:
–cpu-shares 指定相对权重(默认 1024),仅在 CPU 争用时生效(不是硬限制)。
举例:两个容器 c1 、 c2 , --cpu-shares 512 与 --cpu-shares 1024 ,在争用情况下 CPU 分配比约为 1:2。
示例:设置两个容器的占比
docker run -itd --name c1 --cpu-shares512centos:7 docker run -itd --name c2 --cpu-shares1024centos:7## 在两个容器里都执行stress压测操作,最后通过 查看容器的cpu占用量dockercp/etc/yum.repos.d/CentOS.repo yum clean all yum makecache dockerexec-it c1 /bin/bash yuminstall-y epel-release yuminstall-y stress stress -c4docker stats
3.3、容器进程绑定到指定cpu
用途:把容器进程绑定到宿主机的指定 CPU 核上(硬亲和性)。
示例:将容器绑定到第 1 和第 3 个核
docker run -itd --name c1 --cpuset-cpus"1,3"centos:7 /bin/bash##在容器中输入以下命令,查看亲核编号psef|grep/bin/bash|grep-vgreptaskset -pc13.4、压力测试-cpu
# 压测工具yuminstall-y epel-release yuminstall-y stress stress -c4#产生四个进程,每个进程都反复不停的计算随机数的平方根# 找到容器对应的 cgroup 路径(容器ID替换)cd/sys/fs/cgroup/cpu/docker/<container-id>/catcpu.cfs_period_uscatcpu.cfs_quota_usecho50000>cpu.cfs_quota_us# 设置配额(临时生效)3.5、小结
● --cpu-shares 是权重,不是限额。
● --cpu-quota / --cpu-period 是硬限制(quota = -1 表示无限制)。
● 使用 --cpuset-cpus 能提高性能稳定性(避免与其他进程抢核)。
● 在多核宿主机上理解 quota/period 的含义(单位是 “相对于 1 个 CPU 的份额”)。
4、内存使用限制
4.1、介绍
基础选项
- -m, --memory :限制容器可用的物理内存(例如 -m 512m )。
- –memory-swap :限制容器可用的物理内存 + swap 总量(必须与 -m 一起使用以明确 swap 上限)。
–memory 与 --memory-swap 规则
示例: -m 300m --memory-swap=1g - 含义:容器可用物理内存 = 300 MB;物理 + swap 总共 = 1 GB → swap 可用 = 700 MB(1G - 300M)。
- 默认行为:若不设置 --memory-swap ,通常容器可使用的 swap 为 -m 值的两倍(行为可能随Docker 版本/配置变化)。
- 若 --memory-swap = -1 :swap 不受限制(宿主机可用多少 swap 就用多少)。
- 若 --memory-swap = -m :容器不能使用 swap(物理内存用尽会触发 OOM)。
4.2、设置内存限制
docker run -itd --name c2 -m 512m centos:7 /bin/bash# 或者设置swap总额(生产环境不常见)docker run -itd --name c2 -m 300m --memory-swap=1g centos:7
注意:
OOM 行为:如果容器超过允许内存且没有 swap 或无更多内存可用,会被内核 OOM killer 杀掉。 可查看容器日志与 dmesg 来确认 OOM 事件。
4.3、建议
● 为生产服务设置合理内存限制,避免单容器把宿主机内存耗尽。
● 对于内存敏感的应用,建议同时设置 -m 与 --memory-swap ,并配合健康检查/重启策略。
● 在 cgroup v2 环境下内存控制文件名/行为可能与 v1 略有不同(检查 /sys/fs/cgroup 结构)。
5、磁盘io控制
5.1、概述
Docker 提供对块设备读写带宽与 IOPS 的限制选项(基于 cgroups 的 blkio 控制器)。
注意:在 cgroup v2 中,blkio 功能被 io 控制器取代,语义与文件名有所不同(如果你运行的是较新内核/系统,请参考对应 cgroup 版本文档)。
5.2、常用docker参数(blkio)
–device-read-bps /dev/sda:1M :限制设备上读速率为 1 MB/s。
–device-write-bps /dev/sda:1M :限制写速率为 1 MB/s。
–device-read-iops /dev/sda:100 :限制读 IOPS(次数)。
–device-write-iops /dev/sda:100 :限制写 IOPS(次数)。
5.3、限制io
docker 20.10.18版本支持,最新版本不支持,缺少sda分区.(ce和ce-cli都要对应版本)
yum install -y docker-ce-20.10.18 docker-ce-cli-20.10.18 containerd.io
#创建并进入容器(centos)docker run -it --name c3 --device-write-bps /dev/sda:1MB centos:7 /bin/bash# dd验证写入速度ddif=/dev/zeroof=test.outbs=1Mcount=10oflag=directdd核心作用从 /dev/zero 读取纯0数据,以「1MB / 块、共 10 块」的规格,直接写入 当前目录的 test.out 文件,最终生成 10MB 大小的纯零文件,用于测试磁盘直接写入速度。
二、数据卷容器
1、数据卷
1.1、数据卷介绍
数据卷是 Docker 中一种专门为容器提供持久化存储的机制。它是容器内部的特殊目录,可以与宿主机或其他容器共享数据。通过使用数据卷,容器可以在其生命周期内访问和修改数据,而不会影响镜像本身。这样一来,数据卷能够保持数据持久性,即使容器被删除或重建,数据依然能够保留。
1.2、创建与挂载数据卷
使用 docker run 命令启动一个容器时,可以通过 -v 或 --mount 选项将宿主机的目录挂载到容器中的数据卷。下面是一个简单的例子:
- -v /var/www:/data1 : 将宿主机上的 /var/www 目录挂载到容器中的 /data1 目录。这样容器内 /data1 的修改会同步到宿主机上的 /var/www 。
- –name web1 : 给容器指定一个名称 c1。
- -it centos:7 /bin/bash : 使用 centos:7 镜像启动容器并进入交互式 shell。
docker run -v /var/www:/data1 --name c1 -itd centos:7 /bin/bash# 宿主机写入echo "hh" > b.txtecho"hh">b.txt dockerexec-it c1 /bin/bashcat/data1/b.txt2、数据卷容器
2.1、概述
数据卷容器是一种专门用于共享数据的容器,它不是用于运行应用程序的容器,而是仅仅提供一个数据卷,供其他容器挂载并使用。这种方式常用于多个容器共享数据,避免数据丢失或重复管理。
2.2、数据卷容器的使用
首先,创建一个数据卷容器 web2 ,并挂载多个数据卷
- –name web2 : 给容器命名为 web2 。
- -v /data1 -v /data2 : 在容器内部挂载了两个数据卷 /data1 和 /data2 。这些数据卷不依赖于宿主机,而是仅仅存在于容器内。
# 创建数据卷容器,添加数据卷docker run -v /data1 -v /data2 -itd --name c1 centos:7 /bin/bash# 在数据卷容器写入数据echo"this is c1">c1.txtecho"this is c2">c2.txt dockercpc1.txt c1:/data1/abc.txt dockercpc2.txt c1:/data2/ABC.txt# 使用--volumes-from 共享数据卷docker run -itd --name c2 --volumes-from c1 centos:7 /bin/bash# 在新容器查看数据dockerexec-it c2 /bin/bashcat/data1/abc.txtcat/data2/ABC.txt2.3、小结
数据卷 (Data Volumes) 是容器中的特殊目录,用于持久化存储数据。它可以通过宿主机的目录进行挂载,实现容器与宿主机之间的数据共享。
数据卷容器 (Data Volumes Containers) 允许容器之间共享数据卷,避免每个容器都需要挂载宿主机目录。使用 --volumes-from 可以让多个容器共享同一数据卷。
3、端口映射
3.1、概述
在 Docker 中,容器内部运行的服务默认是不能被外部网络访问的。如果需要让外部网络能够访问容器中的服务,就需要使用端口映射机制。端口映射将宿主机的端口映射到容器内的端口,从而使得外部网络能够通过访问宿主机的端口,进而访问容器内的服务。
3.2、随机端口映射
docker run -itd --name c4 -P nginx:latest dockerps-a3.3、指定端口映射
docker run -itd --name c5 -p43000:80 nginx:latest dockerps-a三、容器互联
1、概述
容器互联是一种让容器之间能够通过网络相互通信的机制。通过在容器间建立网络通信隧道,源容器和接收容器可以互相看到对方的指定信息。Docker 提供了 --link 选项来实现容器互联,在一个容器中可以通过另一个容器的名称来访问它。
2、容器互联的使用
–link web1:web1 : 通过 --link 选项连接 web1 容器,将 web1 容器暴露给 web2 容器,并在 web2 中将 web1 显示为别名 web1 。这样 web2 容器就可以通过 web1 访问源容器的信息。
# 1创建运行源容器web1docker run -itd -P --name web1 centos:7 /bin/bash# 2创建运行接收容器web2docker run -itd --name web --link web1:web1 centos:7 /bin/bash# 3web2测试连接dockerexec-it web /bin/bashpingweb13、小结
- 源容器:通过 docker run 启动,并通过 --name 指定一个唯一名称,例如 web1
- 接收容器:通过 docker run 启动,并通过 --link 选项将其与源容器 web1 连接。 --link 会将源容器暴露为别名,接收容器可以通过该别名与源容器进行通信。
- 容器间通信:接收容器可以通过源容器的名称进行通信,如在 web2 中通过 ping web1 测试与web1 的连通性。
这种容器互联的方式适用于简单的容器间网络通信,但在较复杂的场景中,建议使用 Docker 网络(如桥接网络或自定义网络)来管理容器间的通信。
总结
本文系统讲解 Docker 三大核心实操内容,掌握 CPU 等资源限制可保障容器稳定运行,数据卷与容器互联则解决数据持久化、容器通信问题,夯实容器运维基础。