Введение
Это исчерпывающее руководство по Docker предоставляет разработчикам и ИТ-специалистам глубокое погружение в технологию контейнеризации. Изучая основные концепции, архитектуру и практические стратегии реализации Docker, обучающиеся приобретут практические навыки в упаковке, развертывании и управлении приложениями в различных вычислительных средах.
Основы Docker
Что такое Docker?
Docker — это мощная платформа контейнеризации, которая революционизирует развертывание и разработку приложений. Как открытая технология, Docker позволяет разработчикам упаковывать, распространять и запускать приложения последовательно в различных вычислительных средах.
Основные концепции Docker
Контейнеры против виртуальных машин
graph TD
A[Физическое оборудование] --> B[Контейнеры Docker]
A --> C[Виртуальные машины]
B --> D[Легковесные]
B --> E[Общий ядро ОС]
C --> F[Тяжеловесные]
C --> G[Полная нагрузка ОС]
| Характеристика | Контейнеры Docker | Виртуальные машины |
|---|---|---|
| Использование ресурсов | Легковесные | Высокое потребление ресурсов |
| Время запуска | Секунды | Минуты |
| Уровень изоляции | Уровень процесса | Полная система |
Архитектура Docker
Docker использует архитектуру клиент-сервер с ключевыми компонентами:
- Демон Docker
- Клиент Docker
- Реестр Docker
- Образы Docker
- Контейнеры Docker
Основные команды Docker
Установка Docker на Ubuntu 22.04:
## Обновить пакеты системы
sudo apt update
## Установить зависимости Docker
sudo apt install apt-transport-https ca-certificates curl software-properties-common
## Добавить официальный ключ GPG Docker
curl -fsSL | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
## Настроить репозиторий Docker
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
## Установить Docker Engine
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
## Проверить установку Docker
sudo docker --version
Запуск первого контейнера
## Скачать образ Ubuntu
sudo docker pull ubuntu:latest
## Запустить интерактивный контейнер
sudo docker run -it ubuntu:latest /bin/bash
## Список запущенных контейнеров
sudo docker ps
## Список всех контейнеров
sudo docker ps -a
Управление образами
## Поиск образов
sudo docker search nginx
## Скачать образ
sudo docker pull nginx
## Список локальных образов
sudo docker images
Сетевое взаимодействие контейнеров
Типы сетей Docker
graph TD
A[Типы сетей Docker] --> B[Мостовая сеть]
A --> C[Сеть хоста]
A --> D[Отсутствует сеть]
A --> E[Наложенная сеть]
| Тип сети | Описание | Сценарий использования |
|---|---|---|
| Мостовая | По умолчанию | Взаимодействие изолированных контейнеров |
| Хоста | Прямой доступ к сети хоста | Приложения, критичные к производительности |
| Отсутствует | Без доступа к сети | Полностью изолированные контейнеры |
| Наложенная | Многохостовая сеть | Распределенные системы контейнеров |
Методы отображения портов
Базовое отображение портов
## Отображение порта контейнера 80 на порт хоста 8080
sudo docker run -p 8080:80 nginx
## Отображение нескольких портов
sudo docker run -p 8080:80 -p 3306:3306 myapp
Команды управления сетью
## Список сетей Docker
sudo docker network ls
## Создание пользовательской сети
sudo docker network create mynetwork
## Подключение контейнера к сети
sudo docker network connect mynetwork mycontainer
## Просмотр подробностей сети
sudo docker network inspect bridge
Расширенный сценарий сетевого взаимодействия
## Создание пользовательской мостовой сети
sudo docker network create --driver bridge isolated_network
## Запуск контейнеров в пользовательской сети
sudo docker run -d --name web1 --network isolated_network nginx
sudo docker run -d --name web2 --network isolated_network httpd
Стратегии изоляции сети
## Отключение внешнего доступа к сети
sudo docker run --network none mycontainer
## Прямое использование сети хоста
sudo docker run --network host mycontainer
Разрешение DNS в контейнерах
## Включение автоматического DNS между контейнерами
sudo docker run --name db-container mysql
sudo docker run --name app-container --link db-container:database myapp
Расширенные методы работы с Docker
Управление ресурсами контейнеров
graph TD
A[Управление ресурсами] --> B[Ограничения на использование процессора]
A --> C[Ограничения на использование памяти]
A --> D[Квоты на хранилище]
Пример распределения ресурсов
## Ограничение контейнера одним ядром процессора и 512 МБ памяти
sudo docker run -it --cpus=1 --memory=512m ubuntu /bin/bash
## Установка ограничений на память и swap
sudo docker run -it --memory=1g --memory-swap=2g ubuntu /bin/bash
Docker Compose для развертывания нескольких контейнеров
version: "3"
services:
web:
image: nginx
ports:
- "8080:80"
database:
image: postgres
environment:
POSTGRES_PASSWORD: mysecretpassword
Рекомендации по обеспечению безопасности
| Метод обеспечения безопасности | Реализация |
|---|---|
| Контейнеры без привилегий root | Использование директивы USER в Dockerfile |
| Файловая система только для чтения | Добавление флага :ro к монтированию тома |
| Ограничение возможностей контейнера | Использование --cap-drop и --cap-add |
Управление контейнерами с Docker Swarm
## Инициализация кластера Swarm
sudo docker swarm init
## Создание сервиса с репликами
sudo docker service create --replicas 3 --name web nginx
## Динамическое масштабирование сервиса
sudo docker service scale web=5
Расширенные конфигурации сети
## Создание пользовательской сети с подсетью
sudo docker network create \
--driver bridge \
--subnet 192.168.0.0/24 \
--gateway 192.168.0.1 \
custom_network
Мониторинг и ведение журналов контейнеров
## Журналы контейнеров в реальном времени
sudo docker logs -f container_name
## Просмотр метрик контейнера
sudo docker stats container_name
## Ограничение размера файла журнала
sudo docker run --log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
nginx
Методы оптимизации Dockerfile
## Многоступенчатая сборка
FROM maven:3.8.1-openjdk-11 AS build
COPY src /home/app/src
COPY pom.xml /home/app
RUN mvn -f /home/app/pom.xml clean package
FROM openjdk:11-jre-slim
COPY --from=build /home/app/target/app.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
Резюме
Docker представляет собой революционный подход к развертыванию программного обеспечения, предлагающий лёгкие, переносимые и эффективные решения для контейнеризации. Овладев основными концепциями, архитектурой и командами Docker, разработчики могут оптимизировать разработку приложений, повысить согласованность систем и улучшить масштабируемость и производительность инфраструктуры в целом.



