Основы Docker
Docker позволяет упаковать приложение со всеми зависимостями в контейнер, гарантировавший одинаковое поведение на любой машине.
▸Ключевые концепции
Dockerfile
1# Базовый образ2FROM node:18-alpine34# Рабочая директория5WORKDIR /app67# Копирование зависимостей8COPY package*.json ./910# Установка зависимостей11RUN npm ci --only=production1213# Копирование кода14COPY . .1516# Экспорт порта17EXPOSE 30001819# Запуск приложения20CMD ["node", "server.js"]
▸Многоэтапная сборка
1# Этап сборки2FROM node:18-alpine AS builder3WORKDIR /app4COPY package*.json ./5RUN npm ci6COPY . .7RUN npm run build89# Этап production10FROM node:18-alpine11WORKDIR /app12COPY --from=builder /app/dist ./dist13COPY --from=builder /app/node_modules ./node_modules14EXPOSE 300015CMD ["node", "dist/server.js"]
Управление образами
1# Сборка образа2docker build -t myapp:1.0 .34# Просмотр образов5docker images67# Тегирование8docker tag myapp:1.0 registry.example.com/myapp:1.0910# Публикация11docker push registry.example.com/myapp:1.01213# Удаление14docker rmi myapp:1.0
Управление контейнерами
1# Запуск контейнера2docker run -d -p 3000:3000 --name myapp myapp:1.034# Просмотр запущенных5docker ps67# Логи8docker logs -f myapp910# Exec — вход в контейнер11docker exec -it myapp sh1213# Остановка и удаление14docker stop myapp15docker rm myapp
Docker Compose
1version: '3.8'23services:4 web:5 build: .6 ports:7 - "3000:3000"8 environment:9 - DATABASE_URL=postgres://user:pass@db:5432/mydb10 depends_on:11 - db12 - redis13 networks:14 - app-network1516 db:17 image: postgres:15-alpine18 environment:19 POSTGRES_USER: user20 POSTGRES_PASSWORD: pass21 POSTGRES_DB: mydb22 volumes:23 - postgres_data:/var/lib/postgresql/data24 networks:25 - app-network2627 redis:28 image: redis:7-alpine29 networks:30 - app-network3132networks:33 app-network:3435volumes:36 postgres_data:
▸Команды Compose
1# Запуск всех сервисов2docker compose up -d34# Остановка5docker compose down67# Логи8docker compose logs -f web910# Пересборка11docker compose up -d --build
Сети
1# Создание сети2docker network create my-network34# Запуск контейнера в сети5docker run -d --network my-network --name web myapp67# Подключение существующего контейнера8docker network connect my-network redis
Тома
1# Именованный том2docker volume create my-data34# Маппинг каталога5docker run -v /host/path:/container/path myapp67# tmpfs (только в памяти)8docker run --tmpfs /app/temp myapp
Безопасность
docker scout cves myappBest Practices
Используйте .dockerignore
Многоэтапочные сборки
Минимизируйте слои образа
Используйте alpine-образы
Не запускайте от root
Заключение
Docker — это основа современной DevOps-практики. Контейнеризация обеспечивает консистентность окружений, упрощает деплой и масштабирование приложений.