Дано
Хост для проектов.
БД контейнер одна штука. Хотя я бы взял на каждый проект отдельно. Так легче правами к базе рулить.
По образу на каждое окружение. (Пхп, питон). Обновление кода через гит. Обновление базы через миграции.
1. Запускаем jwilder/nginx-proxy на хосте чтобы по быстрому добавлять новые проекты с привязкой домена и ставим питон на хост.
2. Делаем docker-compose file в корне проекта для разворачивания инфроструктуры проекта. (Контейнеры с окружением и Никс)
3 пишем на ансибл сценарий обновления обновления проекта (гит пулл, запуск миграции, рестарт компос)
4 собираем контейнер с gitlab runner в котором установлен ансибл и добавлены ключи для хоста. Определяем для gitlab_ci для допустим мастер ветка после тестов запускает ансибл
5 Профит
Зачем дженкинс? Для него 4 пункт такой же.
П.с собирайте свои контейнеры на alpine и делайте docker squash