当运行一个Docker容器的时候如何启动某些Service服务?

问题描述:当运行一个容器的时候如何启动某些Service?

例如,已经在容器内安装了MySql 服务器,但在进入容器的时候

> docker run -it 09d18b9a12be /bin/bash

发现MySQL 服务并没有自动的启动。而是需要进入容器,手动的启动服务所需服务。

类似的问题还有,当我安装了SSHD服务,如何在容器运行的时候,自动的启动 ssh 服务?

> service ssh start

误区

在编写Dockerfile的时候,习惯性的以为 RUN 指令后面跟着想要启动的服务,在docker 容器内就会运行,但是实际上,RUN 指令后面跟着的命令,只会在生成镜像的时候,保存数据文件之类的,并不会保存任何运行的进程状态。这也是为什么,会有单独的 CMDENTRYPOINT 命令来指定,启动容器后的运行的命令。

还有一点就是,docker容器需要一个进程(最后一个命令)来保持运行容器状态的运行,否则该容器将退出/停止。这导致,正常的 service mysql start 之类的命令并不能直接的在Dockerfile文件中使用。

解决方案有:

  1. 在CMD指令后,接上一些不会终止结束的命令来保证进程的运行。例如 tail -F.

    CMD service mysql start && tail -F /var/log/mysql/error.log
    

    这种用法,通常在你之需要启动一个服务的情况下(首选)。

  2. 或者就是直接运行一些前台命令(不会终止的命令)

    CMD /usr/bin/mysqld_safe
    

    这种方案,只适用于你的服务有对应的前台命令。

  3. 就是将你的服务写入到一个start.sh 脚本中,并且保持脚本的持续运行。

    CMD /start.sh
    

    如果命令必须执行一系列步骤,这是最好的选择,同样,/ start.sh应该保持运行。

对于初学者,不建议使用supervisord(进程管理工具)。老实说,这太过分了。最好对容器使用单个服务/单个命令。详情参考Run multiple services in a container

顺便说一句(BTW):请检查https://registry.hub.docker.com以获取现有的mysql docker镜像以供参考

参考文档:


  1. Start sshd automatically with docker container - Stack Overflow
  2. How to automatically start a service when running a docker container? - Stack Overflow
  3. phusion/baseimage-docker: A minimal Ubuntu base image modified for Docker-friendliness
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值