目录

前言:

一.资源限制

1.cpu资源控制

1.1设置 CPU 使用率上限( --cpu-period / --cpu-quota )

1.2.设置 CPU 占用比(权重 — --cpu-shares )

1.3.绑定指定 CPU( --cpuset-cpus )

1.4.压力测试与验证示例(CPU)

1.5.注意事项(CPU)

2.内存使用限制

2.1.--memory 与 --memory-swap 规则

2.2.示例:

2.3.验证与观察

2.4.注意

3.磁盘 IO(blkio / io)控制

3.1.常用 Docker 参数(blkio)

3.2.验证(用dd测试写速)

3.3.注意

4.清理 Docker 占用的磁盘空间(补充)

5.总结

二.数据卷容器 (Data Volumes Containers)

1.数据卷

1.1.创建与挂载数据卷

1.2.在数据卷中写入数据

1.3.查看宿主机的数据

2.数据容器

2.1.创建数据卷容器

2.2.在数据卷容器中写入数据

2.3.使用 --volumes-from 共享数据卷

2.4.在新容器中查看数据

3.总结

三.端口映射

1.随机端口映射

2.指定端口映射

3.总结

四.容器互联(使用centos镜像)

1.创建并运行源容器 web1

2.创建并运行接收容器 web2

3.在接收容器 web2 中测试连接

4.总结

总结

前言:

         今天主要是讲解一下关于docker容器的资源限制(包含cpu和内存),数据卷容器,端口映射,以及容器互联(使用centos镜像)。

一.资源限制

1.cpu资源控制

概述( cgroups
cgroups Control Groups )是 Linux 内核提供的资源控制机制。对容器非常重要,可控制:资
源限制、优先级分配、资源统计、任务控制(挂起 / 恢复 / 终止)。
Docker 通过 cgroups 来实现 CPU 、内存、 IO 等限制与度量。
cgroups 4 大功能(简要)
资源限制:限制任务使用的总资源量。
优先级分配:如通过 cpu 时间片和 IO 带宽分配优先级。
资源统计:统计 cpu 时长、内存用量等。
任务控制:对 cgroup 中的进程执行挂起 / 恢复等操作。

1.1设置 CPU 使用率上限( --cpu-period / --cpu-quota

原理 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
50000 / 100000 = 0.5 相当于 0.5 CPU (即 50% 的单核)
注意: 如果宿主机有 4 个逻辑核,那么 0.5 CPU 0.5 / 4 = 0.125 (即 12.5% 的整机 CPU
能力)
也可以:
-- cpus=0.5 -- cpu - quota / -- cpu - period 的友好封装(要求较新版本 Docker

1.2.设置 CPU 占用比(权重--cpu-shares

原理 -- cpu - shares 指定相对权重(默认 1024 ),仅在 CPU 争用时生效(不是硬限制)
两个容器 c1 c2 -- cpu - shares 512 -- cpu - shares 1024 ,在争用情况下 CPU
分配比约为 1:2
运行压力程序( stress - c N )后用 docker stats 观察 CPU % 倾向于 1:2 (随系统负载
和核心数而变化)

1.3.绑定指定 CPU--cpuset-cpus

用途 :把容器进程绑定到宿主机的指定 CPU 核上(硬亲和性)。
将容器绑定到第 1 和第 3 个核:
在宿主机运行 top htop (按 1 )查看各核利用率,或进入容器运行 taskset - p <pid>

1.4.压力测试与验证示例(CPU

在容器内创建一个繁忙循环脚本:
在容器内运行 ./cpu.sh ,在宿主机观察 top docker stats
分别进入容器,进行压力测试
修改cgroup手动测试:

1.5.注意事项(CPU

-- cpu - shares 是权重,不是限额
-- cpu - quota / -- cpu - period 是硬限制( quota = -1 表示无限制)
使用 -- cpuset - cpus 能提高性能稳定性(避免与其他进程抢核)
在多核宿主机上理解 quota/period 的含义(单位是 相对于 1 CPU 的份额

2.内存使用限制

- m, -- memory :限制容器可用的物理内存(例如 - m 512m )。
-- memory - swap :限制容器可用的物理内存 + swap 总量(必须与 - m 一起使用以明确 swap
限)。

2.1.--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

2.2.示例:

2.3.验证与观察

使用 docker stats 观察 MEM USAGE / LIMIT 
在宿主机查看 cgroup

2.4.注意

为生产服务设置合理内存限制,避免单容器把宿主机内存耗尽
对于内存敏感的应用,建议同时设置 - m -- memory - swap ,并配合健康检查 / 重启策略
cgroup v2 环境下内存控制文件名 / 行为可能与 v1 略有不同(检查 /sys/fs/cgroup 结构)

3.磁盘 IOblkio / io)控制

Docker 提供对块设备读写带宽与 IOPS 的限制选项(基于 cgroups blkio 控制器)。
注意:在 cgroup v2 中, blkio 功能被 io 控制器取代,语义与文件名有所不同(如果你运行的是
较新内核 / 系统,请参考对应 cgroup 版本文档)。

3.1.常用 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 (次数)
如:

3.2.验证(用dd测试写速)

在容器内执行写入测试,使用 oflag=direct 跳过文件系统缓存:
输出示例说明: 10485760 bytes (10 MB) copied, 10.0025 s, 1.0 MB/s 写速被限为约 1
MB/s

3.3.注意

限制需要指定 具体块设备路径 (如 /dev/sda )。错误的设备路径不会生效。
在虚拟化环境或云盘(如 EBS 、云盘快照)上,底层 IO 性能由云提供商或 hypervisor 决定,容器
层设置可能受限。
cgroup v2 上,对 IO 的控制接口为 io.max 等,需要使用不同的工具 / 路径来配置验证。

4.清理 Docker 占用的磁盘空间(补充)

清理未使用的数据(可释放磁盘空间):
该命令会删除停止的容器、未使用的镜像、未使用的网络和构建缓存(要谨慎使用,会删除很
多资源)

5.总结

二.数据卷容器 (Data Volumes Containers)

1.数据卷

数据卷是 Docker 中一种专门为容器提供持久化存储的机制。它是容器内部的特殊目录,可以与宿主机或其他容器共享数据。通过使用数据卷,容器可以在其生命周期内访问和修改数据,而不会影响镜像本身。这样一来,数据卷能够保持数据持久性,即使容器被删除或重建,数据依然能够保留。

1.1.创建与挂载数据卷

使用 docker run 命令启动一个容器时,可以通过 - v -- mount 选项将宿主机的目录挂载到容器中的数据卷
如:
- v /var/www:/data1 : 将宿主机上的 /var/www 目录挂载到容器中的 /data1 目录。这样容器内
/data1 的修改会同步到宿主机上的 /var/www 
-- name web1 : 给容器指定一个名称 web1 
- it centos:7 /bin/bash : 使用 centos:7 镜像启动容器并进入交互式 shell

1.2.在数据卷中写入数据

进入容器后,可以在 /data1 目录下创建文件:
此时,容器中的 /data1/abc.txt 文件与宿主机中的 /var/www/abc.txt 文件是同步的。即使容器退
出,宿主机上的数据依然存在。

1.3.查看宿主机的数据

退出容器后,返回宿主机查看数据是否已成功同步:
你应该能看到容器中写入的数据内容: this is web1

2.数据容器

数据卷容器是一种专门用于共享数据的容器,它不是用于运行应用程序的容器,而是仅仅提供一个数据卷,供其他容器挂载并使用。这种方式常用于多个容器共享数据,避免数据丢失或重复管理。

2.1.创建数据卷容器

首先,创建一个数据卷容器 web2 ,并挂载多个数据卷:
-- name web2 : 给容器命名为 web2
- v /data1 - v /data2 : 在容器内部挂载了两个数据卷 /data1 /data2 。这些数据卷不依赖于
宿主机,而是仅仅存在于容器内。

2.2.在数据卷容器中写入数据

进入 web2 容器后,可以在 /data1 /data2 目录下写入数据:
现在, web2 容器内的 /data1/abc.txt /data2/ABC.txt 文件已经被创建

2.3.使用 --volumes-from 共享数据卷

接下来,创建一个新的容器 web3 ,并通过 -- volumes - from 选项将 web2 容器中的数据卷挂载到
web3 容器中:
-- volumes - from web2 : 这表示将容器 web2 中的所有数据卷挂载到新容器 web3

2.4.在新容器中查看数据

进入 web3 容器后,查看 web2 容器中的数据:
应有如下输出:
这表明 web3 容器成功挂载了 web2 容器中的数据卷,并能够访问其中的文件

3.总结

数据卷 (Data Volumes) 是容器中的特殊目录,用于持久化存储数据。它可以通过宿主机的目录进
行挂载,实现容器与宿主机之间的数据共享。
数据卷容器 (Data Volumes Containers) 允许容器之间共享数据卷,避免每个容器都需要挂载宿
主机目录。使用 -- volumes - from 可以让多个容器共享同一数据卷。

三.端口映射

Docker 中,容器内部运行的服务默认是不能被外部网络访问的。如果需要让外部网络能够访问容器中的服务,就需要使用端口映射机制。端口映射将宿主机的端口映射到容器内的端口,从而使得外部网络能够通过访问宿主机的端口,进而访问容器内的服务。

1.随机端口映射

如果不指定端口, Docker 会自动为容器的服务分配一个随机端口(通常从 32768 开始)。这种方式适用于无需指定端口号的场景。
- P : 自动将容器内部暴露的端口映射到宿主机上的随机端口。
nginx : 使用 nginx 镜像启动容器。
查看信息:
输出如下:
此时, test1 容器内部的端口 80 被映射到宿主机的端口 49170 。你可以通过浏览器访问:

2.指定端口映射

如果你希望容器内的服务映射到宿主机上的指定端口,可以使用 - p 选项手动指定端口映射。
- p 43000:80 : 将宿主机的端口 43000 映射到容器内的端口 80 。这意味着你可以通过访问宿主机
43000 端口来访问容器中的 Nginx 服务
查看信息:
输出如下:
此时, test2 容器内部的端口 80 被映射到宿主机的端口 43000 。你依然可以通过浏览器访问:

3.总结

随机端口映射 :使用 - P 选项, Docker 会自动为容器暴露的端口分配一个随机的宿主机端口,适
用于无需手动指定端口的情况。
指定端口映射 :使用 - p < 宿主机端口 >:< 容器端口 > 的格式,手动指定宿主机和容器之间的端口映射关系,适用于需要明确指定端口的场景。
注意:通过端口映射,容器内的服务可以轻松暴露给外部网络,供外界访问。

四.容器互联(使用centos镜像)

容器互联是一种让容器之间能够通过网络相互通信的机制。通过在容器间建立网络通信隧道,源容器和接收容器可以互相看到对方的指定信息。Docker 提供了 -- link 选项来实现容器互联,在一个容器中可以通过另一个容器的名称来访问它。

1.创建并运行源容器 web1

首先,创建并运行源容器 web1 ,它将作为通信的源容器。使用 CentOS 镜像启动容器,并让容器在后台运行:
- itd : 启动容器并使其在后台运行。
- P : 随机映射容器的端口到宿主机。
-- name web1 : 给容器指定一个名称 web1
centos:7 : 使用 CentOS 7 镜像启动容器。
/bin/bash : 启动后进入容器的 bash shell

2.创建并运行接收容器 web2

接下来,创建并运行接收容器 web2 ,并使用 -- link 选项来连接容器 web1 ,从而实现容器间的通信。
-- link web1:web1 : 通过 -- link 选项连接 web1 容器,将 web1 容器暴露给 web2 容器,并在
web2 中将 web1 显示为别名 web1 。这样 web2 容器就可以通过 web1 访问源容器的信息。

3.在接收容器 web2 中测试连接

进入容器 web2 ,然后尝试 ping web1 容器,验证是否可以与 web1 容器通信:
docker exec - it web2 bash : 进入 web2 容器的 bash 环境。
ping web1 : 测试 web2 是否能与 web1 通信。
如果连接成功,说明容器互联配置正确。

4.总结

源容器 :通过 docker run 启动,并通过 -- name 指定一个唯一名称,例如 web1
接收容器 :通过 docker run 启动,并通过 -- link 选项将其与源容器 web1 连接。 -- link 会将
源容器暴露为别名,接收容器可以通过该别名与源容器进行通信。
容器间通信 :接收容器可以通过源容器的名称进行通信,如在 web2 中通过 ping web1 测试与
web1 的连通性。
注意:这种容器互联的方式适用于简单的容器间网络通信,但在较复杂的场景中,建议使用 Docker 网络(如桥接网络或自定义网络)来管理容器间的通信。

总结:

         今天主要是给读者们分享了关于docker容器的cpu、内存资源管理,数据卷,端口映射,以及容器互联等知识点,其中包含基础命令、实验操作以及相关原理,希望对读者们有所帮助!

更多推荐