Home » Работа с Docker контейнерами — основы и советы
Работа с Docker контейнерами — основы и советы

Работа с 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 рекомендую развернуть тестовый стенд. Можешь заказать VPS для экспериментов или выделенный сервер для продакшен-окружения.

Заключение и рекомендации

Docker кардинально изменил подход к разработке и деплою приложений. Основные преимущества:

  • Консистентность — одинаковое поведение на разных окружениях
  • Масштабируемость — легко горизонтально масштабировать
  • Изоляция — приложения не влияют друг на друга
  • Портативность — один раз собрал, везде работает
  • Эффективность — оптимальное использование ресурсов

Когда использовать Docker:

  • Микросервисная архитектура
  • CI/CD пайплайны
  • Разработка в команде
  • Тестирование на разных окружениях
  • Облачные деплои

Когда НЕ использовать Docker:

  • Монолитные приложения с состоянием
  • Приложения, требующие прямого доступа к железу
  • Высоконагруженные базы данных (лучше bare metal)
  • Простые статические сайты

Docker — это не серебряная пуля, но мощный инструмент, который должен быть в арсенале каждого системного администратора и DevOps инженера. Начни с простых примеров, изучи основы, и постепенно переходи к более сложным сценариям. Главное — практика, практика и ещё раз практика!


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.

Leave a reply

Your email address will not be published. Required fields are marked