Что такое Docker?

Ответ

Docker — это платформа для разработки, доставки и запуска приложений в изолированных, легковесных средах, называемых контейнерами. Контейнер инкапсулирует приложение со всеми его зависимостями: кодом, средой выполнения, системными инструментами, библиотеками и настройками.

Ключевые концепции:

  • Docker Image: Неизменяемый шаблон (слоистая файловая система + метаданные), на основе которого создаются контейнеры. Например, nginx:alpine, python:3.11-slim.
  • Docker Container: Запущенный экземпляр образа. Это изолированный процесс в пользовательском пространстве хоста, разделяющий ядро ОС хоста.
  • Dockerfile: Текстовый файл с инструкциями по сборке образа.
  • Docker Registry (Docker Hub): Хранилище для образов.

Практический пример: Dockerfile для Node.js приложения

# 1. Базовый образ. Определяет ОС и среду выполнения.
FROM node:18-alpine

# 2. Устанавливаем рабочую директорию внутри контейнера.
WORKDIR /app

# 3. Копируем файлы зависимостей отдельно для кэширования слоя.
COPY package*.json ./

# 4. Устанавливаем зависимости.
RUN npm ci --only=production

# 5. Копируем весь исходный код приложения.
COPY . .

# 6. Объявляем порт, который будет слушать приложение.
EXPOSE 3000

# 7. Команда для запуска контейнера.
CMD ["node", "server.js"]

Сборка и запуск:

# Собрать образ с тегом 'my-app'
docker build -t my-app .

# Запустить контейнер из образа, пробросив порт 3000 контейнера на порт 8080 хоста
docker run -p 8080:3000 --name my-app-container my-app
Преимущества перед традиционным деплоем и виртуальными машинами (ВМ): Аспект Виртуальная машина Docker-контейнер
Гостевая ОС Полная ОС поверх гипервизора Разделяет ядро хоста, содержит только приложение и зависимости
Размер ГБ МБ (образы легче на порядки)
Старт Минуты Секунды/миллисекунды
Изоляция Полная (аппаратный уровень) Процессная (на уровне ядра)
Плотность Низкая (десятки ВМ на хост) Высокая (сотни контейнеров)

Docker стандартизирует среду выполнения, решая проблему "у меня работает, а у тебя нет" и является фундаментом для современных CI/CD пайплайнов и оркестраторов, таких как Kubernetes.

Ответ 18+ 🔞

Слушай, а вот Docker — это, блядь, такая штука, чтобы твоё приложение, со всеми его пиздюлинами и библиотеками, запихнуть в аккуратную коробочку и чтобы оно везде запускалось одинаково. Эти коробочки называются контейнеры. Представь, как банка с тушёнкой: внутри всё готово, открыл — и жри, нехуй собирать по лесу грибы и коренья.

Основные понятия, без которых нихуя не понятно:

  • Docker Image: Это типа слепок, болванка, по которой штампуются контейнеры. Как силиконовая форма для пельменей. nginx:alpine или python:3.11-slim — это и есть такие формы, лежат на Docker Hub, как на полке в магазине.
  • Docker Container: А это уже готовый пельмень, сваренные и пахнущие. Запущенный экземпляр образа. Живой процесс, который жрёт память и процессор, но делает это в своей песочнице.
  • Dockerfile: Инструкция, чертёж, как собрать этот самый образ. Ты в нём пишешь, что на каком этапе делать, и Docker тебе слепит эту форму.
  • Docker Registry (Docker Hub): Склад готовых форм. Можно свою залить, можно чужую стянуть.

Вот смотри, как это выглядит на практике. Допустим, у тебя Node.js приложение:

# 1. Берём готовую основу. Не будем же с нуля ОС ставить, ёпта.
FROM node:18-alpine

# 2. Говорим: "Все дальнейшие команды выполняй внутри папки /app".
WORKDIR /app

# 3. Хитрый ход. Сначала копируем только файлы зависимостей (package.json).
# Это чтобы, если зависимости не менялись, Docker не переустанавливал их каждый раз, а брал из кэша. Умно, да?
COPY package*.json ./

# 4. Ставим эти самые зависимости. Только продакшн, без всякого хлама для разработки.
RUN npm ci --only=production

# 5. А вот теперь копируем ВЕСЬ остальной код приложения.
COPY . .

# 6. Объявляем, что наше приложение будет слушать порт 3000. Это просто метка.
EXPOSE 3000

# 7. И, наконец, команда, которая выполнится при запуске контейнера. Стартуем!
CMD ["node", "server.js"]

А теперь как этим пользоваться, чтобы не выглядеть конём:

# Собираем образ из Dockerfile и даём ему имя (тег) 'my-app'. Точка в конце — это контекст, не забудь её, а то нихуя не соберётся.
docker build -t my-app .

# Запускаем контейнер из образа. Флаг -p пробрасывает порт: порт 3000 из контейнера будет доступен на порту 8080 твоего компа.
docker run -p 8080:3000 --name my-app-container my-app

И главное, в чём соль, и почему все так обсираются от Docker, а не используют просто виртуальные машины?

Критерий Виртуальная машина Docker-контейнер
Что внутри Целая гостевая ОС со своим ядром, драйверами, всей хуйнёй. Овердохуища веса. Только приложение и его зависимости. Ядро одно — хостовое.
Размер Гигабайты, легко. Мегабайты. В разы, в десятки раз меньше.
Скорость запуска Минуты, пока ОС загрузится. Секунды, а то и мгновенно.
Изоляция Жёсткая, на уровне железа. Безопаснее, но тяжелее. Процессная, на уровне ядра. Легче, но есть свои нюансы.
Сколько влезет на сервер Ну, десяток-другой. Сотни запросто.

Короче, Docker решает вечную проблему: «Да у меня на ноуте всё работает, а на сервере — хуйня какая-то!». Всё упаковал, отправил, запустил. И это, блядь, основа для всех этих ваших Kubernetes, которые уже оркестрами целыми управляют. Без него сейчас нихуя.

Видео-ответы