【问题标题】:Adding nginx to my dockerized Django application将 nginx 添加到我的 dockerized Django 应用程序
【发布时间】:2020-11-10 22:33:50
【问题描述】:

我已成功地将 gunicorn 添加到我的 Dockerized Django 应用程序中。我无法将 nginx 添加到组合中。 nginx 服务器几乎立即退出。任何帮助将不胜感激。

这是我的 docker-compose.yml

version: "3"

services:
  web:
      build: 
          context: .
          args:
            HTTP_PROXY: http://amec.zscaler.company.com:9480
            HTTPS_PROXY: http://amec.zscaler.company.com:9480
      image: django_web 
      container_name: django_web  
      expose: 
        - "8000"
  nginx:
      build: ./nginx
      ports:
        - 1337:80
      depends_on:
        - web

这是我的 Dockerfile:

FROM python:3.6

ENV PYTHONUNBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE 1

ARG HTTP_PROXY
ARG HTTPS_PROXY

COPY ./requirements.txt /requirements.txt
RUN pip install -r /requirements.txt

RUN mkdir /code
WORKDIR /code
ADD . /code/
RUN useradd user
USER user

CMD ["gunicorn", "django_web.wsgi:application", "--bind", "0.0.0.0:8000"]

这是我的 nginx/Dockerfile:

FROM python:3.6
COPY nginx.conf /etc/nginx/conf.d

这里是 nginx.conf:

upstream django_web{
    server web:8000;
}

server {
    listen 80;

    location / {
        proxy_pass http://django_web/;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }
}

构建和运行一切的命令:

sudo docker-compose -f docker-compose.cambridge.yml up -d

下一条命令:

sudo docker ps -a
    
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
16f4651047ec        django_nginx       "python3"                20 seconds ago      Exited (0) 18 seconds ago                 django_nginx_1
03a460153a9c        django_web         "gunicorn Django.…"      21 seconds ago      Up 19 seconds               8000/tcp            django_web

当我运行sudo docker exec -ti 16f4651047ec ping web 时,我得到了积极的回应。

在新构建之后,我运行:sudo docker logs 16f4651047ec 我得到:

/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration 

/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ 

/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh 

10-listen-on-ipv6-by-default.sh: Getting the checksum of /etc/nginx/conf.d/default.conf 

10-listen-on-ipv6-by-default.sh: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf 

/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh

/docker-entrypoint.sh: Configuration complete; ready for start up

在尝试浏览到 http://my-ip:1337/ 后,我运行:sudo docker logs 16f4651047ec 我得到与上面相同的内容加上这一行:

161.88.207.220 - - [23/Jul/2020:13:29:11 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36" "-"
p

在尝试浏览到 http://my-ip:1337/get_my_item/ 后,我运行:sudo docker logs 16f4651047ec 我得到与上面相同的内容,加上:

161.88.207.220 - - [23/Jul/2020:13:29:11 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36" "-"
2020/07/23 13:33:29 [error] 29#29: *3 "/usr/share/nginx/html/get_my_item/index.html" is not found (2: No such file or directory), client: 161.88.207.220, server: localhost, request: "GET /get_my_item/ HTTP/1.1", host: "10.228.91.5:1337"
161.88.207.220 - - [23/Jul/2020:13:33:29 +0000] "GET /get_my_item/ HTTP/1.1" 404 555 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36" "-"

【问题讨论】:

    标签: docker nginx docker-compose gunicorn


    【解决方案1】:

    你正在构建你的 nginx 镜像FROM python:3.6

    这是一个简单的 nginx:alpine Dockerfile 示例:

    FROM nginx:alpine
    COPY nginx.conf /etc/nginx/nginx.conf
    

    【讨论】:

    • 你在帖子中说你的 nginx/Dockerfile 看起来像这样:'FROM python:3.6'。基本上,您正在使用 python docker 映像来尝试启动 nginx 代理。也许这只是一个愚蠢的错字?
    • 如果您的 nginx Dockerfile 是 FROM python:3.6,那么您将在容器中拥有一个“粉碎”的 python 运行时。没有安装 nginx 怎么能启动 nginx。
    • 要排除故障,请列出所有容器:docker ps -a,复制行为不正常的容器 ID 并运行 docker logs <your-container-id>。此外,您可以使用docker inspect <your-container-id> 获取有关容器的更多信息
    • 您的代理通行证是proxy_pass http://127.0.0.1,应该是proxy_pass http://django
    • 啊,我也错过了,谢谢。现在,当我浏览到 localhost:1337 时,我进入了 Welcome to nginx 页面,而不是我的 Web 应用程序。显然我错过了一些其他配置,但我不知道是什么。
    【解决方案2】:

    我不得不把我的 nginx:alpine Dockerfile 改成这个

    FROM nginx:alpine 
    RUN rm -f /etc/nginx/conf.d/default.conf COPY
    nginx.conf /etc/nginx/conf.d/default.conf
    

    【讨论】:

      猜你喜欢
      • 2021-12-01
      • 2020-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2017-06-14
      • 2019-04-20
      相关资源
      最近更新 更多