🚀 04-Docker资源配额及私有镜像仓库
一、Docker 资源配额(Cgroup 资源限制)
Docker 基于 Linux Cgroup 机制实现容器资源管控,可限制 CPU、内存、磁盘 IO 三类核心资源,避免单容器占用过多宿主机资源。
1. CPU 资源控制
1.1 CPU 份额权重(--cpu-shares /-c)
-
作用:设置 CPU 相对加权值,默认所有容器份额为
1024,仅在多个容器争抢同一 CPU 核心时生效。 -
特点:不是固定分配多少 GHz CPU,而是相对优先级。CPU 空闲时,低权重容器也能占用全部 CPU 资源。
示例:创建 512 权重的容器
# 查看参数帮助
docker run --help | grep cpu-shares
# 创建指定CPU份额的容器
docker run -it --cpu-shares 512 centos /bin/bash
# 容器内查看生效的配置
cat /sys/fs/cgroup/cpu/cpu.shares
# 输出:512
权重规则说明:
-
容器 A(1024)、容器 B(512)争抢同核心 CPU 时,A 获得的 CPU 时间片约为 B 的 2 倍。
-
若只有一个容器运行,即使权重很低,也会独占全部 CPU 资源。
1.2 CPU 核心绑定(--cpuset-cpus)
-
作用:强制容器只能运行在指定的 CPU 核心上,适合 NUMA 架构服务器做性能优化。
-
配套参数
--cpuset-mems可绑定内存节点,仅多内存节点服务器有明显效果。
示例:容器只能使用 0 号和 1 号 CPU 核心
docker run -itd --name test-cpu --cpuset-cpus 0,1 centos /bin/bash
扩展:服务器三大架构
SMP(对称多处理器):普通双路 x86 服务器,多 CPU 共享内存
NUMA(非一致存储访问):IBM 小型机等,每个 CPU 有独立内存节点
MPP(海量并行处理):大型机,多节点分布式并行计算
1.3 CPU 配额混合验证(stress 压测)
通过压力测试工具 stress 跑满 CPU,验证权重和核心绑定是否生效。
(1)安装 stress 工具
yum install -y epel-release
yum install stress -y
stress 核心参数:
-
-c n:生成 n 个进程,持续计算随机数平方根,占满 CPU -
-i n:生成 n 个进程,调用 sync 刷盘,测试磁盘 IO -
-m n:生成 n 个进程,持续申请 / 释放内存,测试内存 -
-t 时间:运行指定时长后自动停止
(2)实验:验证 CPU 份额 + 核心绑定效果
实验目标:两个容器都绑定 CPU0、CPU1,权重分别为 512 和 1024,验证 CPU 占用比例。
- 启动两个测试容器
# 容器docker10:绑定0、1核心,权重512
docker run -itd --name docker10 --cpuset-cpus 0,1 --cpu-shares 512 centos /bin/bash
# 容器docker20:绑定0、1核心,权重1024
docker run -itd --name docker20 --cpuset-cpus 0,1 --cpu-shares 1024 centos /bin/bash
- 两个容器内分别安装 stress 并跑满 CPU
# 进入docker10
docker exec -it docker10 /bin/bash
yum install -y epel-release && yum install stress -y
# 启动2个进程,跑10分钟
stress -c 2 -v -t 10m
# 进入docker20,执行相同操作
docker exec -it docker20 /bin/bash
yum install -y epel-release && yum install stress -y
stress -c 2 -v -t 10m
- 宿主机执行
top按1查看各核心占用
-
预期 1:仅 CPU0、CPU1 被占满,其他核心空闲 → 核心绑定生效
-
预期 2:docker20 的 CPU 占用约为 docker10 的 2 倍 → 权重限制生效
2. 内存资源控制(-m /--memory)
- 作用:限制容器最大可使用内存,超出可能触发 OOM(内存溢出)被系统杀掉。
示例 1:限制容器最大内存 128M
docker run -it -m 128m centos /bin/bash
# 容器内验证限制
cat /sys/fs/cgroup/memory/memory.limit_in_bytes
# 输出:134217728(对应128MB)
示例 2:同时限制 CPU 核心 + 内存
docker run -it --cpuset-cpus 0,1 -m 128m centos
3. 磁盘 IO 资源控制
-
作用:限制容器对磁盘的读写速度,防止单容器吃光磁盘 IO 影响其他服务。
-
核心参数:
-
--device-read-bps:限制磁盘读速度,单位 kb/mb/gb -
--device-write-bps:限制磁盘写速度,单位 kb/mb/gb
-
示例:限制容器对 /dev/sda 磁盘写入速度最高 2MB/s
# 启动容器,挂载磁盘设备并限制写速度
docker run -it -v /var/www/html/:/var/www/html \
--device /dev/sda:/dev/sda \
--device-write-bps /dev/sda:2mb centos /bin/bash
# 容器内用dd命令测试写速度
time dd if=/dev/sda of=/var/www/html/test.out bs=2M count=50 oflag=direct,nonblock
dd 参数说明:
direct跳过缓存直接写盘,nonblock非阻塞 IO,确保测速准确
预期结果:写入速度稳定在 2MB/s 左右,限制生效
4. 容器运行结束自动释放(--rm)
- 作用:容器执行完命令后自动删除,释放资源,适合一次性临时任务。
示例:容器执行 sleep 6 秒后自动删除
docker run -it --rm --name zhappy centos sleep 6
# 6秒后查看,容器已自动消失
docker ps -a | grep zhappy
二、Harbor 私有镜像仓库
1. Harbor 介绍
Harbor 是 VMware 开源的企业级 Docker 镜像仓库,相比官方公共仓库,更适合企业内网使用,核心能力:
-
RBAC 角色权限管理、LDAP 集成
-
镜像复制、漏洞扫描、日志审计
-
中文 Web 管理界面、镜像签名等
官网地址:https://github.com/goharbor/harbor
实验环境:
-
主机名:
harbor -
IP:
192.168.40.181 -
配置建议:4vCPU / 4G 内存 / 100G 硬盘
2. 自签发 HTTPS 证书
Harbor 默认推荐 HTTPS 访问,先生成自签证书。
# 设置主机名
hostnamectl set-hostname harbor && bash
# 创建证书目录
mkdir -p /data/ssl && cd /data/ssl
步骤 1:生成 CA 根证书
# 生成CA私钥
openssl genrsa -out ca.key 3072
# 生成CA根证书,有效期10年
openssl req -new -x509 -days 3650 -key ca.key -out ca.pem
# 按提示填写国家、省份、城市等信息即可
步骤 2:生成 Harbor 域名证书
# 生成harbor域名私钥
openssl genrsa -out harbor.key 3072
# 生成证书签发请求
openssl req -new -key harbor.key -out harbor.csr
# Common Name 必须填 harbor(和主机名、配置一致)
步骤 3:用 CA 签发 harbor 证书
openssl x509 -req -in harbor.csr -CA ca.pem -CAkey ca.key \
-CAcreateserial -out harbor.pem -days 3650
3. 宿主机 Docker 环境安装
和常规 Docker 安装步骤一致,简要流程:
-
关闭 firewalld、iptables、SELinux
-
配置时间同步、安装基础依赖包
-
安装 docker-ce、启动并设置开机自启
-
开启内核桥接转发参数
-
配置镜像加速器并重启 Docker
详细安装命令可参考 Docker 入门文档,此处不再重复。
4. 安装 Harbor
步骤 1:准备安装包
-
上传
harbor-offline-installer-v2.3.0-rc3.tgz离线安装包 -
上传
docker-compose二进制文件
# 创建安装目录
mkdir -p /data/install && cd /data/install
# 解压安装包
tar zxvf harbor-offline-installer-v2.3.0-rc3.tgz
cd harbor
步骤 2:安装 docker-compose
# 将二进制文件移动到系统路径并授权
mv docker-compose-Linux-x86_64 /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose
docker-compose 是 Docker 官方容器编排工具,可批量管理多个关联容器,Harbor 依赖它启动多组件。
步骤 3:修改 Harbor 配置文件
# 复制配置模板
cp harbor.yml.tmpl harbor.yml
vim harbor.yml
核心修改项:
# 主机名,和证书域名一致
hostname: harbor
# HTTPS证书路径
certificate: /data/ssl/harbor.pem
private_key: /data/ssl/harbor.key
默认管理员账号:
admin,默认密码:Harbor12345
步骤 4:加载镜像并执行安装
# 加载harbor离线镜像包
docker load -i docker-harbor-2-3-0.tar.gz
# 执行安装脚本
./install.sh
出现 Harbor has been installed and started successfully. 即安装成功。
Harbor 启停命令
cd /data/install/harbor
# 停止
docker-compose stop
# 启动
docker-compose start
5. Web 界面使用说明
-
本地电脑配置 hosts 解析:
192.168.40.181 harbor -
浏览器访问
https://harbor,接受自签证书风险 -
使用
admin / Harbor12345登录
基础操作:
-
默认公共项目
library,存放基础镜像 -
「新建项目」→ 输入项目名 → 勾选「公开」→ 确定,即可创建可公开拉取的镜像仓库
6. 客户端上传镜像到 Harbor
步骤 1:客户端 Docker 配置信任 Harbor
vim /etc/docker/daemon.json
添加 insecure-registries 配置:
{
"registry-mirrors": ["https://rsbud4vc.mirror.aliyuncs.com"],
"insecure-registries": ["192.168.40.181","harbor"]
}
重启 Docker 生效:
systemctl daemon-reload && systemctl restart docker
步骤 2:登录 Harbor
docker login 192.168.40.181
# 输入账号 admin 密码 Harbor12345
# 出现 Login Succeeded 即登录成功
步骤 3:镜像打标签并上传
# 1. 准备本地镜像(例:tomcat)
docker load -i tomcat.tar.gz
# 2. 给镜像打标签,格式:仓库地址/项目名/镜像名:版本
docker tag tomcat:latest 192.168.40.181/test/tomcat:v1
# 3. 推送到Harbor
docker push 192.168.40.181/test/tomcat:v1
推送完成后,可在 Web 界面 test 项目中看到镜像。
7. 从 Harbor 下载镜像
# 删除本地镜像
docker rmi -f 192.168.40.181/test/tomcat:v1
# 从Harbor拉取
docker pull 192.168.40.181/test/tomcat:v1