- Home »

Работа с Docker контейнерами — основы и советы
Если ты когда-нибудь мучился с настройкой окружения для разработки, деплоем приложений или просто хотел изолировать процессы на сервере — эта статья для тебя. Docker стал де-факто стандартом контейнеризации, и знание основ работы с ним сейчас критически важно для любого, кто работает с серверами. Разберём всё от установки до практических кейсов, которые реально пригодятся в повседневной работе.
Как это работает под капотом
Docker использует технологии Linux kernel — namespaces и cgroups — для изоляции процессов. В отличие от виртуальных машин, контейнеры разделяют ядро хостовой системы, что делает их значительно легче и быстрее. Каждый контейнер — это по сути изолированный процесс с собственной файловой системой, сетевыми интерфейсами и переменными окружения.
Архитектура Docker состоит из нескольких ключевых компонентов:
- Docker Engine — демон, который управляет контейнерами
- Docker Images — неизменяемые шаблоны для создания контейнеров
- Docker Containers — запущенные экземпляры образов
- Docker Registry — хранилище образов (Docker Hub, Harbor, etc.)
Быстрая установка и настройка
Для Ubuntu/Debian:
# Обновляем пакеты
sudo apt update
# Устанавливаем зависимости
sudo apt install apt-transport-https ca-certificates curl software-properties-common
# Добавляем официальный GPG ключ Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# Добавляем репозиторий Docker
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# Устанавливаем Docker
sudo apt update
sudo apt install docker-ce
# Добавляем пользователя в группу docker
sudo usermod -aG docker $USER
# Запускаем Docker
sudo systemctl start docker
sudo systemctl enable docker
Для CentOS/RHEL:
# Устанавливаем зависимости
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Добавляем репозиторий
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# Устанавливаем Docker
sudo yum install docker-ce
# Запускаем сервис
sudo systemctl start docker
sudo systemctl enable docker
Проверяем установку:
docker --version
docker run hello-world
Основные команды для ежедневной работы
Полный список команд, которые реально используешь каждый день:
# Работа с образами
docker images # Список образов
docker pull nginx:latest # Скачать образ
docker build -t myapp . # Собрать образ из Dockerfile
docker rmi image_id # Удалить образ
docker image prune -a # Очистить неиспользуемые образы
# Работа с контейнерами
docker ps # Запущенные контейнеры
docker ps -a # Все контейнеры
docker run -d --name web nginx # Запустить контейнер в фоне
docker exec -it web bash # Зайти в контейнер
docker logs web # Посмотреть логи
docker stop web # Остановить контейнер
docker rm web # Удалить контейнер
docker container prune # Очистить остановленные контейнеры
# Работа с томами
docker volume ls # Список томов
docker volume create myvolume # Создать том
docker volume rm myvolume # Удалить том
docker volume prune # Очистить неиспользуемые тома
# Работа с сетями
docker network ls # Список сетей
docker network create mynet # Создать сеть
docker network rm mynet # Удалить сеть
# Мониторинг
docker stats # Статистика использования ресурсов
docker top container_name # Процессы в контейнере
docker inspect container_name # Детальная информация о контейнере
Практические кейсы и примеры
Кейс 1: Веб-сервер с базой данных
Классический пример — развернуть WordPress с MySQL:
# Создаём сеть
docker network create wordpress-net
# Запускаем MySQL
docker run -d \
--name mysql \
--network wordpress-net \
-e MYSQL_ROOT_PASSWORD=rootpass \
-e MYSQL_DATABASE=wordpress \
-e MYSQL_USER=wpuser \
-e MYSQL_PASSWORD=wppass \
-v mysql_data:/var/lib/mysql \
mysql:5.7
# Запускаем WordPress
docker run -d \
--name wordpress \
--network wordpress-net \
-p 80:80 \
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_NAME=wordpress \
-e WORDPRESS_DB_USER=wpuser \
-e WORDPRESS_DB_PASSWORD=wppass \
-v wordpress_data:/var/www/html \
wordpress:latest
Кейс 2: Среда разработки
Dockerfile для Node.js приложения:
FROM node:16-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
EXPOSE 3000
USER node
CMD ["node", "server.js"]
Многоэтапная сборка для оптимизации размера:
# Этап сборки
FROM node:16-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Продакшн этап
FROM node:16-alpine AS production
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY --from=builder /app/dist ./dist
EXPOSE 3000
CMD ["node", "dist/server.js"]
Docker Compose для комплексных решений
Docker Compose позволяет описывать многоконтейнерные приложения в YAML-файле:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
- redis
environment:
- NODE_ENV=production
- DB_HOST=db
- REDIS_HOST=redis
volumes:
- ./logs:/app/logs
restart: unless-stopped
db:
image: postgres:13
environment:
- POSTGRES_DB=myapp
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
volumes:
- postgres_data:/var/lib/postgresql/data
restart: unless-stopped
redis:
image: redis:6-alpine
volumes:
- redis_data:/data
restart: unless-stopped
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./ssl:/etc/nginx/ssl
depends_on:
- web
restart: unless-stopped
volumes:
postgres_data:
redis_data:
Команды для работы с Compose:
docker-compose up -d # Запустить все сервисы
docker-compose down # Остановить и удалить контейнеры
docker-compose logs -f web # Посмотреть логи сервиса
docker-compose exec web sh # Зайти в контейнер
docker-compose build # Пересобрать образы
docker-compose pull # Обновить образы
Оптимизация и лучшие практики
Проблема | Плохая практика | Правильный подход |
---|---|---|
Размер образа | FROM ubuntu:latest | FROM alpine:latest или distroless |
Кэширование слоёв | COPY . . в начале | COPY package.json перед RUN npm install |
Безопасность | Запуск от root | USER non-root-user |
Логирование | Логи в файлы | Логи в stdout/stderr |
Секреты | Пароли в ENV | Docker secrets или внешние хранилища |
Оптимизация .dockerignore
node_modules
npm-debug.log
.git
.gitignore
README.md
.env
.nyc_output
coverage
.nyc_output
.vscode
.idea
Healthcheck в Dockerfile
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost:3000/health || exit 1
Мониторинг и отладка
Для мониторинга Docker контейнеров в продакшене рекомендую использовать:
- Prometheus + Grafana — для метрик
- ELK Stack — для логов
- cAdvisor — для мониторинга ресурсов контейнеров
Быстрый способ посмотреть что происходит:
# Статистика в реальном времени
docker stats --no-stream
# Использование дискового пространства
docker system df
# Детальная информация
docker system info
# События Docker
docker events --since 1h
# Анализ образа
docker history image_name
Альтернативы Docker
Решение | Плюсы | Минусы | Когда использовать |
---|---|---|---|
Podman | Не требует root, совместим с Docker | Меньше экосистемы | Высокие требования к безопасности |
LXC/LXD | Системные контейнеры | Сложнее в настройке | Изоляция на уровне ОС |
containerd | Легковесный, используется в K8s | Низкий уровень абстракции | Kubernetes кластеры |
rkt (deprecated) | Был хорош для безопасности | Больше не развивается | Не рекомендуется |
Интеграция с CI/CD
Docker отлично интегрируется с системами непрерывной интеграции. Пример для GitLab CI:
stages:
- build
- test
- deploy
build:
stage: build
script:
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
test:
stage: test
script:
- docker run --rm $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA npm test
deploy:
stage: deploy
script:
- docker pull $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
- docker tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA $CI_REGISTRY_IMAGE:latest
- docker-compose up -d
only:
- master
Безопасность Docker
Безопасность — критически важный аспект при работе с контейнерами:
- Сканирование образов на уязвимости с помощью Clair, Trivy или Docker Scout
- Минимальные базовые образы — используй Alpine, distroless или scratch
- Не запускай от root — создавай пользователя в Dockerfile
- Ограничивай ресурсы — используй –memory, –cpus
- Секреты — не храни в переменных окружения
# Сканирование образа на уязвимости
docker scan myapp:latest
# Запуск с ограничениями ресурсов
docker run -d \
--memory="512m" \
--cpus="1.0" \
--read-only \
--tmpfs /tmp \
--user 1000:1000 \
myapp:latest
Автоматизация и скрипты
Docker открывает множество возможностей для автоматизации. Полезные скрипты:
Очистка системы
#!/bin/bash
# cleanup-docker.sh
echo "Останавливаем все контейнеры..."
docker stop $(docker ps -q) 2>/dev/null || true
echo "Удаляем неиспользуемые контейнеры..."
docker container prune -f
echo "Удаляем неиспользуемые образы..."
docker image prune -a -f
echo "Удаляем неиспользуемые тома..."
docker volume prune -f
echo "Удаляем неиспользуемые сети..."
docker network prune -f
echo "Очистка завершена!"
docker system df
Бэкап томов
#!/bin/bash
# backup-volume.sh
VOLUME_NAME=$1
BACKUP_PATH=$2
if [ -z "$VOLUME_NAME" ] || [ -z "$BACKUP_PATH" ]; then
echo "Usage: $0
exit 1
fi
docker run --rm \
-v $VOLUME_NAME:/data \
-v $BACKUP_PATH:/backup \
alpine \
tar czf /backup/backup-$(date +%Y%m%d-%H%M%S).tar.gz -C /data .
echo "Backup completed!"
Интересные факты и нестандартные применения
Docker можно использовать не только для веб-приложений:
- Desktop приложения — можно запускать GUI приложения через X11 forwarding
- Игровые серверы — изолированные серверы Minecraft, CS:GO
- Тестирование — быстрое создание окружений для разных версий ОС
- Утилиты — превращение CLI утилит в сервисы
Пример запуска Firefox в контейнере:
docker run -d \
--name firefox \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-v $HOME/Downloads:/home/user/Downloads \
--device /dev/snd \
jess/firefox
Статистика и сравнение производительности
По данным исследований:
- Контейнеры запускаются в 10-100 раз быстрее виртуальных машин
- Overhead по производительности составляет менее 5%
- Плотность размещения в 2-3 раза выше по сравнению с VM
- Docker Hub содержит более 6 миллионов образов
Сравнение времени запуска:
Технология | Время запуска | Использование памяти | Изоляция |
---|---|---|---|
Docker контейнер | 1-5 секунд | 10-100 МБ | Процессы |
Виртуальная машина | 30-60 секунд | 512 МБ – 4 ГБ | Полная ОС |
Физический сервер | 2-10 минут | Весь RAM | Железо |
Полезные ресурсы
Официальная документация и полезные ссылки:
- Docker Documentation — официальная документация
- Awesome Compose — примеры docker-compose файлов
- Docker Cheat Sheet — шпаргалка по командам
- Awesome Docker — коллекция Docker ресурсов
Для полноценного изучения Docker рекомендую развернуть тестовый стенд. Можешь заказать VPS для экспериментов или выделенный сервер для продакшен-окружения.
Заключение и рекомендации
Docker кардинально изменил подход к разработке и деплою приложений. Основные преимущества:
- Консистентность — одинаковое поведение на разных окружениях
- Масштабируемость — легко горизонтально масштабировать
- Изоляция — приложения не влияют друг на друга
- Портативность — один раз собрал, везде работает
- Эффективность — оптимальное использование ресурсов
Когда использовать Docker:
- Микросервисная архитектура
- CI/CD пайплайны
- Разработка в команде
- Тестирование на разных окружениях
- Облачные деплои
Когда НЕ использовать Docker:
- Монолитные приложения с состоянием
- Приложения, требующие прямого доступа к железу
- Высоконагруженные базы данных (лучше bare metal)
- Простые статические сайты
Docker — это не серебряная пуля, но мощный инструмент, который должен быть в арсенале каждого системного администратора и DevOps инженера. Начни с простых примеров, изучи основы, и постепенно переходи к более сложным сценариям. Главное — практика, практика и ещё раз практика!
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.