Docker и контейнеризация: основные концепции и использование
Docker упаковывает приложения в контейнеры для согласованного и переносимого развёртывания. Это руководство охватывает основы Docker, написание Dockerfile и управление контейнерами.
Обновлено:Что такое Docker?
Docker — это платформа, которая упаковывает приложения и их зависимости в контейнеры. Контейнеры — это лёгкие, изолированные среды выполнения.
VM vs Container: виртуальные машины запускают полную операционную систему (ГБ). Контейнеры разделяют ядро ОС хоста и занимают МБ.
Согласованность: решает проблему 'на моей машине работает'. Среды разработки, тестирования и производства используют один и тот же контейнер.
Переносимость: контейнеры работают на любой платформе, поддерживающей Docker (Linux, Windows, Mac, cloud).
Основные концепции Docker
Image: шаблон для контейнера. Хранится в виде слоёв только для чтения. Собирается из Dockerfile.
Container: запущенный экземпляр образа. Каждый контейнер работает как изолированный процесс.
Dockerfile: текстовый файл, определяющий, как собрать образ. Содержит инструкции, такие как FROM, RUN, COPY, CMD.
Registry: репозиторий, хранящий и распространяющий образы. Docker Hub — самый популярный публичный registry.
Volume: хранилище для сохранения данных контейнера. Данные сохраняются даже при удалении контейнера.
Написание Dockerfile
FROM node:18-alpine: используйте Node.js 18 (Alpine Linux) как базовый образ. Alpine — это образ базы небольшого размера.
WORKDIR /app: установите рабочую директорию на /app. Все последующие команды выполняются в этой директории.
COPY package*.json ./: скопируйте package.json и package-lock.json. Установите зависимости с помощью RUN npm install.
COPY . .: скопируйте весь исходный код. Создайте production build с помощью RUN npm run build.
EXPOSE 3000: укажите, что контейнер слушает порт 3000. Определите команду для запуска при старте контейнера с помощью CMD ["npm", "start"].
Основные команды Docker
docker build -t myapp:1.0 .: соберите образ из Dockerfile. Присвойте тег образу с помощью -t (имя:версия).
docker run -p 3000:3000 myapp:1.0: запустите контейнер. Сопоставьте порт хоста с портом контейнера с помощью -p.
docker ps: выведите список запущенных контейнеров. docker ps -a: выведите все контейнеры (включая остановленные).
docker stop <container_id>: остановите контейнер. docker rm <container_id>: удалите контейнер.
docker images: выведите список локальных образов. docker rmi <image_id>: удалите образ.
Docker Compose
Docker Compose — это инструмент для определения и управления мультиконтейнерными приложениями. Настраивается с помощью файла docker-compose.yml.
Сервисы: каждый сервис — это контейнер. Определите сервисы, такие как web (frontend), api (backend), db (база данных).
Volumes: определите volumes для сохранения данных. networks: создайте сети для межсервисной коммуникации.
docker compose up: запустите все сервисы. docker compose down: остановите и удалите все сервисы.
docker compose up -d: запустите в фоновом режиме (detached mode). docker compose logs -f: следите за логами.
Лучшие практики
Маленькие образы: используйте базовые образы Alpine или distroless. Удаляйте build-зависимости из финального образа с помощью multi-stage build.
Layer caching: COPY зависимости (редко меняющиеся) сначала, код (часто меняющийся) позже. Это оптимизирует build cache.
.dockerignore: игнорируйте ненужные файлы (node_modules, .git, logs). Это уменьшает build context.
Безопасность: используйте non-root пользователя вместо root. Создайте пользователя с помощью RUN adduser --disabled-password appuser.
Health check: используйте инструкцию HEALTHCHECK для проверки здоровья контейнера. Docker автоматически перезапускает unhealthy контейнеры.