容器技术基础与实践:从镜像管理到自动运行配置全攻略
1. 相比较虚拟机,容器有哪些技术优势?
(1)直接在操作系统上运行,从而跨系统上的所有容器共享资源,‘
(2)共享主机的内核。
(3)与虚拟机相比,它需要的硬件资源要少得多,因此容器的启动速度也更快。
(4)包括所有依赖项。
2. 容器镜像是什么?
容器镜像是包含编码步骤的静态文件,它充当创建容器的蓝图。
3. RHEL 提供了哪些容器工具?
Podman管理容器和容器镜像;Buildah创建容器镜像;Skopeo检查、复制、删除和签署镜像。
4. 根容器和无根容器有什么区别?
由特权用户运行的容器称为Rootful容器,由非特权用户运行的容器称为Rootless容器。
Rootless容器不允许使用通常为特权用户保留的系统资源。
5. 请谈一下容器镜像(image)和仓库/注册表 (registry)的关系。
容器镜像是容器运行的 “静态内容”,仓库是这些内容的 “存储与分发平台”。二者相互依赖:镜像通过仓库实现跨环境共享和版本管理,仓库通过存储镜像发挥其分发价值,共同支撑了容器从构建到部署的全生命周期。
6. 请写出以 shell 交互方式运行容器的命令。
基础命令为 `podman run -it --rm <镜像名> /bin/bash`,其中 `-i` 保持输入交互,`-t` 分配终端,`--rm` 退出后自动删除容器,`/bin/bash` 启动 shell。
扩展场景包括:挂载主机目录(`-v 主机路径:容器路径`)、暴露端口(`-p 主机端口:容器端口`)、非 root 运行(`--user UID`);若容器已后台运行,可用 `podman exec -it <容器ID/名称> /bin/bash` 进入新 shell。
7. 请说明如何配置容器仓库。
(1)仓库类型选择:根据场景选工具,轻量用Docker Registry,企业级用Harbor(带权限、扫描)或Red Hat Quay(集成OpenShift),OpenShift环境优先用内置仓库。
(2)基础配置:
- 启动仓库并挂载存储实现持久化;
- 配置HTTPS(生成证书)和基础认证(htpasswd);
- 客户端需信任证书或配置非安全仓库,通过login验证后可推送/拉取镜像。(3)企业级配置:
- Harbor:部署时配置HTTPS和存储(如Ceph),通过Web界面管理项目和权限;
- Quay:高可用部署(结合Operator),集成LDAP认证和S3/Ceph存储。
(4)客户端适配:配置证书信任或非安全仓库,确保与仓库正常通信。
8. 如何检查仓库中的和本地的容器镜像?
本地镜像:用podman images或docker images列出现有镜像,inspect看详情、history看层结构,结合grep搜索特定镜像。
远程仓库镜像:公共仓库(如 Docker Hub)用skopeo list-tags查看标签;私有仓库(如 Harbor)操作类似,需先登录,也可通过仓库 API 查询。
对比两者:检查本地是否有对应版本,通过skopeo inspect和podman inspect获取远程与本地镜像的唯一标识(Digest)进行比对。
9. 如何移除本地镜像?
podman rmi <镜像ID>
podman rmi <仓库名:标签>
docker rmi <镜像ID或名称>
10. 使用容器时,如何将主机端口和容器端口进行映射?
命令参数:-p/--publish,格式主机端口:容器端口[协议](协议默认为 TCP)
11. 在运行容器时如何给容器传递参数?
(1)命令行参数:`podman run 镜像 参数1 参数2`,直接传递给ENTRYPOINT/CMD
(2)环境变量:`-e 变量名=值` 或 `--env-file 文件`,容器内应用读取
(3)配置文件挂载:`-v 主机路径:容器路径`,覆盖默认配置
(4)构建参数(ARG):`--build-arg 变量名=值`,构建时传递
(5)卷挂载:通过数据卷传递大量数据
(6)结构化数据:通过环境变量传递JSON/YAML(需应用解析)
12. 写出管理容器时的常见命令,比如查看、 终止、 删除、 重启等。
查看容器:podman start <容器ID或名称>
删除容器:podman rm <容器ID或名称>
启动/终止容器:podman start/stop <容器ID或名称>
进入容器:podman exec -it <容器ID或名称> /bin/bash
重命名容器:podman rename <旧名称> <新名称>
暂停/恢复容器:podman pause <容器ID或名称>
podman unpause <容器ID或名称>
导出容器为tar文件:podman export <容器ID或名称> > container.tar
从tar文件导入为镜像:podman import container.tar myimage:v1
13. 如何在容器中运行业务系统的命令?
(1)对运行中容器:用exec -it进入容器交互执行,或直接exec非交互执行(如podman exec 容器ID 命令)。
(2)启动容器时:在run命令后直接指定业务命令,覆盖默认启动指令(如podman run 镜像 命令)。
(3)通过启动脚本:镜像中配置ENTRYPOINT指向脚本,容器启动时自动执行初始化及业务命令。
14. 如何为容器提供持久存储?
(1)数据卷(Volumes):容器引擎管理的存储(如podman volume create),独立于容器生命周期,推荐使用。
(2)绑定挂载(Bind Mounts):挂载主机目录到容器(如-v /host:/container),适合开发调试。
(3)tmpfs 挂载:数据存于内存(--tmpfs /path),容器停止后丢失,适合临时缓存。
(4)存储插件:对接外部存储系统(如 NFS、Ceph),适合生产集群。
15. 如何进行配置才能使容器在 Linux 启动时自动运行?
(1)容器引擎自带策略:启动容器时加--restart参数,如--restart=always(系统重启后必启)、--restart=unless-stopped(手动停止后不自动启),也可通过podman/docker update修改已有容器策略。
(2)systemd 服务管理:创建服务文件(如/etc/systemd/system/容器名.service),定义启动 / 停止命令及依赖,然后systemctl daemon-reload并enable --now启用,支持控制启动顺序等精细配置。