代码之家  ›  专栏  ›  技术社区  ›  xorLogic

如果dockerfile中的端口暴露不起作用,我该怎么办?

  •  0
  • xorLogic  · 技术社区  · 6 年前

    我有以下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:启动容器进程导致“exec: \“-it\”:在$path中找不到可执行文件:未知。

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   David Maze    6 年前

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

    如果您正在编写自定义图像,则应该大致假定如下命令 service 只是不工作。您显示的图像的命令(假设成功)试图将nginx作为后台服务启动;一旦在后台启动,容器的主进程就完成,容器退出。命令通常需要启动容器运行的单个进程 在前景中 .

    就你的各种 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 )运行 而不是 主容器进程,如果容器通常运行一个网络服务器,您将得到shell。 /BI/BASH 是命令而不是参数 -it 同样的细目

    docker run \
      --rm -i -t \            # docker-specific options
      nginxserver \           # the image name
      /bin/bash               # the command to run and its options 
    
        2
  •  1
  •   Rawkode    6 年前

    你需要和 --privileged 监听1024以下端口。

    也, service nginx start 立即存在(这被大卫·梅兹覆盖)

    你应该用 CMD nginx