Это определенно возможно, но не только с помощью инструментов Docker. Вам примерно необходимо:
- Сделайте так, чтобы ваша система CI пометила изображение именем ветки
- Пусть система CD выберет порт и развернет образ на этом порту
- Установите сетевой балансировщик нагрузки , который перенаправляет «обычные» порты для вашей службы ( например, , 80 для HTTP) на определенный порт, который вы развернули на
- Развертывание Маршрута 53 DNS-запись с именем ветви, указывающим на балансировщик нагрузки
- Когда вы заметите, что ветвь исчезла, отмените эти шаги
Я ссылался на определенные субпродукты AWS, так как вы указали EC2, но та же самая важная последовательность должна работать в любой среде (даже в локальной среде, использующей HAProxy и BIND на шагах 3 и 4). (Кроме того, единственное, что действительно специфично для Docker в этой последовательности, - это система упаковки и унифицированный способ указать порт хоста для конкретного экземпляра контейнера.)
Вы можете рассмотреть инструменты более высокого уровня для управления этими вещами. Ansible , например, имеет "модули" для запуска контейнеров Docker на удаленных хостах , создания AWS NLB и создания записей маршрута 53, Terraform может управлять облачными ресурсами (но поддерживать его состояние в соответствии с регулярным автоматическим повторным развертыванием может быть сложно).
Вы также можете рассмотреть структуру развертывания более высокого уровня. Эта последовательность развертывания в основном в точности соответствует тому, что вы делаете, например, в ECS Kubernetes - это еще большие инвестиции, но его объекты Service имеют, как стандартную опцию, возможность создавать балансировщики нагрузки и (с надстройкой) создавать DNS запись для вас ; но опять же, «протолкнуть образ и создать для него Deployment and Service» - это совершенно обычный способ развертывания чего-либо в Kubernetes, и нет ничего особенного в ветвях, отличных от заданных по умолчанию.