前言:
使用docker大规模部署应用,而又需要开机自启,自动启动容器中的程序,这里以docker ros为例子,使用systemctl服务,结合shell脚本,也可以结合Python脚本,进而实现了开机自启进入容器运行程序
步骤:
1、创建shell脚本
其目的是能够进入容器,并且能够执行相关程序
shell脚本示例 /home/a/test.sh
docker run -ti -d \
--hostname=${USER} \
--network=host \
-v /tmp/.X11-unix:/tmp/.X11-unix:rw \
--env="QT_X11_NO_MITSHM=1" \
-v /etc/localtime:/etc/localtime \
--name=myros \
dockerros/my_ros:latest \
bash
-
-d: 后台运行容器,并返回容器ID;
-
-i: 以交互模式运行容器,通常与 -t 同时使用;
-
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
-
-v:绑定一个卷,即把本地文件映射到容器中
-
--name 为容器命名
-
-v /etc/localtime:/etc/localtime 这个解决了容器内时间和本地时间不一致的问题(时区不一致导致的)
2、编写systemctl脚本
示例 my_test.service
[Unit]
Description=my test
After=docker.target
[Service]
Type=simple
ExecStart=/home/a/test.sh
PrivateTmp=true
KillMode=control-group
[Install]
WantedBy=multi-user.target
3、把service放到 /usr/lib/systemd/system/目录下
然后执行
sudo systemctl daemon-reload
4、启动服务
启动服务只需要
sudo systemctl start my_test.service
设置开机自启
sudo systemctl enable my_test.service
关闭开机自启
sudo systemctl disable my_test.service
查看my_test.service的实时输出
sudo journalctl -u my_test.service -f
注意事项
1、注意观察bash 的路径 是/usr/bin/bash 还是/bin/bash 本机、工控机、docker三个地方的可能不一样,写错误可能导致服务启动失败
2、容器在创建完成,shell脚本执行完成后,通过
sudo systemctl status my_test.service
查看服务状态
Active: inactive (dead)
这是因为在执行玩shell脚本后,执行完成,会退出,所以是Active: inactive (dead)
像docker.service会显示running,是因为它会一直运行
3、运行容器中的程序可以在docker run 最后的bash后面加上启动命令,也可以通过dockerfile CMD中指定,在用镜像创建容器时运行哪个程序
这里只做了开机自启,并没有涉及到stop和restart,在service文件里也没有写这两个命令,“ExecStop 和ExecReload”,这是因为“自启的时候在执行完成shell脚本后,执行完成,会退出”,系统会自己调用“ExecStop”,这里写的话会产生问题,而docker有自己的停止命令,停止可以用 docker stop 容器名实现,重启的话只需要再执行一下shell脚本即可。
如有问题请留言,看到会回复的!欢迎提出更好的思路,谢谢!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)