RH134学习进程——十二.运行容器(4)

十二.运行容器

通过第三部分的实操,实现了容器的数据持久化网络互通,解决了容器 "数据易丢失""外部无法访问" 的核心痛点。但在生产环境中,容器还需具备 "自动化运维能力"------ 比如主机开机自启、故障自动恢复、状态实时监控等。需要将容器纳入系统服务管理体系,而 systemd 作为 Linux 系统的核心服务管理器,正是实现这一需求的最优方案。

本文将聚焦如何通过 systemd 将容器封装为系统服务,实现容器的 "服务化" 运维,让容器像传统系统服务一样稳定、可控。

4.作为系统服务管理容器

4.1使用systemd unit

普通用户可以创建systemd unit来配置rootless容器,利用此配置,通过systemctl命令将容器作为常见的系统服务进行管理操作。

适用于小型、无需扩展容器部署 (如单容器 Web 服务、简单后台服务)。依赖 systemd 的本地服务管理能力,即可实现容器的 "服务化" 管理。

对于 复杂编排场景,systemd 能力不足,需使用 Kubernetes等企业级编排平台

4.2systemd User Service要求

普通用户通过systemd User Service管理rootless 容器、时,需满足 3 个关键条件,否则会出现权限或会话问题:

(1)需创建专用普通用户

原理:

useradd创建普通用户 时,系统会在****/etc/subuid**** 中为容器预留 UID 范围(用于用户 namespace 映射);

若用useradd --system(系统账户),则不会预留该范围,无法启动 rootless 容器。

操作:

sudo useradd 专用用户

sudo passwd 密码

(2)Podman 需 "完整登录会话"

原因:

直接用su / sudo 切换用户会报错:

XDG_RUNTIME_DIR directory /run/user/1008 is not owned by the current user

因为su /sudo 未加载完整用户会话;

方法:

通过ssh登录专用用户,确保 Podman 获取正确的环境变量。

ssh 专用用户@localhost

登录本地主机

(3)容器启动失败的日志排查

若容器启动后立即退出:

podman ps -a

显示Exited

如:

排查原因:

podman container logs 容器名

针对不同原因进行修复。

4.3创建systemd用户文件

核心逻辑:

在~/.config/systemd/user/ 路径下,编写用户级的 .service 单元文件。

Podman 可通过podman generate systemd自动生成符合规范的 systemd 单元文件,控制"容器的创建/删除",无需手动编写*.service文件

4.3.1生成systemd文件

(1)核心选项

|------------|--------------------------------------------|---------------------------------------------|---------------|
| 选项 | 作用 | 容器生命周期 (启动→停止) | 适用场景 |
| 无--new | 基于现有容器 生成配置 | 启动现有容器 → 停止容器(不删除) | 需保留容器状态的场景 |
| --new | 启动时新建容器 ,停止时删除容器 (自动加--rm) | 创建 并启动新容器 → 停止并删除容器 | 容器无状态、需每次全新启动 |
| --files | 将配置直接生成文件(而非控制台输出),避免手动复制(文档未提但实战常用) | - | 批量管理多个容器 |

(2)为现有容器生成systemd文件

podman generate systemd --name 容器名

(3)启动时新建容器, 停止时删除容器

podman generate systemd --name 容器名 --new

(4)生成文件到默认目录(~/.config/systemd/user/)

podman generate systemd --name 容器名 --files

(5)配置文件完成后,重启守护进程

systemctl --user daemon-reload

4.3.2unit 文件存放目录

|--------------|--------------------------|--------------|
| 用户类型 | 存放目录 | 权限要求 |
| 普通用户 | ~/.config/systemd/user/ | 仅当前用户可读写 |
| root 用户 | /etc/systemd/system/ | 需 root 权限 |

4.4管理systemd文件

生成 unit 文件后,通过systemctl --user管理容器服务;

如:

systemctl --user start container-容器名字.service

systemctl --user status container-容器名字.service

4.4.1核心命令

|------------|---------------------------------------------------|--------------------------------------------|
| 操作 | 普通用户(User Service) | root 用户(System Service) |
| 重新加载配置 | systemctl --user \ daemon-reload | systemctl \ daemon-reload |
| 启动服务 | systemctl --user start \ container-容器名字.service | systemctl start \ container-容器名字.service |
| 停止服务 | systemctl --user stop \ container-容器名字.service | systemctl stop \ container-容器名字.service |
| 查看状态 | systemctl --user status \ container-容器名字.service | systemctl status \ container-容器名字.service |
| 设置开机自启 | systemctl --user enable \ container-容器名字.service | systemctl enable \ container-容器名字.service |
| 查看日志 | journalctl --user -u \ container-容器名字.service | journalctl -u \ container-容器名字.service |

4.4.2注意事项

(1) 禁止手动干预:

若用systemctl启动服务,不可再用podman start/stop操作容器------systemd 会误判容器状态(如手动停止后,systemd 可能再次重启)。

(2) 状态验证:

systemctl --user status需显示active (running),且日志无报错;

若失败,优先查看podman container logs 容器名或journalctl日志。

4.5配置在主机启动时启动的容器

默认情况下,普通用户的 systemd 服务 仅在用户登录后启动登出后停止 ,无法实现 "主机开机启动"。需通过loginctl enable-linger突破此限制。

4.5.1原理:

linger(持续运行)功能让系统为用户保留一个 "虚拟会话",即使用户未 SSH 登录,其systemd User Service也能持续运行。

4.5.2操作:

(1)查看用户的linger状态(默认no)

loginctl show-user 专用用户 | grep Linger

(2)启用linger

sudo loginctl enable-linger consvc


(3)验证状态

loginctl show-user 专用用户 | grep Linger

输出:Linger=yes


(4)关闭linger(如需)

sudo loginctl disable-linger consvc

4.6 以root用户管理systemd容器

若容器需要特权(如映射 1024 以下端口、访问系统设备),需用 root 用户管理,步骤与普通用户类似,但更简洁

区别:

|-------------------|--------------------------|-------------------------|
| 对比项 | 普通用户(rootless) | root用户(rootful) |
| 专用用户 | 必须创建(非 system 账户) | 无需,直接用 root |
| unit 文件目录 | ~/.config/systemd/user/ | /etc/systemd/system/ |
| systemctl选项 | 需--user | 无需 |
| linger配置 | 必须启用 | 无需 |
| 特权操作(如端口 < 1024) | 不支持 | 支持 |

4.7使用容器systemd服务(用户级)的流程

4.7.1 创建并登录专用用户(rootless)

创建:

sudo useradd 专用用户

sudo passwd 专用用户

登录:

ssh 专用用户@计算机IP


4.7.2 修改配置允许注册表访问(如需拉取私有镜像)

(1)创建配置文件

mkdir -p ~/.config/containers/

如:


(2)将registries.conf 文件复制到配置文件

cp 注册表配置文件的实际存放路径 \

~/.config/containers/

如:


(3)验证

podman search

如:


(4)登录容器注册表

podman login 注册表


4.7.3创建systemd服务文件并更改到此目录。

(1)创建~/.config/systemd/user/文件

mkdir -p ~/.config/systemd/user

cd ~/.config/systemd/user

(2)创建单元文件

podman generate systemd --name 容器名 --files --new


4.7.4停止并删除容器

(1)停止容器

(2)删除容器


4.7.5验证 systemd 服务配置

(1)重新加载systemd守护进程配置

systemctl --user daemon-reload

(2)启动并启用服务(用户登录时自动启动

systemctl --user enable --now 服务

(3)验证容器是否仍在运行

podman ps


4.7.6设置开主机自启动

loginctl enable-linger


4.7.7验证
相关推荐
西岸行者7 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意7 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码7 天前
嵌入式学习路线
学习
毛小茛7 天前
计算机系统概论——校验码
学习
babe小鑫7 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms7 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下7 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。7 天前
2026.2.25监控学习
学习
im_AMBER7 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J7 天前
从“Hello World“ 开始 C++
c语言·c++·学习