Docker для разработчиков: образы, контейнеры и Compose
Вы, вероятно, слышали о Docker и контейнерах, но, возможно, не уверены, как они вписываются в ваш повседневный рабочий процесс разработки. Или, возможно, вы пробовали Docker, но концепции образов, контейнеров и Compose кажутся запутанными. Это руководство проведет вас через основы с практическими примерами, чтобы вы могли начать эффективно использовать Docker в своих проектах.
Что такое Docker-образы и контейнеры?
Представьте Docker-образ как чертеж вашего приложения. Он содержит все необходимое для запуска вашего кода: операционную систему, среду выполнения, библиотеки и файлы вашего приложения. Образы неизменяемы и создаются из Dockerfile.
Контейнер — это запущенный экземпляр образа. Когда вы запускаете контейнер, Docker создает изолированную среду из образа. Вы можете запустить несколько контейнеров из одного образа, каждый со своим состоянием.
Ключевые различия
| Образ | Контейнер |
|---|---|
| Шаблон только для чтения | Запускаемый экземпляр |
| Создается из Dockerfile | Создается из образа |
| Хранится в реестре | Работает на хосте |
| Неизменяемый | Эфемерный (можно остановить, запустить, удалить) |
Создание вашего первого Docker-образа
Давайте создадим простое Node.js-приложение и контейнеризируем его. Начните с Dockerfile в корне вашего проекта:
# Use an official Node.js runtime as a parent image
FROM node:18-alpine
# Set the working directory
WORKDIR /app
# Copy package.json and package-lock.json
COPY package*.json ./
# Install dependencies
RUN npm ci --only=production
# Copy the rest of the application code
COPY . .
# Expose the port the app runs on
EXPOSE 3000
# Define the command to run the app
CMD ["node", "server.js"]
Соберите образ с помощью:
docker build -t my-node-app .
Запустите контейнер из образа:
docker run -p 3000:3000 -d my-node-app
Теперь ваше приложение доступно по адресу http://localhost:3000.
Управление контейнерами
Вот основные команды для управления контейнерами:
docker ps– список запущенных контейнеровdocker ps -a– список всех контейнеров (включая остановленные)docker stop <container_id>– остановить запущенный контейнерdocker rm <container_id>– удалить остановленный контейнерdocker logs <container_id>– просмотреть логи контейнераdocker exec -it <container_id> sh– открыть оболочку внутри запущенного контейнера
Упрощение многоконтейнерных приложений с помощью Docker Compose
Реальные приложения часто требуют нескольких сервисов: веб-сервер, база данных, кэш и т.д. Управлять ими с помощью отдельных команд docker run утомительно. Docker Compose позволяет определять и запускать многоконтейнерные приложения с помощью YAML-файла.
Создайте docker-compose.yml:
version: '3.8'
services:
web:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DB_HOST=db
depends_on:
- db
db:
image: postgres:15-alpine
environment:
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
- POSTGRES_DB=mydb
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
Запустите все сервисы с помощью:
docker compose up -d
Остановите и удалите их с помощью:
docker compose down
Лучшие практики для разработки
- Используйте .dockerignore, чтобы исключить ненужные файлы (node_modules, .git) из контекста сборки.
- Используйте кэширование слоев: упорядочите инструкции Dockerfile так, чтобы зависимости устанавливались до копирования исходного кода.
- Используйте многоэтапные сборки, чтобы уменьшить размер production-образов.
- Храните данные в томах для баз данных и других stateful-сервисов.
- Используйте Compose для локальной разработки, чтобы воспроизвести окружение, близкое к production.
Часто задаваемые вопросы
В чем разница между образом и контейнером?
Образ — это шаблон только для чтения, который определяет приложение и его зависимости. Контейнер — это запущенный экземпляр образа с записываемым слоем сверху.
Можно ли использовать Docker Compose в production?
Docker Compose в первую очередь предназначен для разработки и тестирования. Для production рассмотрите инструменты оркестрации, такие как Kubernetes или Docker Swarm.
Как сохранить данные в Docker?
Используйте тома или bind mounts. Тома управляются Docker и являются предпочтительным способом сохранения данных, создаваемых контейнерами.
Готовы контейнеризировать ваше приложение? Если вам нужно преобразовать документацию или руководства в PDF для вашей команды, попробуйте наш конвертер Word в PDF, чтобы делиться отточенными документами.