Где данные хранятся в приложении Multi-Container Dockerized?

Я пытаюсь создать пару образов Docker для различных веб-приложений на основе PHP, и сейчас я развертываю их в Elastic Beanstalk, используя Образец заявки предоставляется AWS в качестве шаблона. Это приложение содержит два определения контейнера Docker: одно для самого PHP, а другое для Nginx (в качестве обратного прокси-сервера).

Тем не менее, мне кажется немного странным, что исходный код моего PHP-приложения эффективно развёрнут вне изображения Docker. Как вы можете видеть из примера проекта Github, связанного выше, есть папка с именем php-app который содержит все исходные файлы PHP, но они не являются частью определения контейнера. Два контейнера — это просто изображения из Dockerhub. Таким образом, чтобы развернуть это, недостаточно просто загрузить Dockerrun.aws.json файл сам по себе; Вам нужно заархивировать этот файл вместе с исходными файлами PHP, чтобы все работало. На мой взгляд, это (приблизительно) может быть представлено этим визуальным деревом:

*
|
|\
|  - PHP Docker Container
|\
|  - Linked Nginx Container
\
- Volume that Beanstalk auto-magically creates alongside these containers

Поскольку модель здесь предполагает использование двух образов Docker, а также тома / файловой системы, независимой от этих образов Docker, я не уверен, как это работает. В голове я продолжаю думать, что было бы лучше / проще свернуть мои исходные файлы PHP и PHP в один общий контейнер Docker, вместо того, чтобы творить чудеса, которые делает Beanstalk, чтобы связать все вместе.

И я знаю, что Elastic Beanstalk действительно действует только как фасад для ECS в этом случае, когда создаются определения задач и тому подобное. У меня очень ограниченные знания ECS, но я бы хотел оставить свои параметры открытыми на случай, если я захочу вручную создать задачу ECS (например, с помощью Fargate) вместо того, чтобы полагаться на Beanstalk, чтобы сделать это для меня. И я обеспокоен тем, что Beanstalk делает что-то волшебное с этим томом, что затруднит ручную запись определения Задачи, если я захочу пойти по этому пути.

Какова наилучшая практика для упаковки PHP-приложений в среде Docker, когда обратный прокси-сервер (будь то Nginx, Apache или любой другой) находится в отдельном контейнере? Кто-нибудь может дать лучшее объяснение (или исправить любые недоразумения), как это работает? И как бы я сделал эквивалент того, что Beanstalk делает здесь, в ECS, для приложения PHP?

0

Решение

У вас есть несколько вариантов его построения.

Самый простой — иметь один сервисный ecs с двумя контейнерными веб-приложениями foreach (один контейнер для приложения php и один контейнер для nginx).
Единственный открытый порт в каждом сервисе — это порт nginx 80 с динамический порт ecs.
Каждая открытая служба должна иметь стихарь что перенаправить трафик на порт nginx.

В этом случае nginx не используется в качестве loadbalancer, только для фронтального веб-сервера.

Редактировать:

Ваш DockerFile для php-приложения должен быть таким:

...

# Add Project files.
COPY . /home/usr/src

...

А для режима dev ваш docker-compose:

version: '3.0'
services:
php:
build:.
depends_on:
...
environment:
...
ports:
...
tty: true
working_dir: /home/usr/src

volumes:
- .:/home/usr/src

Затем локально используйте docker-compose и редактируйте ваши файлы в контейнере.
И в производственном режиме файл был скопирован в контейнер во время сборки.

Это более понятно?

0

Другие решения

Других решений пока нет …