Рубрики
Без рубрики

Развертывание контейнеров к производству с террафом и AWS Fargate – контейнеризация

В предыдущем посте я охватил некоторые из услуг, доступных для запуска контейнеров на AWS. Кроме того, я … Теги с докером, Питоном, Джанго, AWS.

В Предыдущий пост Я охватил некоторые из услуг для Беги контейнеров на AWS Отказ Кроме того, я представил Террафом , инструмент для объявления и предоставления этих услуг с использованием кодов. На этот раз я собираюсь создать проект, чтобы бежать на Докер Либо локально и в производстве, используя практически одинаковую конфигурацию.

Хотя у меня есть больше опыта с PHP Я собираюсь обеспечить Отдых API Написано в Python ( Django ), так как я работаю с этим в последнее время. Пожалуйста, не сосредотачивайтесь на самом приложении; Это написано только ради этого поста. Кроме того, я уверен, что вы можете применить те же принципы, которые я буду использовать здесь для любого языка или структуры. Итак, давайте принесем руки грязные!

Настройка местной среды

Во-первых, давайте настроим локальную среду для бега с докером. Таким образом, мы окажемся с окружающей средой для работы с одинаковым для производства. Для этого мы будем использовать Docker Compose Отказ Создайте новый файл под названием Docker-Compose.yml В корневом каталоге:

version: '3.7'

volumes:
  postgres-data:
    driver: local

services:
  django:
    build: .
    volumes:
      - .:/usr/local/app
    ports:
      - 8000:8000
    depends_on:
      - database

  database:
    image: postgres:11-alpine
    volumes:
      - postgres-data:/var/lib/postgresql
    environment:
      POSTGRES_USER: wannajob
      POSTGRES_PASSWORD: wannajob
      POSTGRES_DB: wannajob

Я не буду вносить в детали Docker-Compose.yml файл. Если вы хотите узнать больше об этом, Проверь это . Давайте теперь создадим Dockerfile Отказ Docker Compose будет использовать его для создания контейнера Django:

FROM python:3.6-slim-stretch

ENV PYTHONUNBUFFERED 1

WORKDIR /usr/local/app

RUN pip install --upgrade pip safety bandit pylint flake8 pytest coverage

COPY requirements.txt /usr/local/app/requirements.txt
RUN pip install -r requirements.txt

CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

Опять же, я не буду вдаваться в детали Dockerfile Отказ Если вы хотите узнать больше об этом, Проверь это . Все настроен, пришло время получить проект и работает:

$ docker-compose up -d

Наконец, запустите миграцию:

$ docker-compose run --rm --no-deps django python manage.py migrate

Видеть? Проект готов к местному развитию, используя Docker. Теперь легко запустить проект в любом месте. Вы можете поделиться со своей командой, и у всех будет такая же среда. Нет больше, – но это работает на моей машине! ».

Подготовка к производству

Теперь, когда проект работает на местном уровне, мы можем провести некоторое время и сделать несколько корректировок для подготовки его для производства. Пока локально мы используем Runserver Команда – легкая разработка веб-сервера – служить приложению, в производстве нам понадобится «настоящий» веб-сервер. Вот где Nginx. приходит в. Тем не менее, мы не можем служить приложению напрямую через Nginx, так как он не может обработать Python. Нам нужно что-то (A WSGI ), где nginx пересылает запрос, обрабатывает код Python, отправить обратно в nginx, а затем вернуть ответ на клиент. Для этого мы будем использовать Боевик Отказ

Первое, что нужно сделать, это обновить Dockerfile Отказ Мы будем использовать Docker Multi-Stopy Build , видеть:

##############
# Base Stage
##############
FROM python:3.6-slim-stretch AS base

ENV PYTHONUNBUFFERED 1

WORKDIR /usr/local/app

RUN pip install --upgrade pip gunicorn

COPY requirements.txt /usr/local/app/requirements.txt
RUN pip install -r requirements.txt

CMD ["gunicorn", "--bind", "0.0.0.0:8000", "--log-level", "warning", "--reload", "wannajob.wsgi:application"]


#####################
# Development Stage
#####################
FROM base AS development

RUN pip install --upgrade safety bandit pylint flake8 pytest coverage


####################
# Production Stage
####################
FROM base AS production

ENV DJANGO_SETTINGS_MODULE 'wannajob.settings.production'

COPY . /usr/local/app


#################
# Statics Stage
#################
FROM production AS statics

RUN python manage.py collectstatic --no-input --clear


############################
# Production (Nginx) Stage
############################
FROM nginx:1.17-alpine AS nginx

COPY ./docker/nginx/django.conf /etc/nginx/conf.d/default.conf

WORKDIR /usr/local/app

RUN mkdir statics
COPY --chown=nginx:nginx --from=statics /usr/local/app/static /usr/local/app/static

Тогда создайте Docker/Nginx/django.conf файл:

server {
  listen 80;

  location = /favicon.ico {
    access_log    off;
    log_not_found off;
  }

  location /static/ {
    alias /usr/local/app/static/;
  }

  location / {
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_pass http://django:8000;
  }
}

И, наконец, обновите Docker-Compose.yml , использовать nginx:

version: '3.7'

volumes:
  postgres-data:
    driver: local

services:
  django:
    build:
      context: .
      target: development
    volumes:
      - .:/usr/local/app
    depends_on:
      - database

  nginx:
    image: nginx:1.17-alpine
    volumes:
      - ./docker/nginx:/etc/nginx/conf.d
      - ./static:/usr/local/app/static
    ports:
      - 8000:80
    depends_on:
      - django

  database:
    image: postgres:11-alpine
    volumes:
      - postgres-data:/var/lib/postgresql
    environment:
      POSTGRES_USER: wannajob
      POSTGRES_PASSWORD: wannajob
      POSTGRES_DB: wannajob

Давайте восстановим приложение:

$ docker-compose up -d --build

Теперь проект подается через Nginx локально, нет никакой разницы от того, что мы будем делать в производстве в будущем. Кроме того, благодаря многоэтапной сборке Docker Multipe, у нас есть все необходимые инструменты разработки локально, но мы можем избавиться от них при работе в производстве, что приведет к более легким изображению.

Посмотрите на размер изображения разработки и производства:

$ docker images --filter reference=ianrodrigues/wannawork-app 
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
ianrodrigues/wannawork-app   production          29a4de730436        3 minutes ago       196MB
ianrodrigues/wannawork-app   development         cf3a9bf4ca10        2 hours ago         223MB

Довольно круто, да?!

Как вы могли видеть, просто настроить Docker для проекта для пропускания локально, а с несколькими модификациями вы можете использовать ту же настройку, готовую к производству. Благодаря Docker Multi-Stophing Build вы можете создавать гибкие доки, которые приведут к более легким изображениям, которые довольно подходят для производства.

Исходный код Используется в этом посте, доступно на GitHub. Если у вас есть вопросы или предложения, пожалуйста, дайте мне знать в комментариях. В следующем посте я настроив окружающую среду на AWS, используя террафору, оставайся настроенными!

Оригинал: “https://dev.to/ianrodrigues/deploying-containers-to-production-with-terraform-and-aws-fargate-containerization-2eb5”