什么是容器?大多数工程师不了解的操作系统层面真相

发布日期:2026-04-04 10:04:56   浏览量 :3
发布日期:2026-04-04 10:04:56  
3

2026西湖龙井茶官网DTC发售:茶农直供,政府溯源防伪到农户家 

“你一直在用那个词”

澄清操作系统层面的容器误解

在我们编写一行代码之前,必须驱散那些流行术语制造的迷雾。

容器究竟是什么

你已经听过上百遍的营销定义是:“容器是一个可执行的软件单元,其依赖项被打包在一起。” 这个说法并不错误,但它对你理解机器上实际发生的事情毫无帮助。

以下是操作系统层面的真相:容器是一个进程(或一组进程树),内核在运行它时限制了它所能看到的命名空间,并通过控制组(cgroup)对其可消耗的资源设置了上限。 这就是全部奥秘所在。没有虚拟机监视器(hypervisor),没有客户机内核,也没有虚拟化的硬件。只是一个被精心施加了一组约束条件的普通进程。
本文其余所有内容都是为了证明这一核心观点。

启动一个简单的 HTTPD 容器

我使用以下 podman 命令启动了一个资源受限的 HTTPD 容器。

podman run -d \
  --name my-limited-httpd \
  --replace \
  --memory=512m \        # 硬性内存上限
  --memory-swap=512m \   # 交换空间上限等于内存 = 不允许使用交换空间
  --cpus=1.5 \           # CPU 配额:相当于 1.5 个核心的 CPU 时间
  --cpu-shares=512 \     # 资源争用时的相对 CPU 权重
  --pids-limit=100 \     # 此容器中最多允许 100 个进程/线程
  --blkio-weight=500 \   # 相对块设备 I/O 权重
  -p 8081:80 \
  registry.access.redhat.com/ubi8/httpd-24

这会以指定的资源限制启动一个容器。你可以通过以下命令检查

krish-local:~ # pstree -pT
systemd(1)─┬─NetworkManager(944)
           ├─agetty(1011)
           ├─agetty(1012)
           ├─auditd(835)
           ├─chronyd(1007)
           # ConMon 是容器监控器。HTTPD 是我们运行的容器
           ├─conmon(13669)───httpd(13684)─┬─cat(13727) 
           │                              ├─cat(13728)
           │                              ├─cat(13729)
           │                              ├─cat(13730)
           │                              ├─httpd(13731)

免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。

关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
支持 反馈 订阅 数据
回到顶部