【问题标题】:Can't access 8000 port of a Django project in docker无法在 docker 中访问 Django 项目的 8000 端口
【发布时间】:2017-07-25 07:46:20
【问题描述】:

我正在尝试将我的 Django 项目放入 docker 映像中。

这是我的Dockerfile

FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt -i https://pypi.douban.com/simple
ADD . /code/
EXPOSE 8000

然后我构建并运行这个 docker 容器:

docker run -i -t -p 8000:8000 e2 python3 manage.py runserver 8000
Performing system checks...

System check identified no issues (0 silenced).
July 25, 2017 - 16:28:00
Django version 1.11.3, using settings 'chaoYuBackend.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

但是当我在 Chrome 中访问 localhost:8000127.0.0.1:8000 时,我得到了 ERR_CONNECTION_REFUSED

这是我执行docker ps得到的,好像8000端口已经暴露了:

docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
71c0502de704        e2                  "python3 manage.py..."   54 seconds ago      Up 52 seconds       0.0.0.0:8000->8000/tcp   gallant_boyd

当我运行lsof -i :8000 时,出现错误:

我的 docker 版本是 17.06.0-ce, build 02c1d87,我使用的是 MacOS 10.12.6。

我的Dockerfile 有什么问题吗?如何在浏览器中访问我的 Django 站点?

提前致谢!

【问题讨论】:

  • 使用lsof -i :8000检查8000是否真的在使用。使用 sudo iptables-save 列出你的 iptables 规则。

标签: django docker dockerfile


【解决方案1】:

将docker的构建/运行命令改为:

docker run -i -t -p 8000:8000 e2 python3 manage.py runserver 0.0.0.0:8000

问题是你没有指定监听主机,所以直接设置为环回接口127.0.0.1,所以只能从容器本身访问。

因此,当您将主机设置为广播地址0.0.0.0 时,每个人都可以访问它。

【讨论】:

    【解决方案2】:

    我终于解决了这个问题!

    我猜这是由 homebrew docker 包引起的。

    通过官方dmg重新安装docker后,一切正常。 ?

    【讨论】:

      【解决方案3】:

      Docker 在随机的 localhost 端口上公开容器端口。看docker ps

      PORTS
      0.0.0.0:32769->8000/tcp
      

      Docker 在您的本地计算机上公开端口32769。您可以通过localhost:32769获取访问权限

      【讨论】:

        【解决方案4】:

        -P 选项将所有端口发布到主机接口。 Docker 将每个暴露的端口绑定到主机上的一个随机端口。 ...

        将“-P”替换为“-p 8000:8000”,然后重试。

        【讨论】:

        • 难以置信,还是 ERR_CONNECTION_REFUSED ?检查浏览器上的代理,检查端口,系统上的进程。运行 cmd 'curl localhost:8000',并在此处显示您的响应。
        • 我收到了curl: (7) Failed to connect to localhost port 8000: Connection refused
        猜你喜欢
        • 1970-01-01
        • 2019-06-01
        • 1970-01-01
        • 2017-01-03
        • 2015-01-12
        • 1970-01-01
        • 2019-04-29
        • 2016-12-06
        • 1970-01-01
        相关资源
        最近更新 更多