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 bash6. В чем подвох?
Я сказал, что контейнеры используют Ядро Хоста. Но что, если у вас Windows или macOS? У них же нет ядра Linux!
Правда: Docker Desktop на Windows/Mac втихаря запускает маленькую, скрытую виртуальную машину с Linux (WSL2 или HyperKit). Ваши контейнеры на самом деле крутятся в ней.