Я пытаюсь создать пару образов 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?
У вас есть несколько вариантов его построения.
Самый простой — иметь один сервисный 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 и редактируйте ваши файлы в контейнере.
И в производственном режиме файл был скопирован в контейнер во время сборки.
Это более понятно?
Других решений пока нет …