Print this page

Что такое Docker

28 July 2024

Да что такое этот ваш Docker и контейнеры?! Хэй! Возможно, ты сидишь рядом с коллегами у кулера и слышишь: «доки», «контейнеры», «оркестрация» — и понимаешь ровно столько же, что я, когда впервые это услышал. Но давай разберёмся: это не магия, это просто инструменты DevOps, и Docker — один из них.


Почему не просто виртуалки

Представь такую ситуацию: твой коллега пишет приложение на каком-то странном языке, загружает миллион зависимостей, запускает его на своём Linux-дистрибутиве… и как теперь ты, на своём компьютере, запустишь этот код?

Обычная виртуалка (VM) — решение, но тяжелое. Ведь каждая VM имеет свою ОС, и запуск нескольких таких — ресурсоёмкий.

Docker — альтернатива: вместо виртуализации железа, он виртуализирует операционку, используя ядро хоста. Это значит: меньше оверхеда, но изоляция приложений сохраняется.

Основные компоненты Docker

Три главных элемента, которые нужно понять:

  1. Dockerfile — текстовый файл с инструкциями: как собрать образ, что туда положить и как настраивать.
  2. Image (образ) — результат сборки: приложение + библиотеки + всё, что нужно для запуска.
  3. Container (контейнер) — запущенный экземпляр образа: «работающий» Docker-экземпляр.

Взаимодействие: из Dockerfile создаётся образ → из образа запускается контейнер.

Пример Dockerfile

Допустим, мы хотим запустить nginx:

FROM ubuntu:20.04

RUN apt-get update  
RUN apt-get -y install nginx  

EXPOSE 80/tcp  

CMD ["/usr/sbin/nginx", "-g", "daemon off;"]

Пояснения:

  • FROM ubuntu:20.04 — берём Ubuntu 20.04 как базу.
  • RUN — шаги установки зависимостей (apt, nginx).
  • EXPOSE — говорим, что контейнер будет слушать порт 80.
  • CMD — что будет запущено, когда контейнер стартует (nginx в «фореграунд» режиме).

Когда файл готов — делаем docker build, и Docker создаёт образ. Затем docker run — запускает контейнер. Можно открыть localhost в браузере и увидеть nginx — просто, как код работает везде одинаково.

Registry и Docker Hub

Образы можно не только собирать самому, но и брать готовые. Для этого есть Docker Registry — хранилище образов. Самый популярный — Docker Hub.

  • Ты можешь docker pull nginx — и запустить nginx без своего Dockerfile.
  • Или собрать свой образ, запушить его в registry и делиться с командой.

Перманентность данных и контейнеры

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

Работа с несколькими контейнерами — docker-compose

Когда у тебя не просто один контейнер, а всё приложение из микросервисов — один nginx, БД, кеш и т.д., — docker-compose приходит на помощь.

В docker-compose.yml ты описываешь все сервисы, их связи, сети, тома — и запускаешь всё командой:

docker-compose up

Плюсы:

  • Поднимаешь всё одним махом.
  • Чёткая конфигурация в одном файле.
  • Легче поддерживать зависимости между сервисами.

Оркестрация контейнеров

Если контейнеров много, их надо оркестровать: управлять жизненным циклом, масштабировать, балансировать нагрузку и следить за здоровьем. Здесь на сцену выходит:

  • Docker Swarm — встроенный инструмент Docker для оркестрации.
  • Kubernetes — хит DevOps-мира, более мощный и гибкий.

Многие команды используют именно Kubernetes, потому что он даёт больше контроля и возможностей.

Итог

Docker — это не просто строка в резюме (хотя, да, это тоже), но и реально крутой инструмент:

  • Автоматизирует запуск приложений
  • Делает приложения консистентными (работают одинаково везде)
  • Экономит ресурсы
  • Хорошо сочетается с микросервисами и оркестрацией

Вопрос к знатокам: если Docker такой огонь, почему виртуалки всё ещё используются? В каких сценариях без виртуалки никак не обойтись?