Docker для разработчиков: образы, контейнеры и Compose
Вы разработчик, и вы слышали о Docker. Возможно, вы даже пробовали его, но концепции образов, контейнеров и Compose кажутся размытыми. Или вы устали от "на моей машине работает" и хотите согласованную среду. Это руководство отсекает лишний шум и дает практическое понимание основных компонентов Docker и того, как эффективно их использовать.
Почему Docker для разработчиков?
Docker решает проблему несоответствия сред. Вместо установки зависимостей прямо на вашу машину вы упаковываете приложение и его зависимости в контейнер. Контейнеры работают одинаково везде: на вашем ноутбуке, на ноутбуке коллеги и в продакшене. Это устраняет расхождения в настройке и делает подключение к проекту тривиальным.
Образы: чертеж
Образ — это шаблон только для чтения. Он содержит код вашего приложения, среду выполнения, библиотеки и переменные окружения. Вы создаете образы из Dockerfile — текстового файла с инструкциями.
Вот простой Dockerfile для приложения на Node.js:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
Каждая инструкция создает слой. Слои кэшируются, поэтому пересборка происходит быстро, когда меняется только код. Образы хранятся в реестрах, таких как Docker Hub или частный реестр.
Контейнеры: запущенный экземпляр
Контейнер — это запускаемый экземпляр образа. Он изолирован, но использует ядро хост-ОС, что делает его легковесным. Вы запускаете контейнер с помощью docker run.
docker run -p 3000:3000 -d my-app
Это сопоставляет порт 3000 на хосте с портом 3000 в контейнере и запускает его в фоновом режиме. Контейнеры эфемерны: изменения теряются при удалении, если вы не используете тома.
Ключевые команды:
docker ps– список запущенных контейнеровdocker stop <container>– остановить контейнерdocker rm <container>– удалить контейнерdocker images– список образовdocker rmi <image>– удалить образ
Docker Compose: многоконтейнерные приложения
Реальные приложения часто требуют нескольких сервисов: веб-сервер, база данных, кэш. Docker Compose позволяет определять и запускать многоконтейнерные приложения с помощью одного YAML-файла.
Вот docker-compose.yml для приложения на Node.js с PostgreSQL:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgres://user:pass@db:5432/mydb
depends_on:
- db
db:
image: postgres:15
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=pass
- POSTGRES_DB=mydb
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
Запустите docker compose up, чтобы запустить оба сервиса. Compose управляет сетью, поэтому web может достичь db по имени сервиса.
Когда использовать Docker Compose, а когда обычный Docker
| Сценарий | Использование |
|---|---|
| Один контейнер | docker run |
| Несколько сервисов (приложение + БД) | Docker Compose |
| Оркестрация в продакшене | Kubernetes, Swarm |
Лучшие практики для разработчиков
- Используйте .dockerignore, чтобы исключить node_modules, .git и т.д., ускоряя сборку.
- Многоэтапные сборки, чтобы уменьшить размер итоговых образов.
- Фиксируйте версии в инструкциях FROM для воспроизводимости.
- Не запускайте от имени root в продакшен-контейнерах.
- Используйте тома для постоянных данных и для перезагрузки кода в реальном времени во время разработки.
Распространенные ошибки
Конфликты портов: Если порт 3000 занят, сопоставьте с другим портом хоста: -p 3001:3000.
Потеря данных: Без томов данные базы данных исчезают при удалении контейнера.
Медленные сборки: Упорядочивайте инструкции Dockerfile от наименее к наиболее часто изменяемым, чтобы использовать кэш.
Часто задаваемые вопросы
В чем разница между образом и контейнером?
Образ — это шаблон только для чтения; контейнер — это запущенный экземпляр этого образа. Вы можете запустить несколько контейнеров из одного образа.
Нужен ли Docker Compose для одного сервиса?
Нет. Compose раскрывается, когда у вас несколько сервисов. Для одного контейнера docker run проще.
Как сохранить данные в Docker?
Используйте тома. Определите именованный том в Compose или используйте -v с docker run, чтобы смонтировать директорию хоста или именованный том.
Готовы оптимизировать ваш рабочий процесс с Docker? Воспользуйтесь нашим JSON Formatter, чтобы быстро проверить и отформатировать файлы конфигурации JSON, такие как docker-compose.yml или package.json.