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 等资源限制可保障容器稳定运行,数据卷与容器互联则解决数据持久化、容器通信问题,夯实容器运维基础。

相关推荐
泽君学长2 小时前
CentOS 7 安装 Docker 完整教程
linux·docker·centos
记得记得就1512 小时前
Docker核心功能全解析:网络、资源控制、数据卷
网络·docker·容器
wheeldown2 小时前
【Linux网络编程】网络基础之MAC地址与IP地址的区别
linux·运维·网络·macos
2501_941982052 小时前
外部群自动化中的“静默心跳”存活检测
运维·自动化
Mr-Wanter2 小时前
搭建局域网时间同步服务器
java·运维·服务器
有谁看见我的剑了?2 小时前
ESXI 虚拟机文件组成学习
运维·学习·云计算
代码游侠2 小时前
应用——UDP 网络编程
linux·运维·开发语言·学习·算法
木童6622 小时前
Docker 容器操作(资源限制、数据卷容器、端口映射、容器互联)
运维·docker·容器
irisart2 小时前
第二章【NGINX 开源功能】—— 七层反向代理(下)
运维·nginx