1.RHEL 实现容器使用核心技术

  • 用于资源管理的 Control Groups (cgroups)

  • 用于进程隔离的 Namespaces

  • SELinux 和 Seccomp(Secure Computing mode)加强安全边界

2.容器和虚拟化的对比

(1)容器提供了许多与虚拟机相同的优点,例如安全性、存储和网络隔离

(2)二者的应用程序库和 runtime 资源都与主机操作系统或管理程序隔离开来

(3)容器化应用通过 docker 引擎共享主机的操作系统,节省的磁盘内存 CPU,轻小快,容器只打包他的应用和库

         容器:

  • 在操作系统上直接运行,容器之间分享硬件和操作系统资源,容器中应用轻量化快速并行运行

  • 共享操作系统内核,将容器化的应用程序进程与系统的其余部分隔离,并使用与该内核兼容的任何软件

  • 比虚拟化要求更少的硬件资源,可以快速启动和停止,减少存储需求,包括所有依赖项,如系统和编程依赖项,以及配置设置

3.运行无根容器(rootless)

        在容器主机上,用户能以根用户或普通用户运行容器。非特权用户运行的容器称为无根容器

        无根容器更安全,但有一些限制。例如,无根容器不能通过容器主机的特权端口(1024以下的端口)发布网络服务

        根(root)用户当然可以直接运行容器(rootful 容器),但这在一定程度上削弱了系统的安全性

        容器的可移植性好,容器通常是临时(ephemeral)(一运行就退出)的。可将运行中的容器生成的数据永久保存在持久存储(persistent storage)中

4.容器镜像和注册表 

(1)容器从容器镜像(container image)运行。容器镜像是创建容器的蓝图

容器镜像打包一个应用程序连同它所有的依赖:

  • 系统库函数

  • 编程语言运行时

  • 编程语言库函数

  • 配置

  • 静态数据文件

image 不可更改

        image 根据规范 (OCI) 构建,例如 Open Container Initiative (OCI) image 格式规范。这些规范定义了 image 的格式及元数据

        容器注册表 (registry) 是用于存储和检索容器 image 的存储库。开发人员将 image 上传或推送到 registry。用户可以从 registry 下载或拉取这些容器 image 到本地系统,以便运行容器

(2)需要红帽开发人员账户才能从红帽 registry 下载镜像。可使用 podman login 命令对 registry 进行身份验证

[user@host ~]$ podman login registry.lab.example.com

5.配置容器registries

registry的默认配置文件是 /etc/containers/registries.conf

6.ContainerFile

ContainerFile 是一种文本文件,内含用于构建容器镜像的指令

生成的容器镜像由只读层组成,每一层代表 ContainerFile 中的一条指令

7.部署容器

(1)Podman 程序

podman 是来自于 container-tools 包组的容器引擎,用于管理 OCI 容器和镜像

podman 运行不使用守护进程,无需以特权用户身份运行

8.管理容器存储和网络资源

        (1)可配置容器以连续运行某一服务,如数据库服务器,这种需求下,需考虑向容器添加更多资源,如持久存储或 DNS 解析

        对仅使用单个容器且无需扩展的小型部署,可以在容器上创建要挂载的目录,映射到容器主机上创建的持久存储

        当容器为主机外部的客户端提供内容时,就必须为这些客户端设置通信通道,以访问容器的内容。可配置端口映射,以启用与容器的通信

容器持久存储

        (2)默认情况下,容器使用的存储是临时的,删除容器后会丢失其内容

在容器中挂载持久卷时,必须考虑文件系统级别的权限

举例:在 MariaDB 镜像中,mysql 用户必须拥有 /var/lib/mysql 目录,打算挂载到容器中的目录,必须具有 mysql 作为用户和组所有者(或 mysql 用户的 UID/GID,如果主机上没有安装 MariaDB)

在 rootless 容器中,普通用户具有容器内的 root 访问权限,因为 Podman 在用户 namespace 内启动容器

9.容器中DNS配置

        默认 Podman 容器无法解析彼此的主机名,因为默认网络上未启用
        使用 podman network create 命令创建一个支持 DNS 的网络

[user@host ~]$ podman network create --gateway 10.87.0.1 \
--subnet 10.87.0.0/16 db_net
db_net

        使用 podman network inspect 命令验证网关和子网的设置是否正确

[user@host ~]$ podman network inspect db_net
{
    "name": "db_net",
    ...output omitted...
    "subnets": [
    {
    "subnet": "10.87.0.0/16",
    "gateway": "10.87.0.1"
    }
    ],
    ...output omitted...
    "dns_enabled": true,
}

10.Podman 是一款无状态程序,需要完整的登录会话。Podman 必须在  
SSH 会话中使用,不能在 sudo 或 su shell 中使用

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐