如果暴露Dockerfile中的端口不生效怎么办?

时间:2018-12-17 22:45:40

标签: docker dockerfile

我有以下Dockerfile来运行Nginx服务器,但似乎无法让Docker通过我的主机公开端口80,因此我可以从外部访问它:

FROM ubuntu:latest
EXPOSE 80
RUN apt-get update
RUN apt-get -y install apt-utils
RUN apt-get -y dist-upgrade
RUN apt-get -y install nginx 
CMD service nginx start

如果我在构建映像 docker run -p 80:80 -d nginxserver 后运行以下命令,则可以使正确的全局设置生效,但是我新创建的Docker容器不能持久运行,因此它片刻之后退出。

如果我尝试 docker run -it /bin/bash -d nignxserver ,这将允许我的Docker容器工作,但是我将无法连接到主机外部的Nginx服务器。

如果我尝试 docker run -p 80:80 -it /bin/bash -d nignxserver ,它将失败,并显示以下错误消息:

  

docker:来自守护程序的错误响应:OCI运行时创建失败:   container_linux.go:348:启动容器进程引起“执行:   \“-it \”:在$ PATH中找不到可执行文件“:未知。

这里正确的解决方案是什么?

2 个答案:

答案 0 :(得分:1)

如果您根本不打算自定义图片,最好的解决方案就是使用standard nginx image

如果要编写自定义图像,则应大致假定service之类的命令不起作用。您显示的图像的CMD(假设它成功)尝试将nginx作为后台服务启动;一旦在后台启动,容器的主要过程就完成了,并且容器退出了。 CMD通常需要启动容器在前台运行 的单个进程。

对于您的各种docker run回转,选项始终以相同的顺序出现:

docker run \
  -d -p 80:80 \           # docker-specific options
  nginxserver \           # the image name
  nginx -g 'daemon off;'  # the command to run and its options

如果您指定了运行而不是主容器进程的替代命令(例如/bin/bash),并且如果该容器通常会运行网络服务器,那么您将获得外壳程序。 /bin/bash是命令,而不是-it的参数;同样的细分是

docker run \
  --rm -i -t \            # docker-specific options
  nginxserver \           # the image name
  /bin/bash               # the command to run and its options 

答案 1 :(得分:1)

您需要运行--privileged才能监听1024以下的端口。

此外,service nginx start立即存在(David Maze对此进行了报道)

您应该改用CMD nginx