Полное руководство по Docker Compose
Перестаньте запускать команды Docker вручную для каждого сервиса.
Если вы разрабатываете современное приложение, скорее всего, оно включает фронтенд, бэкенд, базу данных и кэш. Запуск каждого компонента по отдельности — это медленно и чревато ошибками.
Docker Compose решает эту проблему. Вы описываете весь свой стек в одном YAML-файле и запускаете всё одной командой.
Основы
- Без Compose: вы запускаете четыре отдельные команды для четырех контейнеров.
- С Compose: вы запускаете
docker compose up, и всё запускается.
Важные концепции
• Services (Сервисы): Каждый сервис представляет собой контейнер. Вы можете использовать build для своего собственного кода или image для готовых инструментов, таких как PostgreSQL или Redis.
• Port Mapping (Проброс портов): Используйте формат HOST:CONTAINER. Это связывает порт вашего компьютера с портом контейнера.
• Environment Variables (Переменные окружения): Используйте environment для простых значений или env_file, чтобы хранить секреты в отдельном файле .env.
• Volumes (Тома): Используйте тома, чтобы обеспечить сохранность данных. Без томов данные вашей базы данных исчезнут при остановке контейнера.
• Networks (Сети): Compose создает сеть автоматически. Контейнеры взаимодействуют друг с другом, используя имена своих сервисов вместо localhost.
• Depends_on: Этот параметр задает порядок запуска. Он указывает Docker запустить базу данных перед бэкендом. Обратите внимание, что он не ждет полной готовности базы данных.
Советы для собеседований
- Когда использовать
build, а когдаimage? Используйтеbuildдля вашего собственного приложения. Используйтеimageдля готовых инструментов из Docker Hub. - Как контейнеры взаимодействуют друг с другом? Они используют имена сервисов в качестве имен хостов внутри сети Docker.
- Как избежать потери данных? Всегда используйте именованные тома (named volumes) для баз данных.
- Как работать с секретами? Никогда не прописывайте их в коде (hardcode). Используйте файл
.env.
Распространенные ошибки, которых следует избегать
- Использование тега
latest: Это приводит к неожиданным обновлениям. Используйте конкретные версии, напримерpostgres:16. - Использование
localhost: Контейнеры не видят друг друга черезlocalhost. Используйте имя сервиса. - Отсутствие healthchecks: Используйте проверки состояния (healthchecks), чтобы отслеживать, действительно ли ваш сервис готов к работе.
Источник: https://dev.to/adityaguptareal/docker-compose-complete-guide-1gac