Ответ
В экосистеме Docker используются два основных конфигурационных файла для разных целей: Dockerfile для сборки образов и docker-compose.yml для управления многоконтейнерными приложениями.
1. Dockerfile
Это текстовый файл, содержащий набор инструкций для автоматической сборки образа Docker. Он описывает среду внутри одного контейнера: базовую ОС, зависимости, исходный код, переменные окружения и команду для запуска.
Ключевая команда: docker build
Пример Dockerfile для Python-приложения:
# 1. Устанавливаем базовый образ
FROM python:3.9-slim
# 2. Задаем рабочую директорию внутри контейнера
WORKDIR /app
# 3. Копируем файл зависимостей и устанавливаем их
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 4. Копируем остальной исходный код
COPY . .
# 5. Команда, которая будет выполняться при запуске контейнера
CMD ["python", "./main.py"]
2. docker-compose.yml
Это YAML-файл для определения и запуска многоконтейнерных приложений. Он описывает сервисы (контейнеры), сети для их взаимодействия, тома для хранения данных и другие параметры их совместной работы.
Ключевая команда: docker-compose up
Пример docker-compose.yml для веб-приложения и базы данных:
# Версия синтаксиса
version: '3.8'
# Определение сервисов (контейнеров)
services:
# Сервис веб-приложения
web:
# Собрать образ из Dockerfile в текущей директории
build: .
# Пробросить порт 8000 хоста на порт 80 контейнера
ports:
- "8000:80"
# Сервис базы данных
db:
# Использовать готовый образ PostgreSQL
image: postgres:13
# Переменные окружения для настройки базы данных
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
Сводка
| Критерий | Dockerfile |
docker-compose.yml |
|---|---|---|
| Назначение | Сборка одного образа | Управление несколькими контейнерами (сервисами) |
| Синтаксис | Набор инструкций | YAML |
| Команда | docker build |
docker-compose up |
Ответ 18+ 🔞
А, слушай, вот эта вся хуйня с Docker, она же, блядь, как два сапога — пара, но разные ноги! Один файл для того, чтобы собрать одну банду, а второй — чтобы всю эту ораву в поле вывести и заставить работать вместе. Сейчас разжую, как есть.
Вот смотри, есть у тебя Dockerfile. Это как, блядь, инструкция по сборке одного конкретного десантника. Ты в нём пишешь, из какого говна и палок его слепить: какую ОС взять, какие пакеты впихнуть, куда код скопировать и какую команду он должен орать, когда его разбудят.
Ключевая команда тут — docker build. Собрал образ — и сидит у тебя в загашнике одинокий воин, готовый к бою.
Вот, смотри, пример для какого-нибудь питонячего скрипта:
# 1. Берём голого питона на диете
FROM python:3.9-slim
# 2. Говорим: "Вот твоя хата, работай тут"
WORKDIR /app
# 3. Тащим список нужных библиотек и ставим их
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 4. Закидываем весь наш гениальный код
COPY . .
# 5. И вот он, священный приказ: "Запускайся, сука!"
CMD ["python", "./main.py"]
А теперь, внимание, docker-compose.yml — это уже, ёпта, не инструкция, а целый боевой план! Это когда тебе надо поднять не одного десантника, а целый взвод, чтобы они друг с другом общались, порты делили и в одном окопе сидели. Веб-сервер, база данных, кэш — вся эта весёлая компания.
Команда-матрёшка тут — docker-compose up. Один раз крикнул — и вся твоя микро-армия встаёт как один, блядь.
Вот как это выглядит в жизни:
# Версия, чтобы композ не охуел от твоего синтаксиса
version: '3.8'
services:
# Сервис первый — наше веб-приложение
web:
# "Собери-ка его по вот этому Dockerfile рядом"
build: .
# "Слушай порт 8000 на компе, а внутри у себя — 80-й"
ports:
- "8000:80"
# Сервис второй — база данных
db:
# "Не будем париться, возьми готового постгреса"
image: postgres:13
# Настройки, чтобы не светить паролями на всю деревню
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
Короче, резюмирую, чтобы в голове не еблось:
| Признак | Dockerfile |
docker-compose.yml |
|---|---|---|
| Зачем нужен? | Слепить один образ (контейнер) | Запустить и связать несколько контейнеров сразу |
| На что похож? | Рецепт одного блюда | Меню целого ужина со всеми закусками |
| Язык | Свои команды, типа FROM, RUN |
YAML, всё ровно и с отступами |
| Магическое слово | docker build |
docker-compose up |
Вот и вся философия. Хочешь одного солдата — пили Dockerfile. Хочешь устроить маневры с артиллерией и кавалерией — садись за docker-compose.yml. И да пребудет с тобой сила, и не ебёт тебя конфликт портов!