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