В чем разница между образом (Image) и контейнером (Container) в Docker?

Ответ

Docker Image и Docker Container — это фундаментальные, но разные сущности в экосистеме контейнеризации.

Docker Image

Образ — это неизменяемый (immutable) шаблон, содержащий всё необходимое для запуска приложения: код, зависимости, библиотеки, переменные окружения и конфигурацию.

  • Статичен и неизменяем: создается один раз (например, командой docker build) и не меняется во время выполнения. Для обновления приложения создается новый образ.
  • Состоит из слоев (layers): каждый слой соответствует инструкции в Dockerfile (например, FROM, RUN, COPY). Это позволяет эффективно кэшировать и переиспользовать слои между разными образами.
  • Хранится в реестре: образы можно загружать (docker pull) и выгружать (docker push) в реестры типа Docker Hub.
# Dockerfile — рецепт для создания образа
FROM node:18-alpine
WORKDIR /app
COPY package*.json .
RUN npm ci --only=production
COPY src/ ./src/
CMD ["node", "src/index.js"]

Docker Container

Контейнер — это запущенный, изолированный экземпляр (инстанс) образа. Это живой, выполняющийся процесс.

  • Динамичен и изменяем: контейнер имеет свое состояние (файловая система, память), которое может меняться во время работы. Однако изменения в запущенном контейнере не сохраняются в исходном образе.
  • Создается из образа: команда docker run <image> создает и запускает новый контейнер.
  • Имеет жизненный цикл: контейнер можно запустить (docker start), остановить (docker stop), удалить (docker rm).
# Создание образа из Dockerfile
docker build -t my-api:1.0 .

# Запуск контейнера из образа
docker run -d -p 8080:3000 --name api-container my-api:1.0

# Проверка запущенных контейнеров
docker ps

Аналогия

  • Образ — это чертеж или шаблон (как класс в ООП).
  • Контейнер — это реализация или экземпляр, созданный по этому шаблону (как объект класса).

Практический итог: Вы пишете Dockerfile, чтобы создать образ. Затем вы запускаете этот образ, чтобы получить работающий контейнер.

Ответ 18+ 🔞

А, вот ты тут про Docker'ы подкатил, ну давай разберём эту хуйню, а то народ путается, как последние идиоты, ей-богу.

Представь себе, что Docker Image — это, блядь, готовый замороженный полуфабрикат, типа пельменей в пачке. Всё там есть: тесто, мясо, специи, хуйня всякая. Он лежит себе на полке в магазине (это реестр, типа Docker Hub), неизменный, статичный, как скала. Ты его взял — и всё, внутри него нихуя не поменяешь, пока не разморозишь и не сваришь. А размораживаешь и варишь ты его вот этой командой docker build. Он ещё, сука, слоями сделан, как торт «Наполеон» — каждая инструкция в Dockerfile новый слой кладёт. Умно, да? Экономия места, пиздец.

# Смотри, вот рецепт, чё делать-то
FROM node:18-alpine
WORKDIR /app
COPY package*.json .
RUN npm ci --only=production
COPY src/ ./src/
CMD ["node", "src/index.js"]

А теперь Docker Container — это когда ты эти самые пельмени, блядь, сварил и начал жрать. Это уже живой, горячий, парящий процесс! Контейнер — это запущенный экземпляр образа. У него своя жизнь, своя память, свои файлики, которые он может менять. Но, внимание, ёпта! Если ты в тарелке с пельменями соусом побултыхал, это же не значит, что все пельмени в пачке теперь в соусе? Вот и тут так же. Изменения в контейнере в исходный образ не записываются, ну если только специально не попросишь.

# Слепил из рецепта образ, назвал его
docker build -t my-api:1.0 .

# А вот теперь запустил этот образ, получил контейнер — понеслась!
docker run -d -p 8080:3000 --name api-container my-api:1.0

# Смотри, какие контейнеры уже бегают
docker ps

Короче, сука, аналогия простая, чтобы в голове отложилось:

  • Образ (Image) — это чертёж, или, там, класс в программировании. Бумажка с инструкцией.
  • Контейнер (Container) — это готовый дом, построенный по чертежу, или объект этого класса. Живой и дышащий.

Итог, блядь, практический, чтоб два раза не вставать: Ты пишешь Dockerfile (рецепт) → создаёшь из него образ (полуфабрикат) → запускаешь образ командой docker run → получаешь контейнер (готовое блюдо, которое уже работает). Всё, пиздец, просто. Не усложняй, а то голова заболит.