Когда я начал использовать Docker, я быстро понял, насколько он мощный. Представьте, настройку вашей среды разработки за минуты вместо часов или запуск приложений на разных машинах без классической проблемы “у меня все работает”.
Docker упрощает процесс создания, доставки и запуска приложений, упаковывая их в легкие, переносимые контейнеры. Независимо от того, являетесь ли вы разработчиком, специалистом по данным или системным администратором, умение владеть Docker может избавить вас от головной боли и сделать ваши рабочие процессы более эффективными.
В этом руководстве я проведу вас через основы: установку Docker, понимание ключевых концепций и запуск вашего первого контейнеризированного приложения. К концу вы не только узнаете, как работает Docker, но и получите практический опыт его использования, заложив прочный фундамент для изучения более сложных тем. Давайте начнем!
Что такое Docker?
Docker – это платформа для контейнеризации с открытым исходным кодом, которая упрощает развертывание приложений, упаковывая программное обеспечение и его зависимости в стандартизированный блок, называемый контейнером. В отличие от традиционных виртуальных машин, контейнеры Docker используют общее ядро ОС хоста, что делает их более эффективными и легковесными.
Контейнеры обеспечивают работу приложения одинаковым образом в средах разработки, тестирования и продакшена. Это уменьшает проблемы совместимости и повышает переносимость между различными платформами. Благодаря своей гибкости и масштабируемости Docker стал ключевым инструментом в современных рабочих процессах DevOps и разработке облачных приложений.
Официальный логотип Docker.
Установка Docker
Docker можно установить на различных операционных системах, включая Windows, macOS и Linux. Хотя основная функциональность остается одинаковой на всех платформах, процесс установки немного отличается в зависимости от системы. Ниже вы найдете пошаговые инструкции по установке Docker на вашей предпочитаемой операционной системе.
Установка Docker на Windows
- Загрузите Docker Desktop для Windows.
Загрузите установщик Docker Desktop для Windows
- Запустите установщик и следуйте инструкциям установки.
Установка Docker Desktop для Windows
- Включите интеграцию WSL 2, если вас об этом попросят.
- Проверьте установку, запустив
docker –version
в PowerShell.
Проверка версии Docker после установки через Powershell
5. Запустите приложение Docker Desktop из меню запуска.
Запуск приложения Docker Desktop на Windows
Установка Docker на macOS
- Загрузите Docker Desktop для Mac.
Загрузите установщик Docker Desktop для Mac
- Откройте скачанный файл
.dmg
и перетащите Docker в папку Applications. - Запустите Docker и завершите настройку.
- Проверьте установку, используя
docker –version
в терминале.
Установка Docker в Linux (Ubuntu)
- Обновите списки пакетов:
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 install docker-ce
- Проверьте установку:
docker –version
Основные понятия Docker
Теперь, когда у вас установлен Docker, вы, возможно, желаете сразу приступить к запуску контейнеров. Но прежде чем мы это сделаем, важно понять несколько ключевых концепций, лежащих в основе работы Docker. Эти концепции помогут вам более эффективно ориентироваться в Docker и избежать распространенных ошибок начинающих.
В центре Docker находятся образы, которые служат в качестве чертежей для контейнеров; контейнеры, которые являются запущенными экземплярами этих образов; и Docker Hub, централизованный репозиторий для обмена и управления образами.
Давайте рассмотрим каждый из этих концепций более детально.
Образы Docker
Образы Docker являются основными строительными блоками контейнеров. Они неизменяемы, являются только для чтения и содержат все необходимое для запуска приложения, включая операционную систему, код приложения, среду выполнения и зависимости.
Образы создаются с использованием Dockerfile
, который определяет инструкции для создания образа слой за слоем.
Образы могут храниться и извлекаться из реестров контейнеров, таких как Docker Hub.
Вот несколько примеров команд для работы с образами:
docker pull nginx
: Получить последний образ Nginx из Docker Hub.docker images
: Показать все доступные образы на локальной машине.docker rmi nginx
: Удалить образ с локальной машины.
Контейнеры Docker
Контейнер Docker является работающим экземпляром образа Docker. Контейнеры предоставляют изолированную среду выполнения, в которой приложения могут работать, не мешая друг другу или хост-системе. Каждый контейнер имеет свою файловую систему, сеть и пространство процессов, но использует ядро хоста.
Контейнеры следуют простому жизненному циклу, включая создание, запуск, остановку и удаление. Вот разбивка общих команд управления контейнерами:
- Создание контейнера:
docker create
илиdocker run
- Запуск контейнера:
docker start
- Остановка контейнера:
docker stop
- Перезапуск контейнера:
docker restart
- Удаление контейнера:
docker rm
Давайте рассмотрим практический пример. Следующая команда запускает контейнер Nginx в режиме detached (в фоновом режиме), отображая порт 80 внутри контейнера на порт 8080 на хост-машине:
docker run -d -p 8080:80 nginx
После выполнения этой команды Docker загрузит образ Nginx (если его еще нет), создаст контейнер и запустит его.
Для проверки всех запущенных и остановленных контейнеров:
docker ps -a
Это отобразит список всех контейнеров и подробности, такие как их статус и назначенные порты.
Хаб Docker
Хаб Docker – это облачная служба реестра для поиска, хранения и распространения образов контейнеров. Пользователи могут загружать настраиваемые образы в Хаб Docker и делиться ими публично или приватно.
Вот несколько команд для взаимодействия с Хабом Docker:
docker login
: Аутентификация в Хабе Docker.docker push my-image
: Загрузка настраиваемого образа в Хаб Docker.docker search ubuntu
: Поиск официальных и сообщественных образов.docker pull ubuntu
: Загрузка образа Ubuntu из Хаба Docker.
Новичок в контейнеризации? Получите прочные основы с курсом Понятия контейнеризации и виртуализации.
Запуск вашего первого контейнера Docker
Теперь, когда мы рассмотрели основные концепции Docker, пришло время приступить к действиям! Давайте начнем с запуска нашего первого контейнера, чтобы убедиться, что Docker установлен правильно и работает как ожидается.
Чтобы протестировать установку Docker, откройте PowerShell (Windows) или Терминал (Mac и Linux) и выполните:
docker run hello-world
Это загружает образ hello-world
из DockerHub и запускает его в контейнере.
Пример образа hello-world Docker
Теперь давайте пойдем еще дальше и запустим приложение реального мира — веб-сервер Nginx. Выполните следующую команду:
docker run -d -p 8080:80 nginx
Вышеуказанная команда выполняет следующее:
- Флаг
-d
запускает контейнер в отсоединенном режиме, что означает, что он запускается в фоновом режиме. - Флаг
-p 8080:80
отображает порт 80 внутри контейнера на порт 8080 на вашем локальном компьютере, что позволяет вам получить доступ к веб-серверу.
Когда команда успешно выполнится, откройте браузер и посетите: http://localhost:8080
Доступ к веб-серверу по адресу localhost:8080
Вы должны увидеть приветственную страницу Nginx по умолчанию, подтверждающую, что ваш веб-сервер работает внутри контейнера!
Вы также увидите контейнер, работающий в вашем Docker Desktop:
Контейнер Nginx работает на порту 8080
Создание вашего первого образа Docker
До сих пор мы использовали предустановленные образы из Docker Hub. Но что делать, если вам нужна индивидуальная среда, настроенная под ваше приложение? Вот тут-то и приходит на помощь создание собственного Docker-образа.
Создание Docker-образа включает в себя написание Dockerfile
, скрипта, который автоматизирует процесс сборки образа. Это обеспечивает согласованность и портативность в разных средах. Как только образ создан, его можно запустить как контейнер для выполнения приложений в изолированной среде.
В этом разделе мы рассмотрим основы написания Dockerfile, создания индивидуального образа и его запуска в качестве контейнера.
Основы Dockerfile
Файл Dockerfile
– это скрипт, содержащий серию инструкций, которые определяют, как создается образ Docker. Он автоматизирует процесс создания образа, обеспечивая согласованность в различных средах. Каждая инструкция в Dockerfile
создает новый слой в образе. Вот детальное описание простого Dockerfile для приложения Python Flask:
# Базовый образ, содержащий среду выполнения Python FROM python:3.9 # Установить рабочий каталог внутри контейнера WORKDIR /app # Скопировать файлы приложения с хоста в контейнер COPY . /app # Установить зависимости, перечисленные в requirements.txt RUN pip install -r requirements.txt # Определить команду для запуска приложения Flask при запуске контейнера CMD ["python", "app.py"]
В вышеприведенной команде:
-v my-volume:/app/data
примонтирует хранилищеmy-volume
к каталогу/app/data
внутри контейнера.- Любые данные, хранящиеся в
/app/data
, сохранятся даже если контейнер остановится или будет удален.
Разберем вышеуказанный Dockerfile:
FROM python:3.9
: Указывает базовый образ с предустановленным Python 3.9.WORKDIR /app
: Устанавливает/app
в качестве рабочего каталога внутри контейнера.COPY . /app
: Копирует все файлы из текущего каталога хоста в/app
в контейнере.RUN pip install -r requirements.txt
: Устанавливает все необходимые зависимости внутри контейнера.CMD ["python", "app.py"]
: Определяет команду для выполнения при запуске контейнера.
Построение и запуск образа
После определения Dockerfile вы можете создать и запустить образ, используя следующие команды:
Шаг 1: Создание образа
docker build -t my-flask-app .
Вышеуказанная команда:
- Использует текущую директорию (
.
) в качестве контекста сборки. - Читает
Dockerfile
и выполняет его инструкции. - Помечает (
-t
) полученный образ какmy-flask-app
.
Шаг 2: Запуск образа как контейнера
docker run -d -p 5000:5000 my-flask-app
Вышеуказанная команда:
- Запускает контейнер в фоновом режиме (
-d
). - Отображает порт 5000 внутри контейнера на порт 5000 на хосте (
-p 5000:5000
).
После запуска вы можете получить доступ к приложению Flask, перейдя по адресу http://localhost:5000
в браузере.
Тома Docker и сохраняемость
По умолчанию данные внутри контейнера Docker являются временными—после остановки контейнера или его удаления данные исчезают. Чтобы сохранить данные при перезапуске контейнера и обеспечить доступ к ним из разных контейнеров, Docker предоставляет тома, встроенный механизм для эффективного управления постоянным хранилищем.
В отличие от хранения данных в файловой системе контейнера, объемы управляются отдельно Docker, что делает их более эффективными, гибкими и легкими для резервного копирования.
В следующем разделе мы рассмотрим, как создавать и использовать объемы Docker для обеспечения сохранения данных в ваших контейнерах.
Создание и использование объемов Docker
Шаг 1: Создание объема
Прежде чем использовать объем, нам нужно создать его. Выполните следующую команду:
docker volume create my-volume
Это создаст именованный объем с именем my-volume
, который Docker будет управлять отдельно от любого конкретного контейнера.Шаг 2: Использование объема в контейнере
Теперь давайте создадим контейнер и примонтируем том внутри него:
docker run -d -v my-volume:/app/data my-app
В вышеприведенной команде:
-v my-volume:/app/data
монтирует хранилищеmy-volume
в директорию/app/data
внутри контейнера.- Любые данные, хранящиеся в
/app/data
, сохранятся даже если контейнер остановится или будет удален.
Compose Docker для многоконтейнерных приложений
До сих пор мы работали с приложениями, состоящими из одного контейнера, но многие приложения в реальном мире требуют нескольких контейнеров для совместной работы. Например, веб-приложение может потребовать наличие сервера бэкенда, базы данных и уровня кэширования — каждый из которых работает в своем собственном контейнере. Управление этими контейнерами вручную с помощью отдельных команд docker run
может быстро стать утомительным.
И вот где на помощь приходит Docker Compose.
Что такое Docker Compose?
Docker Compose – это инструмент, который упрощает управление многоконтейнерными приложениями. Вместо запуска нескольких команд docker run
вы можете определить целый стек приложения, используя файл docker-compose.yml
и развернуть его одной командой.
Написание файла Docker Compose
Теперь давайте создадим реальный пример – простое приложение Node.js, которое подключается к базе данных MongoDB. Вместо управления двумя контейнерами отдельно, мы определим их в файле docker-compose.yml
.
Вот как мы определяем наш многоконтейнерный набор в Docker Compose:
version: '3' services: web: build: . ports: - "3000:3000" depends_on: - database database: image: mongo volumes: - db-data:/data/db volumes: db-data:
Разберем файл выше:
version: '3'
: Указывает версию Docker Compose.services:
: Определяет отдельные сервисы (контейнеры).web:
: Определяет веб-приложение Node.js.database:
: Определяет контейнер базы данных MongoDB.volumes:
: Создает именованный том (db-data
) для постоянного хранения данных MongoDB.
Запуск многоконтейнерных приложений
Когда файл docker-compose.yml
готов, мы можем запустить весь стек приложения одной командой:
docker-compose up -d
Предыдущая команда запускает как веб-контейнер, так и контейнер базы данных в режиме отсоединения (-d
).
Чтобы остановить все сервисы, используйте:
docker-compose down
Это останавливает и удаляет все контейнеры, сохраняя тома и сетевые настройки.
Основы сетей Docker
До сих пор мы сосредотачивались на запуске контейнеров и управлении хранилищем, но что происходит, когда контейнерам необходимо обмениваться данными между собой? В большинстве приложений реального мира контейнеры не работают изолированно – им необходимо обмениваться данными, будь то веб-сервер общается с базой данных или микросервисы взаимодействуют между собой.
Docker предоставляет ряд вариантов сетевого взаимодействия для удовлетворения различных сценариев использования, от изолированных внутренних сетей до настроек с внешним доступом.
Хотите улучшить свои навыки работы с Docker? Запишитесь на Продвинутый курс Docker, чтобы изучить многоуровневые сборки, расширенные сетевые возможности и многое другое!
Что такое сетевое взаимодействие в Docker?
Сетевое взаимодействие в Docker – это встроенная функция, позволяющая контейнерам обмениваться данными между собой, как на одном хосте, так и на нескольких хостах в распределенной среде. Она обеспечивает изоляцию сети, сегментацию и варианты подключения, подходящие для различных сценариев развертывания.
Docker поддерживает несколько типов сетей, каждый из которых обслуживает различные сценарии использования:
- Мост (по умолчанию): Контейнеры на одном хосте взаимодействуют через внутреннюю виртуальную сеть. Каждый контейнер получает свой частный IP-адрес в пределах сети моста, и они могут обращаться друг к другу по именам контейнеров.
- Пример:
docker network create my-bridge-network
- Идеально подходит для запуска нескольких контейнеров на одном хосте, которые должны взаимодействовать безопасно, не выставляя сервисы наружу.
- Хост: Контейнеры используют сетевой стек хоста и напрямую используют IP-адрес и порты хоста.
- Пример:
docker run --network host nginx
- Полезно, когда требуется высокая производительность и не требуется изоляция сети, например, при запуске агентов мониторинга или приложений с низкой задержкой.
- Наложение: Позволяет взаимодействие контейнеров на разных узлах путем создания распределенной сети.
- Пример:
docker network create --driver overlay my-overlay-network
- Предназначен для оркестрированных развертываний, таких как Docker Swarm, где службы охватывают несколько узлов.
- Macvlan: Назначает уникальный MAC-адрес каждому контейнеру, делая его видимым как физическое устройство в сети.
- Пример:
docker network create -d macvlan --subnet=192.168.1.0/24 my-macvlan
- Используется, когда контейнерам нужен прямой доступ к сети, например, при интеграции устаревших систем или взаимодействии с физическими сетями.
Запуск контейнеров в пользовательских сетях
Давайте разберем, как настроить и использовать пользовательскую мостовую сеть для общения контейнеров.
Шаг 1: Создание пользовательской сети
Перед запуском контейнеров нам сначала нужно создать выделенную сеть:
docker network create my-custom-network
Эта команда создает изолированную сеть, к которой могут присоединяться контейнеры для межконтейнерного взаимодействия.
Шаг 2: Запуск контейнеров в сети
Теперь давайте запустим два контейнера и подключим их к нашей только что созданной сети:
docker run -d --network my-custom-network --name app1 my-app docker run -d --network my-custom-network --name app2 my-app
- Флаг
--network my-custom-network
присоединяет контейнер к указанной сети. - Флаг
--name
назначает уникальное имя контейнеру, что упрощает обращение к нему.
Теперь app11 и
app2 могут взаимодействовать, используя свои имена контейнеров. Вы можете проверить соединение, используя команду
ping` в одном из контейнеров:
docker exec -it app1 ping app2
Если всё настроено правильно, вы увидите ответ, подтверждающий, что контейнеры могут общаться.
Инспекция Docker-сетей
Для проверки конфигураций сети и подключенных контейнеров используйте:
docker network inspect my-custom-network
Эта команда предоставляет подробную информацию о сети, включая диапазоны IP, подключенные контейнеры и конфигурации.
Открытие и публикация портов
При запуске контейнеров, которые должны быть доступны снаружи, можно открывать определенные порты.
Например, для запуска веб-сервера Nginx и открытия его на порту 8080 вашего локального компьютера, используйте:
docker run -d -p 8080:80 nginx
Это отображает порт 80 внутри контейнера на порт 8080 на хосте, делая сервис доступным через http://localhost:8080.
Лучшие практики для сетей Docker
- Используйте пользовательские сети: Избегайте использования сети по умолчанию для продакшен-развертываний, чтобы уменьшить неожиданный доступ между контейнерами.
- Используйте обнаружение на основе DNS: Вместо жёсткого закодирования IP-адресов используйте имена контейнеров для обеспечения динамического обнаружения сервисов.
- Ограничьте внешнюю экспозицию: Используйте брандмауэры или сетевые политики для контроля доступа к сервисам.
- Мониторинг трафика: Используйте инструменты, такие как
docker network inspect
, Wireshark или Prometheus для анализа сетевого трафика и обнаружения аномалий. - Оптимизация оверлейных сетей: При развертывании в распределенной среде настройте оверлейные сети для снижения задержки, используя опции маршрутизации на уровне хоста.
Docker Best Practices and Next Steps
Теперь, когда вы освоили основы Docker, пришло время повысить свои навыки и применить bewt практики, которые помогут вам создавать безопасные, эффективные и поддерживаемые контейнеризованные приложения.
Следующие bewt практики помогут вам оптимизировать ваши рабочие процессы с Docker и избежать распространенных проблем.
- Используйте официальные базовые образы: Всегда предпочитайте официальные и хорошо поддерживаемые базовые образы, чтобы обеспечить безопасность и стабильность. Официальные образы оптимизированы, регулярно обновляются и меньше подвержены уязвимостям.
- Держите образы небольшими: Уменьшите размер образа, выбирая минимальные базовые образы (например,
python:3.9-slim
вместоpython:3.9
). Удалите ненужные зависимости и файлы для оптимизации хранения и времени загрузки. - Используйте многоэтапные сборки: Оптимизируйте Dockerfiles, разделяя сборочные и времени выполнения зависимости. Многоэтапные сборки гарантируют, что в конечный образ включаются только необходимые артефакты, что уменьшает размер и поверхность атаки.
- Правильно тегируйте изображения: Всегда используйте версионированные теги (например,
my-app:v1.0.0
) вместоlatest
, чтобы избежать неожиданных обновлений при загрузке изображений. - Сканируйте изображения на уязвимости: Используйте инструменты проверки безопасности, такие как
docker scan
,Trivy
илиClair
, чтобы выявить и устранить уязвимости безопасности в ваших изображениях перед развертыванием. - Управляйте переменными окружения безопасно: Избегайте хранения чувствительных учетных данных внутри изображений. Используйте секреты Docker, переменные окружения или внешние средства управления секретами, такие как AWS Secrets Manager или HashiCorp Vault.
- Используйте файлы .dockerignore: Исключите ненужные файлы (например,
.git, node_modules
,venv
), чтобы уменьшить размер контекста сборки и предотвратить случайное включение чувствительных файлов в образы. - Включите ведение журналов и мониторинг: Используйте инструменты, такие как Prometheus, Grafana и Fluentd для журналов контейнеров и мониторинга. Осматривайте журналы с помощью
docker logs
и включайте структурированное ведение журналов для лучшей наблюдаемости.
Как только вы освоите основы Docker, есть множество продвинутых тем для изучения. Вот несколько областей, которые стоит исследовать далее:
- Docker Swarm & Kubernetes: Изучите Docker Swarm (встроенное кластеризование) и Kubernetes (оркестровка корпоративного уровня с автомасштабированием и обнаружением сервисов) для оркестровки на уровне производства.
- Лучшие практики безопасности контейнеров: Для обеспечения безопасности контейнеризированных приложений следуйте рекомендациям CIS Docker Benchmark и реализуйте управление доступом на основе ролей (RBAC).
- CI/CD pipelines with Docker: Автоматизация сборки образов, сканирования безопасности и развертывания с использованием GitHub Actions, GitLab CI или Jenkins.
- Cloud-native development: Используйте Docker с облачными платформами, такими как AWS ECS, Azure Container Instances и Google Cloud Run для масштабируемых и управляемых развертываний.
- Data persistence strategies: Для оптимального управления хранилищем понимайте различия между Docker-томами, привязывающими монтированиями и tmpfs.
Conclusion
Докер изменил способ, которым разработчики создают, отправляют и запускают приложения, делая его неотъемлемым инструментом для современной разработки программного обеспечения.
В этом учебнике мы рассмотрели:
- Что такое Докер и почему он важен
- Как установить и запустить свой первый контейнер
- Основные понятия, такие как образы, контейнеры и сети
- Постоянное хранилище с помощью томов Докера
- Много-контейнерные приложения с Docker Compose
- Лучшие практики безопасности, производительности и масштабируемости
Но это только начало! Если вы хотите углубить свои знания Docker, вы можете пройти курс Введение в Docker для начинающих. Для более глубоких знаний вы можете пройти курс Docker для средне-уровневых специалистов, который охватывает многослойные сборки, инструменты сетевого взаимодействия Docker и Docker Compose. Наконец, вы также можете получить сертификат Docker, ознакомьтесь с Полным руководством по сертификации Docker (DCA) на 2025 год, если заинтересованы!