不使用dockerfile 让容器内服务自启动

如何让docker容器本身实现开机自动启动?只需两步:

1.首先将docker守护进程的系统服务设置开机自启动,根据linux发行版的不同操作方式会有所不同。这里不再陈述。

2.创建docker容器时,指定重启方式为“总是重启”。或者更新一个已存在容器的参数为“总是重启”。这样容器就会随着docker服务的启动而启动。

docker run –name=yourname -i -t -d -h yourhostname –restart always …. //新建容器时restart指定为always
docker update containernames --restart always //更新一个已存在容器的restart为always

不过本文讨论的重点是,如何在不借助dockerfile的情况下,以容器可以自启动作为前提,让容器内服务也能实现自启动且能保持后台运行?其实方法也很简单。

1.使用公共镜像新建一个容器,里面安装好所需服务并确保服务运行正常。(如已经有需要的容器,可以略过此步)

2.编写所需服务启动脚本,这里的例子是这样的。不过要在脚本的最后加一行 /bin/bash。编写完成后,将脚本置于容器根目录后退出容器。

#!/bin/bash
/etc/init.d/cron start
/etc/init.d/httpd start
... ...
/bin/bash

3.使用docker export命令导出已经打包好的容器,然后重新导入,重新生成容器,指定启动命令为所编写的脚本。

docker export 容器id > 自定义名称.tar //容器id就是当前所要导出容器的container id,自定义名称就是为导出的tar文件取个名字
cat 自定义名称.tar | docker import - 自定义容器名称:版本号 //自定义容器名称:版本号 的意思是给导入的docker image打个tag标签
docker run --name=自定义名称 -i -t -d -h 容器主机名 --restart always -p 所需端口:所需端口 镜像id 启动命令

以上述命令为例子,实际操作一番是这样的:

root@server ~# docker export 1804814014 > web.tar
root@server ~# cat web.tar | docker import - web:v1
root@server ~# docker run --name=web --restart always -i -t -d -h web1 -p 80:80 -p 443:443 1201274408 /start.sh

此时如果再次查看容器运行状态会发现,容器已经安稳的在运行了,不会像以前一样运行一会儿就自动退出了。

为什么会这样?原因很简单。启动脚本的最后一行指定的是 /bin/bash,而bash作为一个用户界面shell,它的进程是可以前台状态长时间运行的。正因为bash在运行,所以容器就不会自动退出。而所需服务虽然是后台运行,但是已经在bash执行之前全部启动完毕了。所以服务也可以正常使用。

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注