使用 podman 将容器作为 systemd 服务运行

2023-05-16

前置环境要求:需要以 CRI-O 作为容器运行时。安装 CRI-O 及配置国内容器镜像加速器请参考:

使用 CRI-O 容器引擎

本文介绍了如何使用 podman 初始化 systemd 服务,以两种不同的方式使用容器:

使用 systemd 启动容器:通过在宿主机上生成并使用 systemd 单元文件,你可以让宿主机对容器进行自动启动、停止、检查状态,以及以其他方式将容器作为 systemd 服务进行管理。

使用 systemd 启动容器中的服务:许多 Linux 服务(Web 服务器、文件服务器、数据库服务器等)已经被打包为 RHEL 的 systemd 服务。如果你使用的是基于 RHEL 构建的容器镜像,以及任何兼容 RHEL / CentOS 的其他 Linux 发行版构建的容器镜像,你都可以将此类容器镜像设置为启动 systemd 服务,然后在容器启动时自动启动容器内选定的服务。下面以 AnolisOS 8.4 构建的容器镜像为例。

一、使用 systemd 启动容器

为了使用 AnolisOS systemd,你需要创建一份类似下面文本的 Dockerfile 文件。执行 vi Dockerfile 命令,按 i 进入编辑,然后复制粘贴下面的文本,再按 Esc 输入 :wq 保存并返回。

FROM openanolis/anolisos:8.4-x86_64
ENV container docker
RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
systemd-tmpfiles-setup.service ] || rm -f $i; done); \
rm -f /lib/systemd/system/multi-user.target.wants/*;\
rm -f /etc/systemd/system/*.wants/*;\
rm -f /lib/systemd/system/local-fs.target.wants/*; \
rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
rm -f /lib/systemd/system/basic.target.wants/*;\
rm -f /lib/systemd/system/anaconda.target.wants/*;
VOLUME [ "/sys/fs/cgroup" ]
CMD ["/usr/sbin/init"]

此 Dockerfile 删除了许多可能导致问题的单元文件。 从此处开始,执行如下命令以构建 systemd 基础镜像。

podman build --format=docker --rm -t anolisos-systemd:8.4 .

列出刚创建的镜像,执行如下命令。

podman images
# 显示如下内容
localhost/anolisos-systemd     8.4         b4c0566418b0  3 hours ago   231 MB
docker.io/openanolis/anolisos  8.4-x86_64  92b8136491cc  2 months ago  231 MB

删除构建的依赖镜像,执行如下命令。

podman rmi -f 92b8136491cc

创建并启动容器,执行如下命令。 

podman run --privileged -ti --name=master1 localhost/anolisos-systemd:8.4 /usr/sbin/init

使用容器名称或 ID 生成 systemd 单元文件,并将其定向到 /usr/lib/systemd/system/container-master1.service 文件中:

podman generate systemd --name master1 > /usr/lib/systemd/system/container-master1.service

查看生成的 systemd 单元文件的内容:

cat /usr/lib/systemd/system/container-master1.service
# 显示如下内容
# container-master1.service
# autogenerated by Podman 4.0.2
# Sun Apr 17 14:54:21 CST 2022

[Unit]
Description=Podman container-master1.service
Documentation=man:podman-generate-systemd(1)
Wants=network-online.target
After=network-online.target
RequiresMountsFor=/run/containers/storage

[Service]
Environment=PODMAN_SYSTEMD_UNIT=%n
Restart=on-failure
TimeoutStopSec=70
ExecStart=/usr/bin/podman start master1
ExecStop=/usr/bin/podman stop -t 10 master1
ExecStopPost=/usr/bin/podman stop -t 10 master1
PIDFile=/run/containers/storage/overlay-containers/1e31f66d7d83977d0860345ad7be3ae25461a314257fd58db0dfd75caa6c6cc8/userdata/conmon.pid
Type=forking

[Install]
WantedBy=default.target

Restart=on-failure 行,设置重启策略,并指示 systemd 在无法完全启动或停止服务时或者进程退出非零时重新启动。
ExecStart 行,描述了如何启动容器。
ExecStop 行,描述了如何停止和移除容器。

重新载入 systemd Manager 配置:

systemctl daemon-reload

启用并启动 container-master1.service : 

systemctl enable --now container-master1.service

以上服务无论用户是否登录,都会随系统启动而自动启动。更多服务启动方式请参阅:启用 systemd 服务。

二、使用 systemd 在容器中启动服务

为了使用上面创建的支持 systemd 的基础容器,你需要创建类似于下面的 Dockerfile。 

FROM localhost/anolisos-systemd:8.4
RUN dnf -y install httpd; dnf clean all; systemctl enable httpd.service
EXPOSE 80
CMD ["/usr/sbin/init"]

构建此镜像,执行如下命令:

podman build --format=docker --rm -t systemd-httpd .

为了使用 systemd 运行一个容器,你需要从主机上挂载 cgroups 卷,执行如下命令:

podman run --privileged -ti --name=systemd-httpd -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 80:80 localhost/systemd-httpd

验证容器是否正在运行,并且服务是否正在工作,键入以下命令:

curl 127.0.0.1
# 显示如下内容
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
......

注:由于 podman 创建的容器是独立于 CRI-O 而存在的,因此,此类容器并不会受 crio.service 的状态(如启动、停止、崩溃等)影响。同时,必须得按第一种方式为该类容器单独生成一份 systemd 单元文件后,才能使其随宿主机开机自启动。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 podman 将容器作为 systemd 服务运行 的相关文章

  • O2OA人员身份,人员属性

    人员信息创建 从组织管理应用中进入个人管理界面后 xff0c 点击左侧上方的添加按钮 xff0c 如下图所示 xff1a 在右侧显示的界面中填写人员信息 xff1a 人员名称 手机号码 唯一编码 xff08 以上必填 xff0c 其他选填写
  • O2OA的SSO与单点认证

    SSO与单点认证 与其他系统实现单点登入 1 1 URL传递加密参数方式 这种方式是比较通用简单的实现方式 xff0c 应急门户将用户登录信息 xff08 用户ID xff09 以URL参数方式传递给被集成系统 xff0c 被集成系统通过接
  • newman和Jenkins(postname和Jenkins的结合使用)

    Newman介绍 Newman 是 Postman 推出的一个 nodejs 库 xff0c 直接来说就是 Postman 的json文件可以在命令行执行的插件 Newman 可以方便地运行和测试集合 xff0c 并用之构造接口自动化测试和
  • SmartBI入门(一)介绍和安装

    一 SmartBI系统介绍 商业智能 xff08 Business Intelligence xff0c 简称 xff1a BI xff09 xff0c 又称商业智慧或商务智能 xff0c 指用现代数据仓库技术 线上分析处理技术 数据挖掘和
  • SmartBI入门(二)配置SmartBI

    具体可以参考文档 Smartbi Config页面介绍 Smartbi V10帮助中心 SmartBI配置 如果是首次访问 xff0c 需要设置 管理员账号 密码 xff0c 以便下次登录配置界面时验证 xff0c 设置后用用户名密码登录即
  • 求助 关于A-Frame带有动画模型的导入

    哪位大神知道导入带有动画的模型后 如何调用模型自带的动画 gltf格式的
  • SmartBI入门(三)数据源配置

    1 设置数据连接 配置连接 2 选择数据表 创建的数据源 xff0c 点击数据库管理 xff0c 添加实际报表需要的数据表 3 数据库展现
  • 再见2014,你好2015

    过去就是过去了 2014年再见 xff0c 2015年你好 xff01 回首 总结也只是慰藉 1999年12月至今 xff0c 经历了整整十五个曾经 xff0c 这其中的波折 xff0c 怎是我这样的小辈能够理解的 借这个平台也只是为了感谢
  • idea报错 Artifact web:war exploded: Error during artifact deployment. See server log for details.

    因为tomcat把报错信息重定向到日志文件中了 xff0c 所以在控制台找不到报错信息 所以需要看一下tomcat日志文件报错信息 xff0c 一般情况下都有报错 日志的路径默认是在C Users 你的用户名 AppData Local J
  • Unity离线用户手册打开缓慢、卡顿

    Unity中文离线用户手册下载页面 https docs unity3d com cn 2019 4 Manual OfflineDocumentation html 文档包下载地址 xff08 需要FQ xff09 https stora
  • Python MapReduce 案例

    map t py import sys import re p 61 re compile r 39 w 43 39 for line in sys stdin ss 61 line strip split 39 39 for s in s
  • ARM基础学习-快速上下文切换技术

    FCSE的原理 快速上下文切换技术 xff08 FCSE xff09 通过修改系统中不同进程的虚拟地址 xff0c 避免在进行进程间切换时造成虚拟地址到物理地址的重映射 xff0c 从而提高系统性能 xff1b 通常情况下 xff0c 如果
  • linux下使用VNC

    安装 xff1a root 64 localhost vncserver You will require a password to access your desktops Password Verify New 39 localhos
  • svn忽略ignore文件记住方式(转)

    每个项目中的配置文件都有区别 xff0c 在本地开发和线上生产 xff0c 之前一直很懒 xff0c 不想去忽略提交一些配置文件 xff0c 只是在提交的时候排除掉 但是在项目上传部署的时候又必须小心 xff0c 害怕覆盖线上的配置 xff
  • OpenvSwitch完全使用手册

    本文主要参考 Overview of functionality and components 以及 Frequently Asked Questions 以及结合自己的理解 http sdnhub cn index php openv s
  • c++正则表达式regex_match和regex_seach使用

    1 xff1a 区别 regex match用来做全匹配 xff0c 检测字符串是否符合表达式规则 xff0c 如果字符串符合规则 xff0c 返回true xff1b regex seach用来匹配字符串中是否有和规则相匹配的字符串子串
  • ubuntu 14.04 ssh连接失败解决---离线安装openssh_server

    1 在联网机器上下载 deb 包 xff0c 因为我的离线机器为 Ubuntu14 04 64位 所以对应下载 amd64 Trusty 包 xff0c 以下为需要下载的 openssh server 及安装依赖的 deb 包名称 open
  • 使用 js 做一个简单学生系统

    HTML lt DOCTYPE html gt lt html gt lt head gt lt title gt 学生系统 lt title gt lt style type 61 34 text css 34 gt nianji wid
  • C#从基于FTPS的FTP server下载数据 (FtpWebRequest 的使用)SSL 加密

    FTPS xff0c 亦或是FTPES 是FTP协议的一种扩展 xff0c 用于对TLS和SSL协议的支持 本文讲述了如何从一个基于FTPS的Server中下载数据的实例 任何地方 xff0c 如有纰漏 xff0c 欢迎诸位道友指教 话不多
  • 人脸识别损失函数简介与Pytorch实现:ArcFace、SphereFace、CosFace

    总结成一句话就是 xff1a 在softmax基础上 xff0c 对最后一层全连接的权重和输入特征进行归一化 xff0c 重新放缩到半径为s的超平面 xff0c 增加惩罚的margin训练 xff0c 使得类型紧凑 xff0c 类间变得远离

随机推荐

  • 这或许是个新的开始吧

    其实上大学到现在很多时候我都很迷茫 xff0c 内心有很多感想和体会 xff0c 有时会想着去把它写下来 xff0c 却又在拿起笔的时候退缩 现在我是大二的下学期末 xff0c 回顾这两年的自己 xff0c 或许我比许多同学差很多 xff0
  • 信息化VS数字化

    1 信息化更偏系统建设 xff0c 数字化更偏业务 2 信息化更偏稳态 xff0c 数字化更偏敏态变革 3 信息化更偏流程管理 xff0c 数字化更偏业务赋能 4 信息化更偏流程 xff0c 数字化更偏数据 5 信息化是管理视角 xff0c
  • ?跟谁学_极简英语——公开课01作业

    作业 xff1a 将下列句子的六成分用删除线划掉 xff0c 并翻译出来 1 I hava many letters to write 2 We met a group of pupils 小学生 returning from school
  • ?跟谁学_极简英语——公开课02作业

    作业 xff1a 找出句子的悬挂结构 xff0c 并翻译句子 1 Lin Tao a 14 yeas old schoolboy still didn t show up at school 2 I play tennis with my
  • grafana如何修改默认端口【3000】

    grafana修改默认端口为80后 xff0c 启动会报 bind permission denied 解决方法 xff1a xff08 三种方式 xff09 授予grafana二进制权限 xff08 推荐使用 xff09 span cla
  • 分享【免费】【英语听力】&【背单词】练习网站和微信小程序 博主:杨中科

    内容丰富 xff0c 贴近实战 xff0c 值得一试 英语听力 xff1a https www youzack com 背单词 xff1a https bdc youzack com Recitation Home ChooseDictio
  • connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

    docker 守护进程未启动 xff0c 无法使用docker命令 span class token punctuation span root 64 grafana253 span class token punctuation span
  • Win10上Docker无法正常启动 出现install WSL2 kernel update的情况

    文章目录 一 情况描述 二 解决方法 2 1检查自己的Win10版本 2 2下载插件 三 最终效果 写在最后 一 情况描述 当装完docker之后 xff0c 系统提示Windows重新启动 xff0c 作者就重启系统准备使用docker
  • 【JVM规范】2.5.JVM运行时数据区 Run-Time Data Areas

    2 5 运行时数据区Run Time Data Areas JVM为程序执行定义了不同的运行时数据区 xff08 run time data areas xff09 一部分运行时数据区在JVM启动时创建 xff0c JVM退出时被销毁 另一
  • for in遇到的bug

    项目场景 xff1a 由于ie不兼容getElmentsByClassName获取元素 xff0c 所以我自己封装该方法 xff1a ie支持ID与TagName获取元素 问题描述 xff1a 提示 xff1a 这里描述项目中遇到的问题 x
  • 使用C#进行点对点通讯和文件传输(发送接收部分)

    上面介绍了通讯的基类 xff0c 下面就是使用那个类进行发送和接收的部分 xff1a 二 发送部分 xff1a 发送咱们使用了多线程 xff0c 可以同时进行多个任务 xff0c 比如发送文件 发送文本等 xff0c 互不影响 xff1a
  • 这些日子我读过的《java编程思想》

    来到这里实习的时候 xff0c 就准备多读几本书 xff0c 其中第一本就是 Java编程思想 xff0c 后续还会读一些 代码大全 算法导论 之类的书籍 不过这一次通过阅读 java编程思想 xff0c 我收获了实在太多了 xff0c 现
  • CMMI2.0和CMMI1.3有什么区别?

    CMMI资质认证想必已经有不少企业已经了解过了 xff0c 很多企业只了解到CMMI的基础知识 xff0c 却不明白CMMI也有不同的版本 xff0c CMMI1 3版本自动20年10月更改为2 0版本 xff0c 那CMMI的一个版本升级
  • CMMI2.0和1.3之间的区别有哪些?

    CMMI资质认证已经有很多年的历史了 xff0c CMMI的版本也发生了变化 xff0c 从最初的1 3版本演变成至今2 0版本 xff0c 现在的企业在办理的时候使用也都是2 0版本 xff0c 那么这两者之间的变化是什么 xff1f 区
  • Python str isalpha方法

    目录 描述 语法 举例 1 字符串中只包含字母 2 字符串包含数字 符号和字母 描述 isalpha函数检测字符串中是否只包含字母 如果全部是字母组成的字符串 xff0c 则返回True xff0c 否则返回False isalpha 函数
  • Caffe 完全安装指南(GPU) 上

    目录 0 写在前面1 Caffe依赖包安装1 1 ProtoBuffer1 2 Boost1 3 GFLAGS1 4 GLOG1 5 BLAS1 6 ZLIB1 7 HDF51 8 LMDB和LEVELDB1 9 Snappy1 10 Op
  • 质数因子的求解

    质因子 xff08 或质因数 xff09 在数论里是指能整除给定正整数的质数 根据算术基本定理 xff0c 不考虑排列顺序的情况 下 xff0c 每个正整数都能够以唯一的方式表示成它的质因数的乘积 下面求解某一个数的质因子的情况 1 分解为
  • 常见的液晶显示模块类型

    随着市场的发展 人们更加倾向于产品的人机交互对话功能 能够实现交互的方式很多 xff0c 作为对交互界面的各种显示器液晶液晶模块以其低功耗 易控制受到设计者的青睐 于是各种型号 功能的液晶模块涌入市场 xff0c 这就需要对其进行综合及比较
  • 如何在ubuntu系统中安装gnome界面

    首先 xff0c 你需要进入ubuntu系统 xff0c 然后打开终端 然后需要这样操作 xff1a 1 更新软件源 sudo apt get update sudo apt get upgrade y 2 安装Tasksel sudo a
  • 使用 podman 将容器作为 systemd 服务运行

    前置环境要求 xff1a 需要以 CRI O 作为容器运行时 安装 CRI O 及配置国内容器镜像加速器请参考 xff1a 使用 CRI O 容器引擎 本文介绍了如何使用 podman 初始化 systemd 服务 xff0c 以两种不同的