如何在不崩溃docker容器的情况下重启apache2?

时间:2016-05-30 10:25:40

标签: php apache docker docker-compose

我使用标签为php docker container作为基础:

php:5.6-apache

当我尝试重新启动容器内的apache2时,容器会停止:

root@phalconapp:/var/www/html# service apache2 restart
Restarting web server: apache2Terminated
root@phaclonapp:/var/www/html#
me@myLocalComputer:

如何在不停止容器的情况下重启apache2?

在将更改放入dockerfile之前,我想要使用容器并自定义它。我想安装一些扩展并让它们工作我需要重新启动apache才能使更改生效。

这是日志文件:

Attaching to dltasklight_phlaconapp_1
phlaconapp_1 | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
phlaconapp_1 | AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message
phlaconapp_1 | [Mon May 30 10:19:24.556154 2016] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.10 (Debian) PHP/5.6.22 configured -- resuming normal operations
phlaconapp_1 | [Mon May 30 10:19:24.556181 2016] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
phlaconapp_1 | [Mon May 30 10:21:11.754993 2016] [mpm_prefork:notice] [pid 1] AH00169: caught SIGTERM, shutting down
dltasklight_phlaconapp_1 exited with code 0

5 个答案:

答案 0 :(得分:27)

如果您使用apache作为主要服务来保留正在运行的容器,则无法重新启动它。只是因为你构建了图像并用它设置了CMD。

  

CMD的主要目的是为执行容器提供默认值。这些默认值可以包含可执行文件,也可以省略可执行文件,在这种情况下,您还必须指定ENTRYPOINT指令。

尝试在不重新启动服务的情况下重新加载:

/etc/init.d/apache2 reload

答案 1 :(得分:2)

我的解决方案是将我的bash shell退出到容器中,然后重新启动Docker之外的容器。因为Apache被设置为主要服务,所以这也会重新启动Apache,并且不会使容器崩溃。

docker restart <container>

答案 2 :(得分:1)

sudo docker kill --signal="USR1" your_appache_container

您可以使用其他信号来实现以下目标:

立即停止发出信号: TERM

平稳重启信号: USR1

立即重启信号: HUP

优雅停止信号: WINCH

来自: this website

答案 3 :(得分:0)

但是在开始之前,你的apache在重启时是否会失败?多数民众赞成如何退出?在这种情况下,请通过设置正确的配置并查看这些日志来使其运行。

您可以尝试的一种方法是登录容器(进行bash),并且可以在其工作的位置始终使用 docker commit 。然后,您可以将基本容器图像更改为该图像。

我通过在我的Dockefile中使用不同的 ENTRYPOINT 来构建来自这些已提交的新图像来解决类似情况。

答案 4 :(得分:0)

  

我想自定义容器,我需要安装一些扩展   为了让他们工作,我需要重新启动apache以进行更改   效果。

这违反了Docker的不可变基础架构原则。恕我直言,你正在使用类似于一个完整的VM的docker容器。相反,我建议你将docker镜像视为最终的工件并将其版本化。 注意:这只是我的拙见,你可能有一个我不知道的有效用例,我很想知道。