Docker容器化技术(二)
·
目录
1.1设置 CPU 使用率上限( --cpu-period / --cpu-quota )
2.1.--memory 与 --memory-swap 规则
二.数据卷容器 (Data Volumes Containers)
前言:
今天主要是讲解一下关于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.磁盘 IO(blkio / 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、内存资源管理,数据卷,端口映射,以及容器互联等知识点,其中包含基础命令、实验操作以及相关原理,希望对读者们有所帮助!
更多推荐
所有评论(0)