我有以下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中找不到可执行文件“:未知。
这里正确的解决方案是什么?
答案 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