Docker для разработчиков: образы, контейнеры и Compose
Как разработчик, вы, вероятно, сталкивались с разочарованием из-за несоответствия окружений: «У меня это работает!» Docker решает эту проблему, упаковывая приложения в контейнеры. Это руководство объясняет Docker-образы, контейнеры и Compose, чтобы помочь вам создавать, доставлять и запускать приложения согласованно.
Что такое Docker?
Docker — это платформа для разработки, доставки и запуска приложений в контейнерах. Контейнеры — это легковесные, автономные, исполняемые пакеты, которые включают всё необходимое для запуска программного обеспечения: код, среду выполнения, системные инструменты, библиотеки и настройки.
Образы vs. контейнеры
Образ — это шаблон только для чтения с инструкциями для создания контейнера. Контейнер — это запускаемый экземпляр образа. Вы можете создать несколько контейнеров из одного образа, каждый из которых изолирован от других.
Работа с образами
Образы создаются из Dockerfile — текстового файла с инструкциями. Вот простой пример для Node.js:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Соберите образ с помощью:
docker build -t my-app .
Список образов: docker images
Запуск контейнеров
Запустите контейнер из образа:
docker run -d -p 3000:3000 --name my-container my-app
Это запускает контейнер в отсоединённом режиме (-d), сопоставляет порт 3000 и называет его my-container.
Список запущенных контейнеров: docker ps
Остановить контейнер: docker stop my-container
Удалить контейнер: docker rm my-container
Зачем использовать Docker Compose?
Когда ваше приложение зависит от нескольких сервисов (база данных, кэш и т. д.), управление отдельными контейнерами становится утомительным. Docker Compose позволяет определять и запускать многоконтейнерные приложения с помощью YAML-файла.
Пример файла Compose
Создайте docker-compose.yml:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_PASSWORD: example
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Запустить все сервисы: docker compose up -d
Остановить и удалить: docker compose down
Лучшие практики для разработчиков
- Используйте .dockerignore: исключите ненужные файлы (node_modules, .git), чтобы ускорить сборку.
- Многоэтапные сборки: делайте production-образы компактными, разделяя этапы сборки и выполнения.
- Используйте кэширование: упорядочивайте инструкции Dockerfile от наименее к наиболее часто изменяемым.
- Правильно тегируйте образы: избегайте использования
latestв production; используйте семантическое версионирование. - Сканируйте на уязвимости: используйте
docker scanдля проверки образов на известные проблемы.
Шпаргалка по основным командам
| Команда | Описание |
|---|---|
docker build -t name . | Собрать образ из Dockerfile |
docker run -p host:container image | Запустить контейнер и сопоставить порты |
docker ps -a | Показать все контейнеры |
docker exec -it container bash | Открыть оболочку внутри запущенного контейнера |
docker compose up | Запустить сервисы, определённые в файле Compose |
docker compose logs -f | Следить за логами всех сервисов |
FAQ
В чём разница между образом и контейнером?
Образ — это статический шаблон; контейнер — это запущенный экземпляр этого образа. Из одного образа можно создать множество контейнеров.
Когда следует использовать Docker Compose?
Используйте Compose, когда ваше приложение требует нескольких сервисов (например, веб-сервер, база данных, кэш), которые должны работать вместе. Это упрощает оркестрацию для разработки и тестирования.
Как сохранить данные в Docker?
Используйте тома (volumes) или bind mounts. Тома управляются Docker и хранятся в выделенной области; bind mounts связываются с директорией хоста. Оба варианта сохраняют данные при перезапуске контейнера.
Готовы оптимизировать свой рабочий процесс с Docker? Попробуйте наш Nginx Log Analyzer для быстрой отладки логов контейнеров.