Docker 下通过 systemd 管理进程
目录
在容器环境下,一般都需要使用容器的方式来启动应用,将应用作为主进程来前台启动,但有些时候用户还是希望容器能够像传统 VM 一样通过 systemd 来进行管理,本文介绍下如何实现
说明
在 systemd 下,可以为服务设置 .service
文件,然后让其自动随系统启动,此处为了方便直接安装个 Nginx,安装完毕后会自带 nginx.service 文件,通过 enable
将其设为开机启动即可。
如果要运行其他脚本之类的,可以将其直接写在 rc.local 文件中,为此文件添加可执行权限。或者在外部写好启动脚本,然后在 rc.local 中调用
sh /root/startup.sh
systemd 启动程序的 Dockerfile
FROM centos:centos7
ENTRYPOINT [ "/sbin/init" ]
RUN yum -y install epel-release && yum update -y && yum install -y nginx && systemctl enable nginx && echo 'hostnamectl set-hostname test'>> /etc/rc.local && chmod +x /etc/rc.local
构建:
docker build . -t test:v1
构建相关日志:
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service, pointing to /usr/lib/systemd/system/nginx.service.
运行容器(必须使用特权模式运行,运行后容器会卡在 init 状态,无任何输出,按 ctrl+c 可以退出):
docker run --rm --privileged=true -p 80:80 test:v1
进入容器进行测试:
docker exec -it 11e82b4eb1db bash
# 虽然响应 403,但是容器运行正常
[root@test ~]# curl 127.0.0.1
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
[root@test /]# hostname
test
[root@test /]# cat /etc/rc.local
#!/bin/bash
touch /var/lock/subsys/local
hostnamectl set-hostname test
通过 rc.local 调用启动脚本
启动脚本:
[root@k8s-m01 test]# cat startup.sh
#!/bin/bash
a=1
while true
do echo $a >> /var/log/startup.log
let a=$a+1
sleep 3
done
Dockerfile:
FROM centos:centos7
ENTRYPOINT [ "/sbin/init" ]
COPY startup.sh /root/startup.sh
RUN chmod +x /root/startup.sh && echo 'sh /root/startup.sh'>> /etc/rc.local && chmod +x /etc/rc.local
构建:
docker build . -t test:v2
运行容器(必须使用特权模式运行,运行后容器会卡在 init 状态,无任何输出,按 ctrl+c 可以退出):
docker run --rm --privileged=true -p 80:80 test:v2
进入容器查看脚本运行日志:
[root@k8s-m01 ~]# docker exec -it 5f7a7fe3b521 tail -f /var/log/startup.log
1
2
3
4