В чем разница между Docker-образом и Docker-контейнером?

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

Ответ

Docker-образ и Docker-контейнер — это фундаментальные, связанные, но различные концепции.

  • Docker-образ — это неизменяемый шаблон (read-only). Он содержит:

    • Файловую систему (слои ОС, зависимости, код приложения).
    • Метаданные (переменные окружения, команда по умолчанию, точки монтирования).
    • Образ создается из Dockerfile командой docker build. Его можно хранить в реестре (Docker Hub, GitLab Registry).
    • Аналогия: Образ — это класс в ООП или шаблон документа (.docx).
  • Docker-контейнер — это запущенный экземпляр образа (изолированный процесс). Он:

    • Создается из образа командой docker run.
    • Имеет собственный изолированный userspace (файлы, процессы, сеть).
    • Добавляет поверх образа тонкий слой для записи (Copy-on-Write), где сохраняются все изменения во время работы.
    • Аналогия: Контейнер — это объект (экземпляр класса) или конкретный документ, созданный из шаблона.

Практический пример в CLI:

# 1. ПОЛУЧИТЬ/СОЗДАТЬ ОБРАЗ (шаблон)
# Скачать образ nginx из реестра
docker pull nginx:alpine
# ИЛИ собрать образ из Dockerfile
docker build -t my-app:1.0 .

# 2. СОЗДАТЬ И ЗАПУСТИТЬ КОНТЕЙНЕР (экземпляр)
docker run -d --name web-server -p 8080:80 nginx:alpine
# Теперь контейнер 'web-server' работает как процесс.

# 3. ПРОВЕРИТЬ РАЗНИЦУ
# Список всех образов на машине
docker images
# Список запущенных контейнеров
docker ps
# Список всех контейнеров (включая остановленные)
docker ps -a

Ключевой вывод для DevOps: Образы — это артефакты, которые мы версионируем, тестируем и продвигаем по pipeline CI/CD. Контейнеры — это runtime-единицы, которые оркестрируются (Kubernetes) и масштабируются в production.