在停止后启动Docker容器

6
我使用这个 Dockerfile 构建了一个 Phalcon PHP 镜像。
FROM ubuntu:14.04

MAINTAINER betojulio

COPY apache2_evogas.conf /tmp/apache2.conf

RUN apt-get update && apt-get install -y \
    apache2 \
    php5-dev \
    php5-mysql \
    libapache2-mod-php5 \
    gcc \
    libpcre3-dev \
    git \
    && rm -rf /var/lib/apt/lists/* \
    && git clone git://github.com/phalcon/cphalcon.git \
    && cd cphalcon/build \
    && ./install \
    && cd /etc/php5/apache2/conf.d \
    && echo 'extension=phalcon.so' > phalcon_php.ini \
    && cp /tmp/apache2.conf /etc/apache2/apache2.conf \
    && a2enmod rewrite

CMD /usr/sbin/apache2ctl -D FOREGROUND

我使用以下命令创建运行容器:

docker run -d -p 80:80 --name webserver -v /www:/var/www/html  betojulio/phalcon_project:1.0

一切都很顺利。

我的问题是,当我停止容器后,如何使用相同的选项“-d -p 80:80 -v /www:/var/www/html”重新启动同一个容器'webserver',或者在停止容器后,我必须将其删除并重新创建它?

提前感谢你。


1
docker启动web服务器 - Robert Moskal
3个回答

12

与其他答案所说的一样,要启动一个已停止的容器,您需要运行:

docker start <容器名称或ID>

如果它不能保持运行状态,请检查日志:

docker logs <容器名称或ID>

如果您希望该容器在停止后由于某些原因自动重新启动,请查看docker重启策略

docker run -d --restart=unless-stopped -p 80:80 --name webserver -v /www:/var/www/html  betojulio/phalcon_project:1.0

另外,您可能希望在Dockerfile中将CMD更改为以下内容。

CMD ["apache2", "-D", "FOREGROUND"]

docker logs webserver 返回 "AH00558: apache2: 无法可靠地确定服务器的完全限定域名,使用 127.17.0.3。设置 'Servername directive globaly' 以抑制此消息。Httpd (pid 9 already running)" - julio alberto leal rivera
您需要在apache2.conf配置文件中更改服务器名称。 - Ken Cochrane
我修改了配置文件!仍然不起作用。 在Docker日志中,我们的Web服务httpd(9)已经在运行。 - julio alberto leal rivera

1
docker start webserver

就是这样。


我尝试过 "docker start webserver",但容器无法保持运行状态。我输入了 "docker ps -a" 命令,在状态字段中显示 Exited (0) 2 秒前。 - julio alberto leal rivera
听起来你的进程又停止了。日志中有什么有用的信息吗(docker logs webserver)? - Rick
docker logs webserver 返回 "AH00558: apache2: 无法可靠地确定服务器的完全限定域名,使用127.17.0.3。设置'Servername'指令全局以抑制此消息" Httpd (pid 9 已在运行) - julio alberto leal rivera

0

我有一些反馈。

当我使用以下命令运行我的镜像时:

docker run -d -p 80:80 --name webserver -v /www:/var/www/html betojulio/phalcon_project:1.0

第一次一切正常。

容器中运行的命令是"/bin/sh -c /usr/sbin"。我可以通过输入 'docker ps' 来了解这个信息。 但是,由于正在运行的命令,我无法重新启动容器。

如果我从 Dockerfile 中删除 'CMD /usr/sbin/apache2ctl -D FOREGROUND',并构建一个新的镜像,然后使用以下命令运行容器:

docker run -d -p 80:80 --name webserver -v /www:/var/www/html betojulio/phalcon_project:1.0 /usr/sbin/apache2ctl -D FOREGROUND

容器中运行的命令是/usr/sbin/apache2ctl,在停止容器后,我可以使用 'docker start container' 命令重新启动它。

这是正常现象还是存在错误?


好的,这是我的新CMD行 "CMD ['/usr/sbin/apache2ctl', '-D', 'FOREGROUND']"。 构建镜像后,我运行了 'docker run -d -p 80:80 --name webserver -v /www:/var/www/html betojulio/phalcon_project:1.0' 容器无法保持运行状态,docker日志返回 '/bin/sh:1:[/usr/sbin/apache2ctl,-D,FOREGROUND]: not found'。 - julio alberto leal rivera
嗯,有点奇怪,不确定是否有影响,但你尝试过使用双引号 " 而不是单引号 ' 吗? - Ken Cochrane
这似乎对其他人有效:https://github.com/paulczar/docker-apache2/blob/master/Dockerfile#L22 但他们使用的是apache2而不是apache2ctl。 - Ken Cochrane
我刚刚尝试了使用双引号。我可以第一次运行图像。但是当我停止它后,我无法重新启动它。Docker日志返回“httpd(pid 8)已在运行”。 - julio alberto leal rivera
@ Ken Cochrane,感谢您的帮助!我尝试了apache2,它正在工作。如果您想写一个答案,我会接受它。 - julio alberto leal rivera
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接