Dockerized nginx无法启动

Sol*_*mon 37 nginx docker

我尝试过关于对我的Web服务器进行docker化的一些教程和文档,但是我无法通过docker run命令运行该服务.

这是我的Dockerfile:

FROM ubuntu:trusty

#Update and install stuff
RUN apt-get update
RUN apt-get install -y python-software-properties aptitude screen htop nano nmap nginx

#Add files
ADD src/main/resources/ /usr/share/nginx/html

EXPOSE 80
CMD service nginx start
Run Code Online (Sandbox Code Playgroud)

我创建我的图像:

docker build -t myImage .
Run Code Online (Sandbox Code Playgroud)

当我运行它:

docker run -p 81:80 myImage
Run Code Online (Sandbox Code Playgroud)

它似乎停止了:

docker ps -a

CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
90e54a254efa        pms-gui:latest      /bin/sh -c service n   3 seconds ago       Exit 0                                  prickly_bohr
Run Code Online (Sandbox Code Playgroud)

我希望这个端口81-> 80运行,但事实并非如此.运行

docker start 90e
Run Code Online (Sandbox Code Playgroud)

好像什么也没做.

我也试过直接输入它

docker run -t -i -p 81:80 myImage /bin/bash
Run Code Online (Sandbox Code Playgroud)

从这里我可以开始服务

service nginx start
Run Code Online (Sandbox Code Playgroud)

从另一个标签我可以看到它按预期工作(也在我的浏览器中):

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                NAMES
408237a5e10b        myImage:latest      /bin/bash           12 seconds ago      Up 11 seconds       0.0.0.0:81->80/tcp   mad_turing 
Run Code Online (Sandbox Code Playgroud)

所以我认为我的Dockerfile出错了?任何人都可以帮我解决这个问题,我对Docker很陌生.谢谢!

解决方案:基于Ivant的答案,我找到了另一种在前台启动nginx的方法.我的Dockerfile CMD现在看起来像:

CMD /usr/sbin/nginx -g "daemon off;"
Run Code Online (Sandbox Code Playgroud)

Ben*_*asy 81

截至目前,官方的nginx图像使用它来运行nginx(参见Dockerfile):

CMD ["nginx", "-g", "daemon off;"]

就我而言,这足以让它正常启动.网上有教程提示更难实现的方法,但上面看起来很干净.

  • 我一直在使用这种方法,它没有启动,也没有抛出错误。\ (2认同)

iva*_*ant 24

只要您指定的命令或命令行正在运行CMD,Docker容器ENTRTYPOINT就会运行.在您的情况下,service命令立即完成,整个容器关闭.

解决此问题的一种方法是直接从命令行启动nginx(确保不将其作为守护程序运行).

另一个选择是创建一个小脚本,启动服务然后永远睡眠.就像是:

#!/bin/bash
service nginx start
while true; do sleep 1d; done
Run Code Online (Sandbox Code Playgroud)

并运行此而不是直接运行该service命令.

第三种选择是使用类似runit或类似程序的东西,而不是普通服务.


小智 7

使用docker-compose:

要按照推荐的解决方案,添加到docker-compose.yml:

command: nginx -g "daemon off"
Run Code Online (Sandbox Code Playgroud)

我还发现我可以简单地添加到nginx.conf:

daemon off;
Run Code Online (Sandbox Code Playgroud)

...并继续在docker-compose.yml中使用:

command: service nginx start
Run Code Online (Sandbox Code Playgroud)

...虽然它会使配置文件在docker之外变得不那么便携.


cre*_*ack 5

Docker是官方和用户映像的很好索引。当您想做某事时,很有可能已经有人做过;)

只需在index.docker.io上搜索“ nginx”,您就会看到,有一个官方的nginx图像:https ://registry.hub.docker.com/_/nginx/

那里有完整的指南,可帮助您启动Web服务器。

随时查看其他用户的nginx图像以查看变体:)

这个想法是在前台模式下启动nginx。

  • 关键是https://github.com/nginxinc/docker-nginx/blob/master/stable/stretch/Dockerfile中的CMD指令:`CMD [“ nginx”,“ -g”,“ daemon off;”] ` (2认同)