Архив рассылок сообщества снова открыт. Читать письма 2003-2009
Главная/Блог/Инструменты
Инструменты8 мин чтения

Docker на Linux простыми словами: контейнеры с нуля

Разбираем Docker без магии: контейнеры, образы, тома, порты и базовые команды на практике.

Docker пугает новичков зря. По сути это удобный способ запускать программы в изолированной коробке, не засоряя основную систему. Установили один раз - и любое приложение поднимается одной командой, одинаково на вашем ноутбуке, на сервере коллеги и в облаке. В этой статье разберём, что такое контейнер, чем он отличается от виртуальной машины, и освоим команды, которых хватит на 90% ежедневных задач.

Контейнер против виртуальной машины

Виртуальная машина эмулирует целый компьютер: своё ядро, свой набор драйверов, полноценная гостевая ОС. Это надёжно, но тяжело - гигабайты образа и десятки секунд на загрузку. Контейнер устроен иначе: он использует ядро вашей основной системы Linux и изолирует только процессы, файловую систему и сеть приложения. Поэтому контейнер стартует за доли секунды и весит десятки мегабайт.

Простая аналогия: виртуалка - это отдельный дом с фундаментом и коммуникациями, а контейнер - квартира в общем доме. Все квартиры пользуются одним фундаментом (ядром), но за своей дверью у каждой свой мир. Из этого следует важное ограничение: на Linux нельзя запустить контейнер с Windows внутри, ведь ядро общее.

Образы и слои

Контейнер запускается из образа - это шаблон, снимок файловой системы с уже установленной программой. Образы собираются из слоёв. Каждый слой - это изменение поверх предыдущего: базовый слой с Ubuntu, сверху слой с установленным Python, ещё выше - ваш код. Слои переиспользуются между образами, поэтому второй образ на той же базе качается почти мгновенно.

Скачать образ и посмотреть локальный список можно так:

docker pull nginx:latest
docker images

Базовые команды

Запуск контейнера - это команда run. Флаг -d отправляет его в фоновый режим, --name задаёт понятное имя:

docker run -d --name web nginx
docker ps
docker ps -a

Команда ps показывает работающие контейнеры, а с флагом -a - вообще все, включая остановленные. Чтобы заглянуть внутрь работающего контейнера, используем exec с интерактивным терминалом:

docker exec -it web bash
docker logs web
docker logs -f web

Команда logs выводит то, что программа написала в консоль, а флаг -f показывает поток в реальном времени, как tail. Остановить и удалить контейнер:

docker stop web
docker rm web
docker rmi nginx

Здесь stop мягко останавливает процесс, rm удаляет сам контейнер, а rmi - образ, если он больше не нужен.

Проброс портов и томов

Контейнер изолирован, поэтому его порт по умолчанию не виден снаружи. Чтобы открыть веб-сервер на вашем порту 8080, пробрасываем порт флагом -p в формате внешний:внутренний:

docker run -d -p 8080:80 --name web nginx

Теперь сайт доступен по адресу localhost:8080. Аналогично с данными: файлы внутри контейнера исчезают вместе с ним. Чтобы сохранить их, подключаем том флагом -v в формате путь_на_хосте:путь_в_контейнере:

docker run -d -p 8080:80 \
  -v /home/user/site:/usr/share/nginx/html \
  --name web nginx

Теперь папка с вашего компьютера видна внутри контейнера, и правки в файлах сразу отражаются на сайте.

Dockerfile и docker compose

Свой образ описывают в файле Dockerfile - это рецепт сборки. Минимальный пример для приложения на Python:

FROM python:3.12-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["python", "app.py"]

Собрать образ из этого файла командой docker build -t myapp . - точка означает текущую папку. Когда контейнеров становится несколько (приложение, база данных, кеш), запускать их по одному утомительно. Тут выручает docker compose: вся конфигурация складывается в файл docker-compose.yml, и весь набор поднимается одной командой:

docker compose up -d
docker compose ps
docker compose down

С чего начать

Не пытайтесь выучить всё сразу. Поставьте Docker, поднимите nginx с пробросом порта, зайдите внутрь через exec, посмотрите логи, удалите контейнер. Когда эти движения станут привычными, добавьте том, потом соберите свой первый образ из Dockerfile. Через неделю практики вы будете удивляться, как раньше жили без контейнеров - установка окружения перестанет быть болью, а перенос проекта между машинами превратится в копирование одного файла.

Вернуться в блог