То же приложение в docker создает конфигурацию, отображающую различные порты на экземпляре AWS EC2 - PullRequest
1 голос
/ 29 января 2020

Приложение имеет следующие контейнеры

  • php -fpm
  • nginx
  • локальный mysql
  • API приложения
  • контейнер данных

В процессе разработки создается много ветвей функций для добавления новых функций. такие как

  • app-feature1
  • app-feature2
  • app-feature3
  • ...

У меня есть экземпляр AWS EC2 для каждой ветви функций, работающий docker engine V.18 и docker compose для сборки и запуска стека docker, составляющего приложение php.

Для сохранения эксплуатационные расходы 1 AWS Экземпляр EC2 может иметь 3 ветви функций одновременно. Я думал, что должна быть пользовательская docker -композиция со специальным сопоставлением портов и docker тегом изображения для каждой ветви функций.

Цель этой конфигурации - иметь возможность протестировать 3 ветви функций и доступ к приложению через разные порты при экономии денег.

Я также думал об использовании docker сетей , сохраняя те же порты и используя nginx для перенаправления трафика c на различные docker сетевые порты.

Какие рекомендации вы даете?

Ответы [ 3 ]

2 голосов
/ 04 февраля 2020

Один простой способ, который я могу придумать в этом случае, это использовать файл .env для вашего docker -compose.

docker -compose.yaml файл будет выглядеть примерно так

...

ports:
 - ${NGINX_PORT}:80

...

ports:
 - ${API_PORT}:80

.env файл для каждого стека будет выглядеть примерно так

NGINX_PORT=30000
API_PORT=30001

и

NGINX_PORT=30100
API_PORT=30101

для различных проектов.

Примечание:

  • .env должен находиться в той же папке, что и ваш docker-compose.yaml.
  • Убедитесь, что все порты внутри * Файлы 1026 * не будут конфликтовать друг с другом. У вас могут быть какие-то соглашения, например, префикс для функций, например, у feature1 будет порт, начинающийся с 301, то есть 301xx.
  • Таким образом, ваш docker-compose.yaml может быть таким же обобщенным, как и вы c. может понравиться.
0 голосов
/ 26 февраля 2020

Оказывается, в решении задействованы возможности от docker -compose. В docker документах концепция называется Несколько изолированных сред на одном хосте

для достижения этого:

  1. Я использовал файл .env с очень многими переменами env. Основным из них является CONTAINER_IMAGE_TAG, который определяет идентификатор ветви git для идентификации стека.

  2. Отдельный файл docker -compose-dev определяет порты, теги изображений, дополнительные метаданные это относится к dev

  3. Наконец, использование --project-name в команде docker -compose позволяет использовать разные стеки.

пример docker -compose Bash функция, которая использует команду docker -compose

docker_compose() {
    docker-compose -f docker/docker-compose.yaml -f docker/docker-compose-dev.yaml --project-name "project${CONTAINER_IMAGE_TAG}" --project-directory . "$@"
}

Разделение должно выполняться в тегах изображения , имена контейнеров, имена сетей, имена томов и имя проекта.

0 голосов
/ 05 февраля 2020

Ты делаешь вещи сложнее, чем они должны быть. Ваше приложение в контейнере - используйте систему контейнеров.

ECS очень легко начать работу. Это json файл, который определяет ваше развертывание - в основном аналогично docker - compose (они на самом деле поддерживали создание файлов в какой-то момент, но не уверены, что эта функция осталась). Вы можете развернуть произвольное количество сервисов с разными образами контейнеров. Нам нравится использовать модуль terraform с тегом image в качестве параметра, но достаточно просто написать сценарий оболочки или что-то подобное.

Поскольку вы пытаетесь сэкономить, создайте единый балансировщик нагрузки приложения. каждое приложение получает имя хоста, а каждый контейнер получает подпуть. Для кратковременных развертываний ветвей функций вы можете даже развернуть их в Fargate и при этом не иметь постоянной стоимости сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...