【问题标题】:Don't see Django in Docker container在 Docker 容器中看不到 Django
【发布时间】:2017-01-18 15:37:02
【问题描述】:

我想在一个简单的 Docker 容器中运行 Django。

首先,我使用 Docker 文件构建了我的容器。它并没有什么特别之处(只有 FROM、RUN 和 COPY 命令)

然后我用命令运行我的容器

docker run -tid -p 8000:8000 --name <container_name> <image>

进入我的容器:

docker exec -it <container_name> bash

运行 Django 服务器:

python manage.py runserver

得到:

Starting development server at http://127.0.0.1:8000/

但是当我转到 127.0.0.1:8000 时,我什么也看不到:

The 127.0.0.1 page isn’t working

没有 Nginx 或其他工作服务器。

我做错了什么?

更新 1(Dockerfile)

FROM ubuntu:16.04
MAINTAINER Max Malyshev <user>
COPY . /root
WORKDIR /root
RUN apt-get update
RUN apt-get install python-pip -y
RUN apt-get install postgresql -y
RUN apt-get install rabbitmq-server -y
RUN apt-get install libpq-dev python-dev -y
RUN apt-get install npm -y
RUN apt-get install mongodb -y
RUN pip install -r requirements.txt

【问题讨论】:

  • 让我们看看你的 Dockerfile
  • 尝试 0.0.0.0 代替 127.0.0.1

标签: django docker


【解决方案1】:

问题是您将开发服务器暴露给 Docker 容器内的127.0.0.1,而不是在主机操作系统上。 如果您访问容器的另一个控制台并向127.0.0.1:8000 发出http 请求,它将起作用。

关键是要确保 Docker 容器将开发服务器公开给所有 IPv4 地址,您可以使用 0.0.0.0 而不是 127.0.0.1 来做到这一点。

尝试运行以下命令来启动您的 Django 开发服务器:

python manage.py runserver 0.0.0.0:8000

此外,为了获得更多灵感,您可以查看这个工作 Dockerfile,用于使用内置开发服务器 https://github.com/Niklas9/django-unixdatetimefield/blob/master/Dockerfile 托管 Django 应用程序。

【讨论】:

    【解决方案2】:

    您需要在 Dockerfile 中公开端口 8000 并运行像 gunicorn 这样的 WSGI 服务器。如果您按照此处的步骤操作,您应该会很好...https://semaphoreci.com/community/tutorials/dockerizing-a-python-django-web-application

    【讨论】:

      【解决方案3】:

      我同意 Niklaus9 cmets。如果我可以建议增强尝试

      python manage.py runserver [::]:8000 
      

      不同之处在于 [::] 支持 ipv6 地址。

      我还注意到一些用于 mongodb 的包。如果您想在本地测试和开发,您可以创建 docker 容器并使用 docker compose 在您的机器上测试您的应用,然后再部署到 dev/stage/prod 环境。

      您可以在本教程http://programmathics.com/programming/docker/docker-compose-for-django/ 中了解有关如何在 docker 中设置链接到数据库后端的 Django 应用程序的更多信息(免责声明:我是该网站的创建者)

      【讨论】:

      • 不喜欢 docker compose。在我看来,它比使用 Makefile+Dokerfiles+docker network 更难处理。但也许我没有花足够的时间把它学好。
      • @Snobby 在一天结束的时候使用你觉得最舒服的工具和技术:)