2017-08-25 143 views
0

我一直在关注Django和docker的教程,在这里使用nginx http://ruddra.com/2016/08/14/docker-django-nginx-postgres/。但我有另一个VM与8000暴露的端口,所以我把它改成8100,但留下另一个在8000docker撰写Django nginx

这是我撰写的文件:

version: '3' 
services: 
    nginx: 
    image: nginx:latest 
    container_name: ngnix01 
    ports: 
     - "8100:8000" 
    volumes: 
     - ./code:/code 
     - ./config/nginx:/etc/nginx/conf.d 
    depends_on: 
     - web 
    web: 
    build: . 
    container_name: django01 
    command: bash -c "python manage.py makemigrations && python manage.py migrate && gunicorn mydjango.wsgi -b 0.0.0.0:8000" 
    depends_on: 
     - db 
    volumes: 
     - ./code:/code 
    expose: 
     - "8000" 
    db: 
    image: postgres:latest 
    container_name: postgres01 

nginx的配置:

upstream web { 
    ip_hash; 
    server web:8000; 
} 

server { 

    location /static/ {  
     autoindex on;  
     alias /static/; 
    } 

    location/{ 
     proxy_pass http://web/; 
    } 
    listen 8000; 
    server_name localhost; 
} 

我得到错误当我码头 - 组成了

attaching to postgres01, django01, ngnix01 
django01 | Traceback (most recent call last): 
django01 | File "manage.py", line 8, in <module> 
ngnix01 | 2017/08/25 10:25:01 [emerg] 1#1: host not found in upstream "web:8000" in /etc/nginx/conf.d/django.conf:3 
django01 |  from django.core.management import execute_from_command_line 
ngnix01 | nginx: [emerg] host not found in upstream "web:8000" in /etc/nginx/conf.d/django.conf:3 
django01 | ModuleNotFoundError: No module named 'django.core' 
django01 exited with code 1 

这让我觉得nginx无法控制端口8000上的圆角独角兽?我认为我的撰写文件是正确的?左边的端口是端口暴露的,右边的端口是容器中的端口?

还是当使用多个图像时,他们彼此对话?

感谢

编辑: 包括dockerfile

#set base image 
FROM python:latest 
ENV PYTHONUNBUFFERED 1 

#install dependencies 

RUN sed -i "s#jessie main#jessie main contrib non-free#g" /etc/apt/sources.list 

RUN apt-get update -y \ 
    && apt-get install -y apt-utils python-software-properties libsasl2-dev python3-dev libldap2-dev libssl-dev libsnmp-dev snmp-mibs-downloader 

ENV APP_USER itapp 
ENV APP_ROOT /code 
RUN mkdir /code; 
RUN groupadd -r ${APP_USER} \ 
    && useradd -r -m \ 
    --home-dir ${APP_ROOT} \ 
    -s /usr/sbin/nologin \ 
    -g ${APP_USER} ${APP_USER} 

WORKDIR ${APP_ROOT} 

RUN mkdir /config 
ADD config/requirements.txt /config/ 
RUN pip install -r /config/requirements.txt 

USER ${APP_USER} 
ADD . ${APP_ROOT} 
+0

是的,你的文件似乎是正确的。如果您指定主机地址作为服务名称,则堆栈中的其他服务将尝试通过服务的公开(即内部8000)端口进行连接。 我想,django容器中的问题会导致Nginx丢失主机,因为django快速死亡。 码头工人有时候会让我有些毛骨悚然...... –

+0

你有没有为你的应用程序进行任何独立的测试? 您可以在Dockerfile中执行它们,然后在实际部署之前,您会看到是否在创建映像时发生任何错误。 类似这样:'运行python manage.py test --settings = app.settings.test -v2' –

回答

1

错误来了,因为没有安装在图像 中没有模块Django的你要添加的命令PIP安装-r requirements.txt或添加命令PIP命令安装Django:像网络的庆典节

version: '3'
services:
nginx: image: nginx:latest container_name: ngnix01 ports: - "8100:8000" volumes: - ./code:/code - ./config/nginx:/etc/nginx/conf.d depends_on: - web networks: - default web: build: . container_name: django01 command: bash -c "pip install Django && cd /home/docker/code python manage.py makemigrations && python manage.py migrate && gunicorn mydjango.wsgi -b 0.0.0.0:8000" depends_on: - db volumes: - ./code:/code expose: - "8000" networks: - default db: image: postgres:latest container_name: postgres01 networks: - default networks: default:

+0

您还必须在pip命令“cd/home/docker/code /”后添加该命令才能移动到您的代码目录 –

+0

我已经通过docker文件中的requirements.txt安装了Django,并且已经构建了这个 – AlexW

+0

但是从您提供的日志中,我看到了这个错误>>> django01 | ModuleNotFoundError:没有名为'django.core'的模块<<<这是因为你没有安装django或python在试图运行时找不到django模块 –

0

也许你需要你的三个集装箱连接到同一个网络。

尝试编辑您的码头工人,compose.yml这样的:

version: '3' 
services: 
    nginx: 
    image: nginx:latest 
    container_name: ngnix01 
    ports: 
     - "8100:8000" 
    volumes: 
     - ./code:/code 
     - ./config/nginx:/etc/nginx/conf.d 
    depends_on: 
     - web 
    networks: 
    - default 
    web: 
    build: . 
    container_name: django01 
    command: bash -c "python manage.py makemigrations && python  manage.py migrate && gunicorn mydjango.wsgi -b 0.0.0.0:8000" 
    depends_on: 
     - db 
    volumes: 
     - ./code:/code 
    expose: 
     - "8000" 
    networks: 
    - default 
    db: 
    image: postgres:latest 
    container_name: postgres01 
    networks: 
    - default 
networks: 
    default: