1 使用docker镜像创建容器时同时启动服务

1.1 创建服务应用程序启动脚本

首先我们需要创建一个shell脚本用于启动我们的服务应用程序。

在某个目录下创建一个名为start_server.sh的脚本,并在脚本内写服务启动命令,假设服务可执行程序为my_websocket_server,则依次执行以下命令,

创建start_server.sh

# 创建文件
nano start_server.sh

start_server.sh写入启动服务命令

#!/bin/bash
/xxx/xxx/my_websocket_server -c /xxx/xxx/server.conf

exit 0

修改start_server.sh权限,修改为可执行

chmod 777 ./start_server.sh

1.2 使用docker镜像创建容器时同时启动服务

在使用docker镜像创建容器时同时启动服务有两种方式,

  • 一种是在使用docker run时后面直接执行1.1节中的服务脚本
  • 另一种是将服务脚本加入到docker的开机启动中,在docker内部的系统启动时执行服务脚本

1.2.1 docker run执行服务脚本

假设docker镜像名为ubuntu:v3,服务启动脚本在docker内部的路径为/usr/bin/start_server.sh,则可以使用以下命令在启动容器时同时执行服务启动脚本

docker run -itd ubuntu:v3 -p 8080:8080 /usr/bin/start_server.sh

1.2.2 docker内部系统启动时执行服务脚本

使用docker镜像创建一个容器,其实就是一个开机的过程,所以要在docker镜像创建容器时同时启动服务其实就是将服务加入到开启启动中,在进行完这些操作之后,将当前容器再commit为一个新的docker镜像保存,下一次在使用docker run时docker内部就会自动执行服务脚本启动服务了。

Linux系统在启动时会加载以下配置文件:

  • /etc/profile
  • /root/.bash_profile
  • /etc/bashrc
  • /root/.bashrc
  • /etc/profile.d/*.sh
  • /etc/profile.d/lang.sh
  • /etc/sysconfig/i18n
  • /etc/rc.local(/etc/rc.d/rc.local)

所以在linux系统启动时运行一个shell脚本有很多种方法,比如

  • 修改开机启动文件/etc/rc.d/rc.local文件,使用bash xxx.sh执行服务脚本
  • 自定义服务文件,添加到系统服务,并通过Systemctl设置服务开机自启动
  • 将写好的shell脚本放到目录 /etc/profile.d/下,系统启动后会自动执行该目录下的所有shell脚本
  • 将写好的shell脚本放到目录/etc/init.d/或者/etc/rc.d/init.d/下,然后使用chkconfig命令设置

我们已经在1.1节中写好了服务的shell脚本,所以将该脚本直接复制或者移动到/etc/profile.d/目录下是最简单的添加服务开机启动的方式。

在/etc/rc.local或者/etc/rc.d/rc.local增加服务脚本执行命令

打开/etc/rc.local或者/etc/rc.d/rc.local,然后在exit前加入服务启动脚本代码

nano /etc/rc.d/rc.local

# 增加shell脚本执行代码
bash /xxx/xxx/start_server.sh

保存退出即可。

参考