Развертывание приложения django на контейнерах aws lightsail

ЧТО Я ПЫТАЮСЬ СДЕЛАТЬ И ЧТО Я СДЕЛАЛ

я пытаюсь развернуть приложение django через контейнер в amazon lightsail containers.

я нашел несколько руководств о том, как это сделать, но некоторые из них, кажется, усложняют все настолько, что файлы становятся нечитаемыми. в частности, все начинают использовать какую-то сложную базу данных, но я должен быть в порядке, используя стандартный db.sqlite3 из django.

наконец я наткнулся на этот учебник, который кажется достаточно понятным. я подумал, что могу просто пропустить часть Postgres и использовать все остальное. это сработало.

МОЯ КОНФИГУРАЦИЯ

Это мои файлы, которые управляют контейнерами. У меня есть многоконтейнерная установка. nginx действует как обратный прокси, который получает все запросы и обслуживает статические файлы и медиа. Другой контейнер - это приложение django. Я использую docker-compose для создания и запуска образов.

Dockerfiles

вот Dockerfile в моем приложении:

# pull official base image
FROM python:3.9.6

# set work directory its an absolute path
WORKDIR /usr/src/app

# set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# install dependencies
RUN pip install --upgrade pip
COPY ./requirements.txt .
RUN pip install -r requirements.txt

# copy project
COPY . .

а это Dockerfile для nginx:

FROM nginx:1.21

RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d

docker-compose

docker-compose используется для оркестровки двух в разработке:

version: '3.8'

services:
  web:
    build:
      context: ./sito
      dockerfile: Dockerfile
    command: gunicorn sito.wsgi:application --bind 0.0.0.0:8000
    volumes:
      - static_volume:/home/app/web/static
      - media_volume:/home/app/web/media
    expose:
      - 8000
    env_file:
      - ./.env.dev
  
  nginx:
    build: ./nginx
    ports:
      - 1337:80
    volumes:
      - static_volume:/home/app/web/static
      - media_volume:/home/app/web/media
    depends_on:
      - web

volumes:
  static_volume:
  media_volume:

nginx conf

Наконец, это nginx.conf:

upstream sito {
    server web:8000;
}

server {

    listen 80;

    location / {
        proxy_pass http://sito;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
        client_max_body_size 100M;
    }

    location /static/ {
        autoindex on;
        alias /home/app/web/static/;
    }

    location /media/ {
        autoindex on;
        alias /home/app/web/media/;
    }

}

МОЯ ПРОБЛЕМА

Теперь о развертывании в контейнере lightsail. Я не могу использовать docker-compose для развертывания всего, поэтому мне нужно воссоздать настройки, указанные там при создании контейнера на aws.

Я хочу использовать контейнеры, для которых требуется "дистрибутив", представляющий собой образ+контейнер. Мои образы были загружены на dockerHub.

Я создаю 2 контейнера,

Первый - nginx (с именем "nginx"), изображение взято с dockerHub после того, как я загрузил свою версию (так что это не оригинальный nginx). В моем docker-compose я указываю порты, внутренний - 80 и внешний - 1337. Хотя в меню я могу указать внешний порт, я не уверен, нужно ли мне указывать (или как) другой порт (80).


Второй контейнер - это приложение (с именем "sito"), образ также взят с dockerhub, куда я его загрузил. Мой docker-compose определяет команду, которая запускает gunicorn, заставляя его слушать порт 8000, который я могу поместить при создании контейнера, и выставить порт 8000.

Я также объявляю 3 переменные:

  • DJANGO_ALLOWED_HOSTS = localhost 127.0.0.1 [::1]
  • >
  • SECRET_KEY = mySecretKeyFromDjangoProject
  • .
  • DEBUG = 1

settings.py должен посмотреть на эти переменные и использовать их в django.

details of the distribution

Распространение не работает. Журналы не дают мне никаких подсказок о том, что делать. вот журналы двух контейнеров:

Nginx log

enter image description here

Самое загадочное для меня в этом журнале - хост не найден в upstream.

Журнал сайта

enter image description here

это еще хуже, так как здесь говорится только о том, что шляпа заняла слишком много времени.

Я очень новичок в развертывании, особенно с контейнерами, поэтому я, возможно, сделал много ошибок, и, к сожалению, я не могу найти никакого правильного объяснения того, как это работает, поскольку документация amazon ужасна (по моему мнению), и обычно люди пытаются развернуть с помощью экземпляра.

N.B. Я знаю, что тома, указанные в файлах docker-compose, не создаются двумя контейнерами, но я полагаю, что это не проблема, так как это может вызвать проблемы с обслуживанием статических файлов, но это должно быть в состоянии функционировать в любом случае. Вы можете спросить, в чем мой вопрос, но у меня его нет, поскольку я совершенно не знаю, что делать. Я полагаю, они могут быть следующими :

  1. Did i misunderstood something?
  2. Can you point me to some good tutorial about amazon lightsail containers?
  3. what do you think about aws containers?

PS: пожалуйста, не хороните меня в даунвотсах

спасибо за внимание и помощь.

Вернуться на верх