Link

Docker 下通过 systemd 管理进程

目录

  1. Docker 下通过 systemd 管理进程
    1. 说明
    2. systemd 启动程序的 Dockerfile
    3. 通过 rc.local 调用启动脚本

在容器环境下,一般都需要使用容器的方式来启动应用,将应用作为主进程来前台启动,但有些时候用户还是希望容器能够像传统 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