You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Docker托管插件中运行systemd?

用centos/systemd镜像部署Apache服务器的完整方案

刚好我之前折腾过在容器里借助systemd管理Apache服务的需求,用centos/systemd镜像就能搞定,下面是一步步的实现方法:

1. 编写Dockerfile

直接用这个现成的Dockerfile,它会帮你完成Apache安装、服务启用和端口配置:

FROM centos/systemd
RUN yum -y install httpd; yum clean all; systemctl enable httpd.service
EXPOSE 80
CMD ["/usr/sbin/init"]

这里几个关键点要说明下:

  • 基于官方的centos/systemd镜像,自带完整的systemd运行环境,不用自己折腾配置
  • 安装httpd后清理yum缓存,能有效缩小镜像体积;同时启用httpd的systemd自启,确保容器启动时服务自动运行
  • 暴露80端口,方便外部访问
  • 最后启动/usr/sbin/init,这是systemd的主进程,让容器内的服务由systemd统一管理

2. 构建镜像并启动容器

构建镜像

执行这条命令构建自定义的Apache镜像:

docker build --rm --no-cache -t httpd .

参数解释:

  • --rm:构建过程中生成的临时容器会自动删除,避免残留垃圾
  • --no-cache:强制不使用缓存,保证每次构建都是全新的环境,适合调试或依赖更新时用
  • -t httpd:给镜像打上httpd的标签,方便后续引用

启动容器

用下面的命令启动容器,注意必须加上特权和cgroup挂载,否则systemd没法正常工作:

docker run --privileged --name httpd -v /sys/fs/cgroup:/sys/fs/cgroup:ro -p 80:80 -d httpd

参数解释:

  • --privileged:给容器赋予特权权限,因为systemd需要访问宿主机的cgroup资源才能正常运行
  • -v /sys/fs/cgroup:/sys/fs/cgroup:ro:把宿主机的cgroup目录以只读方式挂载到容器内,这是systemd运行的必要条件
  • -p 80:80:把宿主机的80端口映射到容器的80端口,这样外部就能通过宿主机IP访问Apache服务了
  • -d:让容器在后台运行,不占用当前终端

内容的提问来源于stack exchange,提问作者Archimedes Trajano

火山引擎 最新活动