Docker 容器核心配置实战:资源管控、数据卷与容器互联

文章目录


前言

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
bash 复制代码
docker run -itd --name c1 --cpu-quota 50000 centos: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。

示例:设置两个容器的占比

bash 复制代码
docker run -itd --name c1 --cpu-shares 512 centos:7
docker run -itd --name c2 --cpu-shares 1024 centos:7
## 在两个容器里都执行stress压测操作,最后通过  查看容器的cpu占用量
docker cp /etc/yum.repos.d/CentOS.repo 
yum clean all
yum makecache
docker exec -it c1 /bin/bash
yum install -y epel-release
yum install -y stress
stress -c 4

docker stats

3.3、容器进程绑定到指定cpu

用途:把容器进程绑定到宿主机的指定 CPU 核上(硬亲和性)。

示例:将容器绑定到第 1 和第 3 个核

bash 复制代码
docker run -itd --name c1 --cpuset-cpus "1,3" centos:7 /bin/bash
##在容器中输入以下命令,查看亲核编号
ps ef | grep /bin/bash | grep -v grep
taskset -pc 1

3.4、压力测试-cpu

bash 复制代码
# 压测工具
yum install -y epel-release
yum install -y stress
stress -c 4 #产生四个进程,每个进程都反复不停的计算随机数的平方根
# 找到容器对应的 cgroup 路径(容器ID替换)
cd /sys/fs/cgroup/cpu/docker/<container-id>/
cat cpu.cfs_period_us
cat cpu.cfs_quota_us
echo 50000 > 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、设置内存限制

bash 复制代码
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

bash 复制代码
#创建并进入容器(centos)
docker run -it --name c3 --device-write-bps /dev/sda:1MB centos:7 /bin/bash
# dd验证写入速度
dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct

dd核心作用从 /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。
bash 复制代码
docker run -v /var/www:/data1 --name c1 -itd centos:7 /bin/bash
# 宿主机写入echo "hh" > b.txt
echo "hh" > b.txt
docker exec -it c1 /bin/bash
cat /data1/b.txt


2、数据卷容器

2.1、概述

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

2.2、数据卷容器的使用

首先,创建一个数据卷容器 web2 ,并挂载多个数据卷

  • --name web2 : 给容器命名为 web2 。
  • -v /data1 -v /data2 : 在容器内部挂载了两个数据卷 /data1 和 /data2 。这些数据卷不依赖于宿主机,而是仅仅存在于容器内。
bash 复制代码
# 创建数据卷容器,添加数据卷
 docker run -v /data1 -v /data2 -itd --name c1 centos:7 /bin/bash
# 在数据卷容器写入数据
echo "this is c1" > c1.txt
echo "this is c2" > c2.txt
docker cp c1.txt c1:/data1/abc.txt
docker cp c2.txt c1:/data2/ABC.txt
# 使用--volumes-from 共享数据卷
docker run -itd --name c2 --volumes-from c1 centos:7 /bin/bash
# 在新容器查看数据
docker exec -it c2 /bin/bash
cat /data1/abc.txt
cat /data2/ABC.txt

2.3、小结

数据卷 (Data Volumes) 是容器中的特殊目录,用于持久化存储数据。它可以通过宿主机的目录进行挂载,实现容器与宿主机之间的数据共享。

数据卷容器 (Data Volumes Containers) 允许容器之间共享数据卷,避免每个容器都需要挂载宿主机目录。使用 --volumes-from 可以让多个容器共享同一数据卷。

3、端口映射

3.1、概述

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

3.2、随机端口映射

bash 复制代码
docker run -itd --name c4 -P nginx:latest 
docker ps -a

3.3、指定端口映射

bash 复制代码
docker run -itd --name c5 -p 43000:80 nginx:latest 
docker ps -a


三、容器互联

1、概述

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

2、容器互联的使用

--link web1:web1 : 通过 --link 选项连接 web1 容器,将 web1 容器暴露给 web2 容器,并在 web2 中将 web1 显示为别名 web1 。这样 web2 容器就可以通过 web1 访问源容器的信息。

bash 复制代码
# 1创建运行源容器web1
docker run -itd -P --name web1 centos:7 /bin/bash
# 2创建运行接收容器web2
docker run -itd --name web --link web1:web1 centos:7 /bin/bash
# 3web2测试连接
docker exec -it web /bin/bash
ping web1

3、小结

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

总结

本文系统讲解 Docker 三大核心实操内容,掌握 CPU 等资源限制可保障容器稳定运行,数据卷与容器互联则解决数据持久化、容器通信问题,夯实容器运维基础。

相关推荐
AOwhisky35 分钟前
Kubernetes 学习笔记:集群管理、命名空间与 Pod 基础
linux·运维·笔记·学习·云原生·kubernetes
小龙在慢慢变强..1 小时前
目录结构(FHS 标准)
linux·运维·服务器
刘延林.1 小时前
win11系统下通过 WSL2 安装Ubuntu 24.04 使用RTX 5080 GPU
linux·运维·ubuntu
星恒讯工业路由器2 小时前
星恒讯工业生产自动化解决方案
运维·物联网·自动化·智能路由器·信息与通信
a8a3022 小时前
Laravel9.x新特性全解析
运维·spring boot·nginx
beyond阿亮2 小时前
IEC104 Client Simulator - IEC104 主站/客户端模拟器 仿真器免费使用教程
运维·服务器·网络
郑寿昌2 小时前
GPU显存HPA:K8s智能扩缩实战
云原生·容器·kubernetes
Agent产品评测局3 小时前
生产排期与MES/ERP系统打通,实操方法详解:2026企业级智能体与超自动化集成实战指南
运维·人工智能·ai·chatgpt·自动化
C Y D3 小时前
只启动wsl
docker
CodeOfCC3 小时前
Linux 嵌入式arm64安装openclaw
linux·运维·服务器