Docker 运行没有问题,但我无法从给定的 url 访问该站点

Docker runs without a problem but i cant reach the site from the given url

[2021-02-22 11:24:59 +0000] [1] [INFO] Starting gunicorn 20.0.4
[2021-02-22 11:24:59 +0000] [1] [INFO] Listening at: http://0.0.0.0:8000 (1)
[2021-02-22 11:24:59 +0000] [1] [INFO] Using worker: sync
[2021-02-22 11:24:59 +0000] [7] [INFO] Booting worker with pid: 7

当我打开 url 时,服务器似乎无法正常工作。我将 Django 用于网络应用程序。当我构建 docker 或使用

启动应用程序时它工作正常
python manage.py runserver

但是当我这样做的时候

docker run app

它不起作用。

Output

DOCKER 文件:

FROM python:3.8-slim-buster
EXPOSE 8000
ENV VAR1=10
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
COPY requirements.txt .
RUN python -m pip install -r requirements.txt
WORKDIR /app
COPY . /app
RUN useradd appuser && chown -R appuser /app
USER appuser
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app.wsgi"]

有效答案:

=> docker 运行 -p 8000:8000 app 然后从浏览器连接到 http://localhost:8000。

来自 Zeitounator。

我建议您为 运行 使用 docker-compose 并使用您的图像并设置您想要的任何环境变量。 docker-compose 文件的示例可能是这样的:

version: "3.8"

services:
  my_simple_site:
    image: my_simple_site:0.0.0
    container_name: my_simple_site
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8000:8000"
    environment:
      - GUNICORN_WORKER_NUM=1

您可以看到您可以传递环境变量的工人数 (GUNICORN_WORKER_NUM)。 之后 运行 你的应用程序在 Gunicorn 上使用配置文件。配置文件可能如下 python 所示。例如,我在名为 gunicorn.conf.py 的文件中创建了这个供以后使用:

import os

bind = "0.0.0.0:8000"
workers = os.getenv('GUNICORN_WORKER_NUM', 1)
timeout = 200
user = 'root'
directory = '/address/to/your/app'

之后,您可以像这样在 DockerFile 中使用它:

CMD ["gunicorn", "--config", "/address/to/cofingfile/gunicorn.conf.py", 
"app.wsgi"]

为了进一步改进,最好在您的项目中使用 supervisor 和 Nginx。