目录

1. 相比较虚拟机,容器有哪些技术优势?

2. 容器镜像是什么?

3. RHEL 提供了哪些容器工具?

4. 根容器和无根容器有什么区别?

5. 请谈一下容器镜像(image)和仓库/注册表 (registry)的关系。

6. 请写出以 shell 交互方式运行容器的命令。

7. 请说明如何配置容器仓库。

8. 如何检查仓库中的和本地的容器镜像?

9. 如何移除本地镜像?

10. 使用容器时,如何将主机端口和容器端口进行映射?

11. 在运行容器时如何给容器传递参数?

12. 写出管理容器时的常见命令,比如查看、 终止、 删除、 重启等。

13. 如何在容器中运行业务系统的命令?

14. 如何为容器提供持久存储?

15.如何进行配置才能使容器在 Linux 启动时自动运行?

1. 相比较虚拟机,容器有哪些技术优势?

轻量级:容器共享主机内核,无需独立操作系统,启动快(秒级)、资源占用低(内存、磁盘开销小)。

可移植性:打包应用及依赖,在不同环境(开发、测试、生产)中一致运行,解决 “环境不一致” 问题。

高效部署:镜像体积小,分发和部署速度快,支持快速扩缩容。

资源隔离:通过 namespace 和 cgroups 实现进程级隔离,兼顾隔离性和资源利用率(优于虚拟机的硬件级隔离)。

2. 容器镜像是什么?

容器镜像是一个只读的模板,包含运行应用所需的代码、运行时、库、环境变量和配置文件。它是容器的 “蓝图”,容器基于镜像创建,且镜像可被多次复用、分发。镜像采用分层存储(Layer),每层对应一次修改,可共享重复层,节省存储空间。

3. RHEL 提供了哪些容器工具?

Podman:无守护进程(daemonless)的容器引擎,兼容 Docker CLI,支持 root 和无根容器。

Buildah:用于构建容器镜像的工具,可独立于容器引擎运行,支持多格式镜像。

Skopeo:用于管理容器镜像的工具,支持镜像复制、检查、删除(跨仓库操作)。

CRI-O:专为 Kubernetes 设计的容器运行时,兼容容器运行时接口(CRI)。

4. 根容器和无根容器有什么区别?

对比项

根容器(Root Container)

无根容器(Rootless Container)

运行权限

以主机 root 用户运行

以普通用户(非 root)运行

安全隔离

隔离性较弱,容器内 root 等效主机 root

隔离性更强,容器内 root 权限被限制

资源限制

可直接访问主机资源,限制配置较简单

受用户 namespace 限制,部分功能需额外配置

适用场景

需高权限操作(如挂载系统目录)

普通应用部署,优先考虑安全性

5. 请谈一下容器镜像(image)和仓库/注册表 (registry)的关系。

容器镜像是应用的静态打包形式,仓库 / 注册表(Registry)是存储和分发镜像的中心化服务。

关系类似:镜像 ≈ 软件安装包,仓库 ≈ 软件仓库(如 yum 仓库)。

流程:本地构建镜像后,可推送到仓库(push),其他主机从仓库拉取(pull)镜像并运行容器,实现镜像的共享和分发。

6. 请写出以 shell 交互方式运行容器的命令。

podman run -it --rm <镜像名> /bin/bash  

7. 请说明如何配置容器仓库。

(1)添加仓库配置文件:在 /etc/containers/registries.conf 中定义仓库地址。

(2)配置镜像拉取策略:通过 unqualified-search-registries 指定默认搜索仓库

(3)私有仓库认证:若仓库需认证,使用 podman login <仓库地址> 输入用户名密码,凭据存储在 ~/.config/containers/auth.json。

8. 如何检查仓库中的和本地的容器镜像?

查看本地镜像:podman images  # 列出所有本地镜像

查看仓库中的镜像:podman search <镜像名>  # 搜索仓库中的镜像(默认Docker Hub)

skopeo list-tags docker://<仓库地址>/<镜像名>  # 列出指定仓库的镜像标签。

9. 如何移除本地镜像?

podman rmi <镜像ID或名称>  # 移除指定镜像

podman rmi -f <镜像ID或名称>  # 强制移除(即使有容器依赖)

podman image prune  # 清理无标签(dangling)的镜像

10. 使用容器时,如何将主机端口和容器端口进行映射?

运行容器时通过 -p 或 --publish 指定映射:

podman run -p <主机端口>:<容器端口> <镜像名>

# 示例:将主机8080端口映射到容器80端口

podman run -p 8080:80 nginx

11. 在运行容器时如何给容器传递参数?

命令行参数:直接在镜像名后添加,作为容器内启动命令的参数。

podman run <镜像名> <参数1> <参数2>

环境变量:通过 -e 传递,

12. 写出管理容器时的常见命令,比如查看、 终止、 删除、 重启等。

查看容器:

运行中:podman ps

所有(包括停止的):podman ps -a

终止容器:podman stop <容器ID或名称>

删除容器:podman rm <容器ID或名称>(需先停止,或加 -f 强制删除)

重启容器:podman restart <容器ID或名称>

暂停 / 恢复容器:podman pause <容器ID> / podman unpause <容器ID>

13. 如何在容器中运行业务系统的命令?

(1)进入运行中的容器执行:podman exec -it <容器ID或名称> <命令>

(2)启动容器时直接运行命令:podman run <镜像名> <命令>

14. 如何为容器提供持久存储?

绑定挂载(Bind Mount):将主机目录挂载到容器,数据保存在主机:

podman run -v <主机目录>:<容器目录> <镜像名>

命名卷(Named Volume):由容器引擎管理的存储卷,独立于主机目录结构:

podman volume create myvolume  # 创建卷

podman run -v myvolume:<容器目录> <镜像名>  # 挂载卷到容器

15.如何进行配置才能使容器在 Linux 启动时自动运行?

通过 --restart 策略配置容器自启动(适用于 Podman):

podman run --restart=always --name myservice <镜像名>

其他策略:on-failure(失败时重启)、unless-stopped(除非手动停止,否则重启)。

对于已创建的容器,可通过 podman update --restart=always <容器ID> 修改策略。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐