Ubuntu里设置docker容器内的服务随开机自动启动

    要让docker容器内的服务能在开机加电后自动启动,要解决三个问题:

1.docker服务能随OS启动而启动

2.docker容器能随docker服务启动而启动

3.docker容器内的服务能随docker容器启动而启动

      Ubuntu18.04上,docker service 默认没有enable,所以Ubuntu18.04启动后不会自动启动docker service,在手工执行docker ps之类的docker命令时docker service才启动,显然采用的是lazy loading策略,这个可以在新安装的环境里启动Ubuntu 18.04后查看docker的进程确认,要让docker service随Ubuntu启动,需要先enable它。

      Docker容器要能随Docker service的启动而启动,那么启动策略需要设置为always。

      Docker容器内init.d之类的初始化执行机制都没有了,所以像平时在物理机的Ubuntu里那样加开机启动的service或者桌面应用之类的是没效果的,需要在执行docker run命令时指定容器启动后立即执行的脚本来启动需要启动的服务。

Ubuntu上执行下列步骤可以实现:

1A.  sudo systemctl enable docker.service  +   sudo systemctl start docker.service   # Ubuntu18.04,start命令可不用执行,执行docker命令时docker.service会自动启动。

1.B sudo service docker start

2.设置容器的启动策略:用docker run命令创建并运行容器时,加上  --restart=always参数即可,因此可以跳过这步。对于既有容器可以采用两种办法改变启动策略的设置为always: 

    1)  docker update --restart=always <容器名字>

    2) 修改容器对应的hostconfig.json,例如/data1/dockerspace/containers/c64fc2d6f34d8bc78cfa7356a1830ebe2f86de8b3ae7a06b2c7e31b904c7289f/hostconfig.json
"RestartPolicy":{"Name":"no","MaximumRetryCount":0} 改为 "RestartPolicy":{"Name":"always","MaximumRetryCount":0}
再执行systemctl restart docker重启docker service

 3.执行带 --restart=always参数和初始化脚本路径的docker run命令创建运行容器,例如:

      sudo docker run --runtime nvidia -it -d --ipc=host --network host --restart=always --name pytorch1.2_centernet-efficientdet-cascadercnn-full -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix -v /data/workspace:/home arm64v8/ubuntu18.04/nvidia-cuda:pytorch1.2-cec-full  /home/start_server.sh

       对于第3步,一个新创建的容量里肯定是没有这种初始执行的脚本的(例如/home/start_server.sh),一般是需要在一个容器内编辑准备好一个这样的脚本,执行这个脚本测试确实可以启动你需要启动的服务了,用docker commit制作一个镜像,然后使用上面这样的带 --restart=always参数和初始化脚本路径的docker run命令来基于这个镜像创建并运行一个新的容器,容器启动后立即执行这个指定的初始化执行脚本,例如上面的/home/start_server.sh

      这个初始执行脚本的写法也有需要注意的地方,不是随便写个里面执行启动你需要的服务的shell脚本就行,至少需要做三件事:i)设置服务所需要的环境变量,ii)以后台方式启动服务,iii)执行bash,三者缺一不可,没有第一项你的服务启动不了或者启动后不能正常运行(例如,不设置中文字符集可能你的服务遇到中文就傻了或者直接因解析错误而崩溃),如果没有第三项,启动docker容器后容器立即退出或者永远处于restarting状态,无法连接上去。

      给个示例:

     #!/bin/bash
     export LANG=C.UTF-8
     export CUDA_HOME=/usr/local/cuda
     export PATH=/usr/local/cuda/bin:$PATH
     export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
     cd /home/model_serving_flask
     nohup python -u efficientdet_fire_model_server.py >nohup.fire.log &
     /bin/bash

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
Docker中,可以使用不同的方法来实现容器的SSH开机启动。以下是一种常见的方法: 1. 创建一个新的容器映像:首先,您需要在Dockerfile中定义一个自定义镜像。在Dockerfile中,使用RUN命令安装SSH服务器。您可以选择使用任何您熟悉和喜欢的SSH服务器,如OpenSSH Server。例如,可以使用以下命令在Ubuntu镜像中安装OpenSSH服务器: ``` FROM ubuntu RUN apt-get update && apt-get install -y openssh-server ``` 2. 配置SSH服务器:在Dockerfile中,使用RUN和COPY命令进行容器的SSH服务器配置。对于OpenSSH服务器,您可以复制您自己的SSHD配置文件(sshd_config)到容器中。使用COPY命令将配置文件复制到适当的位置。例如: ``` COPY sshd_config /etc/ssh/sshd_config ``` 然后,使用RUN命令更改权限和所有者: ``` RUN chmod 600 /etc/ssh/sshd_config && chown root:root /etc/ssh/sshd_config ``` 3. 启动SSH服务器:在Dockerfile中,使用CMD或ENTRYPOINT命令启动SSH服务器。使用CMD时,可以将启动命令添加到Dockerfile的末尾。例如,可以使用以下命令启动OpenSSH服务器: ``` CMD ["/usr/sbin/sshd", "-D"] ``` 这将使用默认配置文件来启动SSH服务器。 4. 构建镜像和运行容器:使用docker build命令构建镜像,并使用docker run命令来运行容器。您可以在docker run命令中指定SSH服务器的端口映射(如 `-p host_port:container_port`)和其他选项。例如: ``` docker build -t mysshimage . docker run -d -p 2222:22 --name mysshcontainer mysshimage ``` 此操作将构建名为mysshimage的镜像,并使用2222端口映射到容器的22端口。容器将在后台以mysshcontainer的名称运行。 这样,当您启动容器时,您可以使用SSH工具连接到该容器的IP地址和指定的端口(例如,localhost:2222)。您可以使用之前设置的用户名和密码进行身份验证,以便远程访问该容器。 请注意,这只是一种实现方式,还有其他方法也可以实现Docker容器的SSH开机启动。具体实现取决于您对Docker和SSH服务器的个人偏好和要求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arnold-FY-Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值