Как собрать и запустить контейнер из Dockerfile?

«Как собрать и запустить контейнер из Dockerfile?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Процесс состоит из двух основных шагов: сборки образа и запуска контейнера.

1. Сборка образа (Build): Команда docker build создает образ на основе инструкций в Dockerfile.

# Сборка образа с тегом 'myapp:latest' из контекста текущей директории
docker build -t myapp:latest .

# Сборка с указанием конкретного Dockerfile и сборка для другой архитектуры
docker build -f Dockerfile.prod -t myapp:prod --platform linux/amd64 .

2. Запуск контейнера (Run): Команда docker run создает и стартует контейнер из собранного образа.

# Базовый запуск в интерактивном режиме
docker run -it myapp:latest

# Запуск в фоне (демон) с пробросом портов и монтированием volume
docker run -d 
  --name myapp-container 
  -p 8080:80 
  -v /host/path:/container/path 
  --env-file .env 
  myapp:latest

Рабочий пример из практики: Допустим, есть простой Dockerfile для веб-приложения:

# Dockerfile
FROM nginx:alpine
COPY ./src /usr/share/nginx/html
EXPOSE 80

Сборка и запуск будут выглядеть так:

docker build -t my-webapp .
docker run -d -p 8080:80 my-webapp

После этого приложение будет доступно по адресу http://localhost:8080.

Важные моменты:

  • Контекст сборки: Точка (.) в конце команды build определяет контекст — все файлы из этой директории отправляются Docker-демону. Важно использовать .dockerignore, чтобы исключить ненужные файлы (например, node_modules, .git).
  • Кэширование слоев: Docker кэширует каждый слой образа. Изменение инструкции в Dockerfile инвалидирует кэш для этой и всех последующих инструкций. Это важно для оптимизации скорости сборки.