1. Образ и контейнер это разные сущности:
Образ - это сущность, которая образуется после команды docker build, затем которая может быть помещена в регистри или в докер хаб. Можно провести аналогию с ISO образом ОС.
Контейнер - это сущность, которая образуется после команды docker run. Т.е. контейнер - это определенным образом запущенный образ. Можно из одного образа запустить множество контейнеров
Если поднимаетмся несколько контейнеров, то каждый из них является контейнером все зависимости от связи между ними, поскольку они сами по себе являются отдельными сущностями, которые можно нстроить так, что будут представлять из себя одно приложение с разными компонентами.
контейнер !== образ, а контейнер === сервисы, где сервис === образ
Контейнер != образ, факт.
Контейнер может быть сервисом, а может и не быть, все зависит от того, что внутри.
Сервис != образ. В данном случае нет понятия сервиса, это что-то внутри контейнера. Если там демон, принимающий запросы - это сервис. В широком смысле образ это образ и он ничему не равен.
2. Как будет удобно, не принципиально. Но раз уж есть compose, то через него будет удобнее
3. Нет причин не хранить docker-compose.yml в репе. Главное, чтобы в нем не было секретов. Все "ненужное" должно быть вынесено в переменные. Далее, как и сказал
Дмитрий, надо правильно доставить это на прод