1. понимаешь неправильно. контейнер и образ (image) это разные сущности. нет, если ты используешь docker-compose три образа не сольются сами в один контейнер. docker-compose это просто способ автоматизировать немного рутины при работы с докером.
2. в целом верно. заранее делаешь .env c нужными переменными.
3. хранишь все в .env , его добавляешь в .gitignore , ему в гите делать нечего. docker-compose.yml в гите хранят, никаких проблем, все секретное в .env или подставится из CI/CD системы , Дженкинса или GitHub Actions например, в процессе деплоя. Это головняк девопса, а не разработчика.