目录

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

1. 轻量级

2. 启动速度快

3. 资源效率

4. 一致性与可移植性

5. 易于分发与部署

2. 容器镜像是什么?

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

Skopeo:用于检查、复制、删除和签名容器镜像。

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

1.1 根容器(Root Container)

1.2 无根容器(Rootless Container)

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

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

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

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

9. 如何移除本地镜像?

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

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

1. 环境变量(-e)

2. 命令行参数

3. 挂载配置文件(-v)

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

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

1. 运行容器时直接执行命令

2. 进入运行中的容器执行命令

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

1. 绑定挂载(Host Directory → Container Directory)

2. 命名卷(更安全的方式)

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

总结


容器技术已经成为现代 IT 基础设施的核心组成部分,尤其是在 Red Hat Enterprise Linux (RHEL) 9 中,容器的使用变得更加高效与便捷。

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

1. 轻量级

容器共享宿主机操作系统的内核,无需为每个容器实例启动一个完整的操作系统,这意味着它们比虚拟机更加轻量,资源消耗更少。

2. 启动速度快

容器的启动时间通常在几秒钟内,而虚拟机启动可能需要几分钟。容器快速启动特性使得应用的部署和扩展变得更加高效。

3. 资源效率

容器能够更加高效地利用宿主机资源,支持在同一台机器上运行多个相互隔离的应用,提高资源的利用率。

4. 一致性与可移植性

容器镜像确保应用在不同的环境中运行时的一致性,避免了“在我机器上能运行”的问题,从而使应用的可移植性大大增强。

5. 易于分发与部署

容器镜像能够轻松打包应用程序和其所有依赖,使得分发和部署变得非常简单,极大地提高了 CI/CD(持续集成与持续交付)的效率。

2. 容器镜像是什么?

容器镜像是容器的基础,它是创建容器的“蓝图”。每个镜像包含了应用程序及其所有依赖项,都是一个只读的模板。具体来说,容器镜像包括以下内容:

  • 系统库函数

  • 编程语言运行时

  • 编程语言库

  • 配置文件

  • 静态数据文件

通过容器镜像,开发者可以确保容器在任何环境中都能一致地运行。

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

RHEL 提供了一整套容器工具,帮助用户在单台服务器上高效运行多个容器。主要工具包括:

  • Podman:用于管理容器和容器镜像,兼容 Docker 命令,适用于无守护进程模式。

  • Skopeo:用于检查、复制、删除和签名容器镜像。

  • Buildah:用于构建新的容器镜像。

这三种工具提供了从容器的创建、管理到分发的完整流程,满足不同的容器管理需求。

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

1.1 根容器(Root Container)

根容器以 root 用户权限运行,拥有完整的系统权限,能够访问宿主机的所有资源。虽然它提供了更多的控制,但这也意味着它的安全性较低。

1.2 无根容器(Rootless Container)

无根容器由非特权用户启动,它不具有宿主机的完全权限,因此在安全性方面更具优势。无根容器无法访问宿主机的特权端口(如 1024 以下的端口),但它对大多数普通应用来说已经足够使用。

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

容器镜像是一个包含应用程序及其所有依赖项的文件系统模板,而容器仓库(Registry)是一个用于存储和分发镜像的集中存储库。开发人员将镜像推送到仓库,用户则可以从仓库中拉取镜像并在本地运行容器。

在 RHEL 中,可以使用如 podman 等工具访问镜像仓库,获取需要的镜像进行本地部署。

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

podman run -it --name my_container ubuntu /bin/bash

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

容器仓库配置的核心文件是 registries.conf,分系统级和用户级:

(1)配置文件路径

系统级(所有用户生效):/etc/containers/registries.conf

用户级(仅当前用户生效):~/.config/containers/registries.conf

  1. 核心配置示例(RHEL 8/9)

# 1. 未指定仓库时的默认搜索仓库(比如拉取 alpine 时,优先从这些仓库找)

unqualified-search-registries = ["registry.access.redhat.com", "docker.io"]

# 2. 配置私有仓库(允许拉取/推送)

[[registry]]

# 私有仓库地址

location = "registry.lab.example.com"

# 允许未加密(HTTP)访问(测试环境用,生产建议 HTTPS)

insecure = true

# 允许推送镜像到该仓库

allow-push = true

(3)生效方式

修改配置后无需重启服务,直接执行 podman pull 即可生效。

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

查看本地镜像:podman images

查看远程注册表(仓库)的镜像:例如,使用podman search命令,或直接访问注册表的Web接口

9. 如何移除本地镜像?

podman rmi 命令

podman rmi IMAGE_ID

在删除镜像之前,必须先从该镜像移除所有关联的容器,否则镜像无法被删除。

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

容器通常需要与外部进行通信,这时端口映射是一个非常重要的操作。通过 podman run -p 命令,可以将宿主机的端口映射到容器的端口。以下是常见的映射操作:

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

podman run -d -p 8080:80 nginx

指定主机 IP 地址(仅允许本机访问):

podman run -d -p 127.0.0.1:8080:80 nginx

随机映射主机端口:

podman run -d -p 80 nginx

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

容器可以通过多种方式接收参数,这些参数可以在容器启动时传递,或者在容器运行过程中进行修改:

1. 环境变量(-e

环境变量是传递配置参数的常见方式。例如,给 MariaDB 容器传递数据库密码和数据库名称:

podman run -d -e MYSQL_ROOT_PASSWORD=redhat -e MYSQL_DATABASE=test mariadb
2. 命令行参数

容器默认启动时会执行一个命令,可以通过命令行覆盖这个默认命令。例如,改变容器的默认启动命令:

podman run -it nginx /bin/bash
3. 挂载配置文件(-v

可以通过挂载主机上的配置文件覆盖容器内的默认配置。例如,挂载主机的 nginx.conf 文件到容器内:

podman run -d -v /host/nginx.conf:/etc/nginx/nginx.conf:ro nginx

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

查看容器(运行中的容器):

podman ps

查看所有容器(包括停止的容器):

podman ps -a

停止容器:

podman stop CONTAINER_ID

删除容器:

podman rm CONTAINER_ID

重启容器:

podman restart CONTAINER_ID

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

1. 运行容器时直接执行命令

你可以在容器启动时直接执行命令,例如:

# 在 alpine 容器中执行 echo 命令
podman run alpine echo "hello"
2. 进入运行中的容器执行命令

首先,启动一个后台容器:

podman run -d --name mynginx nginx

然后,进入容器并执行命令:

podman exec -it mynginx ps -ef

或者执行一次性命令:

podman exec mynginx nginx -t  # 检查 nginx 配置

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

容器的存储是临时的,但我们可以通过挂载外部存储来实现持久化存储Podman 支持两种类型的存储挂载:

1. 绑定挂载(Host Directory → Container Directory)

通过绑定挂载,将宿主机的目录映射到容器内,例如将宿主机的 /host/data 目录挂载到容器的 /var/lib/mysql 目录:

podman run -d -v /host/data:/var/lib/mysql:Z mariadb
2. 命名卷(更安全的方式)

使用命名卷可以提高存储的安全性和可管理性。例如:

# 创建命名卷
podman volume create mariadb-data

# 挂载命名卷到容器
podman run -d -v mariadb-data:/var/lib/mysql mariadb

# 查看卷的宿主机路径
podman volume inspect mariadb-data

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

在一些场景中,我们希望容器随系统启动自动运行。可以通过 systemd 来管理容器,并配置容器在系统启动时自动启动。

首先,启用 user service 使容器在系统启动时自动运行:

loginctl enable-linger USER

如果不需要此功能,可以通过以下命令禁用:

loginctl disable-linger USER

总结

容器技术的优势在于它的轻量级、启动速度快、资源效率高等特点,使得容器在现代 IT 基础设施中逐渐成为虚拟机的强力替代者。通过 RHEL 提供的一系列工具,如 PodmanSkopeoBuildah,容器的管理、部署和分发变得更加高效与便捷。理解并掌握容器镜像与仓库的关系,以及如何管理容器,将帮助开发者和运维人员提高工作效率和系统安全性。

更多推荐