Docker:
Контейнеры без боли

Почему "у меня на машине работает" больше не аргумент. Углубленное погружение без лишней воды.

1. Проблема: "Ад Окружений"

Классика: вы написали код, у вас все работает. Заливаете на сервер — падает. Почему?

  • Разные версии библиотек: У вас Python 3.10, на сервере 3.8.
  • Разные пути: У вас конфиг в /home/user/, на сервере в /var/www/.
  • Скрытые зависимости: Вы поставили imagemagick год назад и забыли. На новом сервере его нет.

Решение: Мы упаковываем не только код, но и всю операционную систему (в миниатюре) вместе с ним.

2. VM vs Container (Аналогия)

Дом (VM)

Виртуальная машина.

Вы строите отдельный дом для каждого жильца. Свой фундамент, свои трубы, свое отопление.
Минусы: Дорого, долго строить, занимает много места.

Квартира (Docker)

Контейнер.

Вы селите жильцов в квартиры в одном большом доме. Фундамент и трубы (Ядро Linux) — общие.
Плюсы: Мгновенное заселение, дешево, изоляция стен.

Параметр Виртуальная Машина (VM) Контейнер (Docker)
Что внутри? Целая ОС (своё ядро) Только приложение (ядро общее)
Размер Гигабайты (ГБ) Мегабайты (МБ)
Время старта Минуты Секунды

3. Анатомия (Три кита)

Жизненный цикл любого контейнера. Кликни, чтобы узнать подробности.

1. Dockerfile (Рецепт)

Текстовый файл с инструкциями.

FROM python:3.9 (Берем основу)
COPY . /app (Кладем код)
RUN pip install (Ставим либы)
CMD python app.py (Команда запуска)

4. Магия Слоев (Layers)

Docker Image — это не монолитный файл. Это слоеный пирог (как слои в Photoshop).

  • Каждая команда в Dockerfile (FROM, RUN, COPY) создает новый слой.
  • Слои Read-Only (только для чтения).
  • Docker кэширует слои. Если вы поменяли только код, Docker не будет заново скачивать Ubuntu и ставить Python. Он возьмет готовые слои из кэша и пересоздаст только последний слой с кодом.
# Пример кэширования:
Step 1/4 : FROM python:3.9 ---> Using cache
Step 2/4 : RUN pip install flask ---> Using cache
Step 3/4 : COPY . . ---> [Changed] Building new layer...

5. Практика (Commands)

90% времени вы будете использовать эти 5 команд.

// 1. Собрать образ из Dockerfile

docker build -t my-app .

// 2. Запустить контейнер (самая важная!)

docker run -d -p 8080:80 --name web my-app

-d : Detached (в фоне)
-p : Port (порт 8080 компа -> порт 80 контейнера)
--name : Дать имя, чтобы не искать по ID

// 3. Что там внутри происходит? (Логи)

docker logs -f web

// 4. Зайти внутрь контейнера (как по SSH)

docker exec -it web bash

6. В чем подвох?

Я сказал, что контейнеры используют Ядро Хоста. Но что, если у вас Windows или macOS? У них же нет ядра Linux!

Правда: Docker Desktop на Windows/Mac втихаря запускает маленькую, скрытую виртуальную машину с Linux (WSL2 или HyperKit). Ваши контейнеры на самом деле крутятся в ней.