容器运行时的内部结构和最新趋势(2023)上

简介: 容器运行时的内部结构和最新趋势(2023)

容器运行时的内部结构和最新趋势(2023)

原文为 Akihiro Suda 在日本京都大学做的在线讲座,完整的 PPT 可 点击此处下载

本文内容分为以下三个部分:

  1. 1. 容器简介
  2. 2. 容器运行时的内部结构
  3. 3. 容器运行时的最新趋势

1. 容器简介

什么是容器?

容器是一组用于隔离文件系统、CPU 资源、内存资源、系统权限等的各种轻量级方法。容器在很多意义上类似于虚拟机,但它们比虚拟机更高效,而安全性则往往低于虚拟机。

有趣的是,“容器”目前还没有严格的定义。当虚拟机提供类似容器的接口时,例如,当它们实现 OCI(开放容器)规范 时,甚至虚拟机也可以被称为“容器”。这种“非容器”的容器将在后面的第三部分中讨论。

Docker

Docker 是最流行的容器引擎。Docker 本身支持 Linux 容器和 Windows 容器,但 Windows 容器不在本次讨论的范围之内。

启动 Docker 容器的典型命令行如下:

docker run -p 8080:80 -v .:/usr/share/nginx/html nginx:1.25

执行该命令后,可以在 http://<the host’s IP>:8080/ 中看到当前目录下 index.html 的内容。

命令中的 -p 8080:80 部分指定将主机的 TCP 8080 端口转发到容器的 80 端口。

命令中的 -v .:/usr/share/nginx/html 部分指定将主机上的当前目录挂载到容器中的 /usr/share/nginx/html

命令中的 nginx:1.25 指定使用 Docker Hub 上的 官方 nginx 镜像。Docker 镜像与虚拟机镜像有些相似,但是它们通常不包含额外的诸如 systemd 和 sshd 等守护进程。

您也可以在 Docker Hub 上找到其他应用程序的官方镜像。您还可以使用称为 Dockerfile 的语言自行构建自己的镜像:

FROM debian:12
RUN  apt-get update && apt-get install -y openjdk-17-jre
COPY myapp.jar /myapp.jar
CMD  ["java", "-jar", "/myapp.jar"]

可以使用 docker build 命令构建镜像,并使用 docker push 命令将其推送到 Docker Hub 或其它镜像仓库。

Kubernetes

Kubernetes 将多个容器主机(例如(但不限于)Docker 主机)集群化,以提供负载平衡和容错功能。

值得注意的是,Kubernetes 也是一个抽象框架,用于与 Pods(始终在同一主机上共同调度的容器组)、Services(网络连接实体)和 其它类型的对象 进行交互,但是本次演讲不会深入介绍 kubernetes。

Docker 与 Docker 之前的容器

虽然容器直到 2013 年 Docker 发布才受到太多关注,但 Docker 并不是第一个容器平台:

  • 1999FreeBSD Jail
  • 2000Linux 虚拟环境系统(Virtuozzo 和 OpenVZ 的前身)
  • 2001Linux Vserver
  • 2002Virtuozzo
  • 2004BSD Jail for Linux
  • 2004Solaris Containers(显然,“容器”这个词就是这次创造的)
  • 2005OpenVZ
  • 2008LXC
  • 2013Docker

人们普遍认为 FreeBSD Jail(大约 1999 年)是类 Unix 操作系统的第一个实用容器实现,尽管“容器”这个术语并不是在那时创造的。

从那时起,Linux 上也出现了几种实现。然而,Docker 之前的容器与 Docker 容器有本质上的不同。前者专注于模仿整个机器,其中包含 System V init、sshd、syslogd 等。当时经常将 Web 服务器、应用服务器、数据库服务器和所有内容放入一个容器中。

Docker 改变了整个范式。就 Docker 而言,一个容器通常只包含一个服务,因此容器可以是无状态且不可变的。这种设计显着降低了维护成本,因为容器现在是一次性的;当需要更新某些内容时,您只需删除容器并从最新镜像重新创建它即可。您也不再需要在容器内安装 sshd 和其他实用程序,因为您永远不需要对其进行 shell 访问。这也简化了多主机集群的负载平衡和容错。


2. 容器运行时的内部结构

本节假设使用 Docker v24 及其默认配置,但大多数部分也适用于非 Docker 容器。

Docker 底层

Docker 由客户端程序(docker CLI)和守护进程(dockerd)组成。docker CLI 通过 Unix 套接字 (/var/run/docker.sock) 连接到 dockerd 守护进程来创建容器。

然而,dockerd 守护进程本身并不创建容器,它将控制权委托给 containerd 守护进程来创建容器。但 containerd 也不创建容器,而是进一步将控制权委托给 runc 运行时,它包含了多个 Linux 内核功能,例如 Namespaces、Cgroups 和 Capabilities,以实现“容器”的概念。Linux 内核中并没有“容器”对象。

Namespace 命名空间

Namespace 命名空间 将资源与主机和其他容器隔离。

最知名的命名空间是 mount namespace。Mount 命名空间隔离文件系统视图,以便容器可以使用 pivot_root(2) 系统调用将 rootfs 更改为 /var/lib/docker/.../<container's rootfs>。该系统调用类似于传统的 chroot(2)更安全

容器的 rootfs 与主机的结构非常相似,但它对 /proc/sys/dev 有一些限制。例如,

  • /proc/sys 目录被重新挂载为只读绑定以禁止 sysctl。
  • • 通过挂载 /dev/null 来屏蔽 /proc/kcore 文件(RAM)。
  • • 通过挂载空的只读 tmpfs 来屏蔽 /sys/firmware 目录(固件数据)。
  • • 对 /dev 目录的访问受到 Cgroup 的限制(稍后讨论)。

Network namespace 允许为容器分配专用 IP 地址,以便它们可以通过 IP 相互通信。

PID namespace 隔离进程树,以便容器无法控制其外部的进程。

User namespace(不要与用户空间 混淆)通过将主机上的非 root 用户映射到容器中的伪 root 来隔离 root 权限。伪 root 可以像容器中的root 一样运行 apt-getdnf 等,但它没有对容器外部资源的特权访问。

用户命名空间显着减轻了潜在的容器突破攻击,但 Docker 中默认不使用它


其他命名空间:

  • IPC命名空间:隔离 System V 进程间通信对象等。
  • UTS 命名空间:隔离主机名。"UTS"(Unix Time Sharing system)似乎对这个命名空间来说是个用词不当的称呼。
  • (可选)Cgroup 命名空间:隔离 /sys/fs/cgroup 层次结构。
  • (可选)Time 命名空间:隔离时钟。大多数容器尚未使用
相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
2月前
|
Ubuntu PHP Docker
一个可以运行的Dockerfile_php ,用来创建php容器镜像
该简介描述了一个基于 Dragonwell 8 Ubuntu 的 Docker 镜像,用于构建包含 PHP 7.4 及常用扩展的运行环境。通过更换为阿里云源提升安装速度,配置了 PHP-FPM 并暴露 9000 端口,使用自定义 Dockerfile 构建镜像并成功运行容器。
|
3月前
|
存储 C++ 容器
高维结构投影系列(一):波函数与弦:万象的压缩容器
波函数与弦理论看似分属不同领域,实则揭示同一宇宙奥秘:用极简结构承载无限可能。波函数展现态空间的概率压缩,弦振动呈现粒子谱的展开选择。二者皆为高维结构的投影机制——一个映射态空间,一个映射谱空间。现实并非粒子碰撞,而是结构压缩与展开的选定分支。宇宙或是一套“压缩—展开”系统,现实只是可能性之海中被观测选中的片段。
94 0
|
9月前
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
针对本地存储和 PVC 这两种容器存储使用方式,我们对 ACK 的容器存储监控功能进行了全新升级。此次更新完善了对集群中不同存储类型的监控能力,不仅对之前已有的监控大盘进行了优化,还针对不同的云存储类型,上线了全新的监控大盘,确保用户能够更好地理解和管理容器业务应用的存储资源。
606 281
|
8月前
|
人工智能 Prometheus 监控
容器化AI模型的监控与治理:确保模型持续稳定运行
在前几篇文章中,我们探讨了AI模型的容器化部署及构建容器化机器学习流水线。然而,将模型部署到生产环境只是第一步,更重要的是确保其持续稳定运行并保持性能。为此,必须关注容器化AI模型的监控与治理。 监控和治理至关重要,因为AI模型在生产环境中面临数据漂移、概念漂移、模型退化和安全风险等挑战。全面的监控涵盖模型性能、数据质量、解释性、安全性和版本管理等方面。使用Prometheus和Grafana可有效监控性能指标,而遵循模型治理最佳实践(如建立治理框架、定期评估、持续改进和加强安全)则能进一步提升模型的可信度和可靠性。总之,容器化AI模型的监控与治理是确保其长期稳定运行的关键。
|
7月前
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
189 0
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
|
8月前
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
133 1
|
10月前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序
|
8月前
|
PHP Docker 容器
如何在宿主主机运行容器中的php守护进程
在Docker容器中同时运行多个程序(如Nginx+PHP+Ftp)时,需用`docker exec`命令启动额外服务。首先通过`php -v`查看PHP版本,再用`which php-fpm7.4`确认PHP安装路径,通常返回`/usr/sbin/php-fpm7.4`。最后直接运行该路径启动PHP-FPM服务,确保其正常工作。
145 14
|
9月前
|
存储 监控 对象存储
ACK容器监控存储全面更新:让您的应用运行更稳定、更透明
介绍升级之后的ACK容器监控体系,包括各大盘界面展示和概要介绍。
|
10月前
|
存储 Prometheus 监控
Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行
本文深入探讨了在Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行。
423 5

热门文章

最新文章