如何在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




