В Предыдущий пост Я охватил некоторые из услуг для Беги контейнеров на 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”