我尝试过关于对我的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
我创建我的图像:
docker build -t myImage .
当我运行它:
docker run -p 81:80 myImage
它似乎停止了:
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
我希望这个端口81-> 80运行,但事实并非如此.运行
docker start 90e
好像什么也没做.
我也试过直接输入它
docker run -t -i -p 81:80 myImage /bin/bash
从这里我可以开始服务
service nginx start
从另一个标签我可以看到它按预期工作(也在我的浏览器中):
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
所以我认为我的Dockerfile出错了?任何人都可以帮我解决这个问题,我对Docker很陌生.谢谢!
解决方案:基于Ivant的答案,我找到了另一种在前台启动nginx的方法.我的Dockerfile CMD现在看起来像:
CMD /usr/sbin/nginx -g "daemon off;"
Ben Creasy.. 81
截至目前,官方的nginx图像使用它来运行nginx(参见Dockerfile):
CMD ["nginx", "-g", "daemon off;"]
就我而言,这足以让它正常启动.网上有教程提示更难实现的方法,但上面看起来很干净.
使用docker-compose:
要按照推荐的解决方案,添加到docker-compose.yml:
command: nginx -g "daemon off"
我还发现我可以简单地添加到nginx.conf:
daemon off;
...并继续在docker-compose.yml中使用:
command: service nginx start
...虽然它会使配置文件在docker之外变得不那么便携.
只要您指定的命令或命令行正在运行CMD
,Docker容器ENTRTYPOINT
就会运行.在您的情况下,service
命令立即完成,整个容器关闭.
解决此问题的一种方法是直接从命令行启动nginx(确保不将其作为守护程序运行).
另一个选择是创建一个小脚本,启动服务然后永远睡眠.就像是:
#!/bin/bash service nginx start while true; do sleep 1d; done
并运行此而不是直接运行该service
命令.
第三种选择是使用类似runit或类似程序的东西,而不是普通服务.
截至目前,官方的nginx图像使用它来运行nginx(参见Dockerfile):
CMD ["nginx", "-g", "daemon off;"]
就我而言,这足以让它正常启动.网上有教程提示更难实现的方法,但上面看起来很干净.
Docker是官方和用户映像的很好索引。当您想做某事时,很有可能已经有人做过;)
只需在index.docker.io上搜索“ nginx”,您就会看到,有一个官方的nginx图像:https ://registry.hub.docker.com/_/nginx/
那里有完整的指南,可帮助您启动Web服务器。
随时查看其他用户的nginx图像以查看变体:)
这个想法是在前台模式下启动nginx。