Представьте: вы только что узнали, что такое контейнеры и зачем они нужны. Теперь хочется «потрогать руками» — запустить первый контейнер и увидеть, как он работает. В этом уроке мы разберём, как установить Docker, запустить первый контейнер, посмотреть, что с ним происходит, и правильно его останавливать.
Это будет как с машиной: теория понятна, но пока не заведёшь мотор — ощущения не будет.
Что вы узнаете в рамках статьи
- Как установить Docker на разные операционные системы.
- Как запустить первый контейнер и что делает команда
docker run. - Как посмотреть список запущенных контейнеров с помощью
ps. - Как просматривать логи и управлять контейнерами (
logs,stop,rm). - Какие бывают политики перезапуска и зачем они нужны.
Ключевые термины
docker run— команда для запуска нового контейнера из образа.docker ps— список работающих контейнеров.docker logs— просмотр логов контейнера.docker stop— остановка работающего контейнера.docker start— запуск ранее созданного контейнера.docker rm— удаление контейнера.- Политики перезапуска (restart policies) — настройка того, что делать с контейнером при сбое или перезапуске сервера.
Установка Docker
Сегодня Docker — это кроссплатформенный инструмент: его можно установить на Linux, macOS и Windows. Но важно понимать, что под капотом он работает немного по-разному.
Linux: родная среда Docker 🐧
Docker появился в мире Linux, и именно там он работает максимально «нативно». Установка чаще всего происходит через пакетный менеджер:
- в Ubuntu/Debian —
apt, - в Fedora —
dnf, - в CentOS/RHEL —
yum.
По сути, установка Docker на Linux — это как поставить любую другую программу. После установки вы получаете:
- демон (dockerd) — это фоновый процесс, который реально управляет контейнерами,
- клиент (docker) — это терминальная команда, которая общается с демоном.
📌 Аналогия: представьте ресторан. Демон — это повар на кухне, который готовит еду. Клиент — это официант, который принимает ваш заказ и передаёт его на кухню. Вы взаимодействуете только с официантом, но работу выполняет повар.
macOS и Windows: Docker Desktop
На macOS и Windows ситуация интереснее. Эти системы не поддерживают контейнеризацию напрямую (у них нет тех же механизмов ядра, что у Linux). Поэтому Docker там работает через «прослойку».
Раньше на Windows и macOS использовали лёгкие виртуальные машины, внутри которых крутился Linux с Docker. Сегодня это решение называется Docker Desktop.
- Это приложение с удобным интерфейсом (иконка в панели, кнопки «старт/стоп»),
- но внутри оно всё равно запускает небольшую виртуальную машину с Linux, где работает Docker-демон.
👉 То есть, когда вы вводите команду docker run на Windows или macOS, клиент общается с демоном внутри этой «мини-VM».
📌 Аналогия: это как если бы вы хотели готовить итальянскую пасту в Японии, но нужные продукты есть только в Италии. Тогда вы открываете маленький итальянский ресторанчик прямо внутри японского города и работаете через него.
Где скачать Docker Desktop для Windows и macOS
Чтобы установить Docker на Windows или macOS, не нужно искать сторонние сайты или сомнительные архивы. Docker Desktop распространяется официально через сайт разработчиков:
👉 Docker Desktop (официальная страница загрузки)
На странице есть две версии:
- для Windows (поддерживаются Windows 10/11 Pro, Enterprise; для Home-версий тоже есть вариант с WSL2),
- для macOS (варианты для процессоров Intel и Apple Silicon/M1/M2).
После скачивания достаточно установить программу, как любое другое приложение. Docker Desktop добавит значок в панель, а вместе с ним появится и привычная командная утилита docker в терминале.
После установки: что появляется
После установки Docker у вас есть:
- Клиент (
docker) — инструмент в терминале для управления контейнерами. - Демон (
dockerd) — сервис, который реально запускает и контролирует контейнеры. - Docker Hub (по умолчанию) — репозиторий, откуда берутся образы.
Таким образом, каждый раз, когда вы вводите команду, например, docker run, клиент отправляет запрос демону, а тот выполняет нужные действия: скачивает образ, создаёт контейнер, запускает его.
👉 В итоге можно запомнить просто:
- Linux — «родной дом» Docker, работает напрямую.
- macOS и Windows — через Docker Desktop, внутри которого спрятан Linux.
Первый запуск: docker run
После установки Docker хочется сразу попробовать «пощупать» его в деле. Для этого и существует команда docker run — именно она запускает контейнер.
Что делает docker run шаг за шагом
Чтобы проверить, что Docker установлен правильно, традиционно запускают образ hello-world. Этот контейнер очень простой: он выводит приветственное сообщение и тут же завершает работу.
Когда вы выполняете docker run hello-world, выполняются следующие шаги:
- Проверяет наличие образа. Docker смотрит, есть ли на вашем компьютере нужный образ.
- Скачивает образ, если его нет. Если нужного образа нет, Docker тянет его из Docker Hub или другого настроенного реестра.
- Создаёт контейнер из образа. Из образа делается копия — это и есть контейнер.
- Запускает контейнер. Контейнер начинает работать: запускается процесс внутри него.
Примеры использования
1) Одноразовая задача (выполнил и вышел)
docker run --rm busybox echo "It works!"
Флаг --rm автоматически удалит контейнер после завершения.
2) Интерактивная сессия (зайти внутрь контейнера)
docker run -it --name sandbox alpine sh
Ключи -it запускают интерактивную оболочку; выйдите командой exit.
3) Долгоживущий сервис в фоне (detached-режим)
docker run -d --name web -p 8080:80 nginx
Контейнер запускается в фоне (-d), порт 8080 хоста проксируется на 80 внутри.
4) Переменные окружения при старте
docker run --rm -e NODE_ENV=production alpine printenv NODE_ENV
Хорошо для конфигурации приложений без перекомпиляции образа.
Список контейнеров: docker ps
Когда вы запускаете контейнер, он начинает жить своей жизнью как процесс в системе. Но как узнать, что сейчас работает? Для этого есть команда docker ps.
Что показывает docker ps
По сути, это список «живых» контейнеров — тех, которые запущены прямо сейчас. В выводе обычно есть:
- ID контейнера (уникальный идентификатор),
- образ, из которого он создан,
- команда, которая внутри выполняется,
- статус (работает или уже завершился),
- время запуска,
- открытые порты,
- имя контейнера (по умолчанию Docker сам придумывает смешные имена вроде
friendly_lamport).
Ключевые варианты использования
docker ps— показывает только активные контейнеры.docker ps -a— выводит все контейнеры, включая завершившиеся.
Зачем нужен docker ps -a
Иногда контейнеры завершаются сами. Например, hello-world после приветственного сообщения сразу останавливается. В обычном docker ps вы его не увидите, но с флагом -a можно посмотреть его историю и убедиться, что он запускался.
Это особенно полезно при отладке: если контейнер «упал», через docker ps -a можно понять, что он запускался и как завершился.
Примеры использования
docker ps— список работающих контейнеров (аналог активных вкладок).docker ps -a— полный список, включая остановленные (аналог истории вкладок).- Эта команда — первый шаг в диагностике: если что-то не запускается, начните с
ps.
Логи: docker logs
Контейнеры, как и обычные программы, постоянно что-то пишут: сообщения о работе, ошибки, результаты выполнения команд. Эти данные называются логами.
Когда приложение работает не так, как ожидается, именно логи помогают разобраться: что пошло не так, в какой момент и почему.
Что делает docker logs
Команда docker logs позволяет посмотреть сообщения, которые контейнер выводит в стандартный вывод (stdout и stderr). Это похоже на подглядывание в «дневник» контейнера: вы видите всё, что он говорил с момента запуска.
Примеры использования
Давайте разберём основные варианты использования команды docker logs — от простого просмотра сообщений до фильтрации и «живого» отслеживания работы контейнера.
Простое использование — показать все записи
Для вывода логов можно использовать как имя контейнера, так и его ID (оба варианта работают одинаково).
# по имени
docker logs my-web
# по ID
docker logs 1a2b3c4d5e6f
Фильтрация — только «хвост» (последние строки)
# последние 100 строк
docker logs --tail 100 my-web
# логи за последние 10 минут
docker logs --since 10m my-web
# хвост + метки времени
docker logs --tail 200 -t my-web
Следить в реальном времени
# «прилипнуть» к логу и смотреть новые строки
docker logs -f my-web
# следить в реальном времени, но начать с последних 50 строк
docker logs -f --tail 50 my-web
# real-time + метки времени
docker logs -f -t my-web
Подсказка: узнать имя/ID контейнера можно так:
docker ps
Зачем нужны логи
- Диагностика ошибок. Если приложение «упало», логи покажут, на чём оно сломалось.
- Аналитика. По логам можно понять, как активно пользуются сервисом.
- Контроль работы. Даже если всё работает, можно проверять, не появляются ли подозрительные сообщения.
📌 Пример: если внутри контейнера крутится веб-сервер, в логах будут строки с запросами пользователей. Это как журнал регистрации в отеле 🏨 — видно, кто заходил и когда.
Управление контейнерами: stop, rm и start
Контейнер — это «запущенный экземпляр» образа. Им нужно уметь аккуратно управлять: корректно останавливать и удалять, чтобы не захламлять систему и не потерять важные данные.
Что делает docker stop
- Смысл: «попросить» приложение корректно завершиться.
- Как работает: Docker отправляет процессу внутри контейнера сигнал SIGTERM (даёт время закрыть соединения, записать кэш, сохранить состояние). Если за таймаут (по умолчанию ~10 секунд) не завершился — посылает SIGKILL (жёсткая остановка).
- Аналогия: выключить двигатель у машины — она остаётся на парковке, но мотор больше не работает.
# Корректно остановить по имени или ID
docker stop my-app
docker stop 1a2b3c4d5e6f
# Остановить несколько контейнеров сразу
docker stop api web db
# Задать собственный таймаут (в секундах)
docker stop -t 5 my-app
Подсказка: если приложение обрабатывает трафик, стоп предпочтительнее «килла»: меньше шансов потерять данные и повредить состояние.
Что делает docker rm
- Смысл: убрать контейнер (его метаданные и файловую «оболочку») из системы.
- Важно:
docker rmне трогает образ и тома (volumes) по умолчанию — данные в томах сохраняются. - Аналогия: «снять машину с учёта» — самого автомобиля больше нет. Парковочное место (том) и модель (образ) остаются.
# Удалить остановленный контейнер
docker rm my-app
# Удалить сразу несколько
docker rm api web db
# Форсированно удалить (если контейнер всё ещё запущен)
docker rm -f my-app
# Удалить вместе с анонимными томами контейнера (аккуратно!)
docker rm -v my-app
# Массовая уборка остановленных контейнеров
docker container prune # спросит подтверждение
Золотое правило: сначала stop, потом rm. Если удалить работающий контейнер через rm -f, это эквивалентно «киллу»: приложение может не успеть завершиться корректно.
Что делает docker start
Смысл: запустить ранее созданный, но остановленный контейнер. Команда не создаёт новый экземпляр, а возобновляет работу уже существующего — с теми же настройками, переменными окружения и томами.
Важно: docker start не пересоздаёт контейнер и не применяет изменения в образе, даже если образ обновился — он поднимает именно тот контейнер, что уже был.
Аналогия: «включить двигатель в уже припаркованной машине» — вы не создаёте новую машину, а просто снова едете на той же.
# Запустить один контейнер
docker start my-app
# Запустить несколько контейнеров
docker start api web db
# Запустить контейнер и сразу подключиться к его выводу (эквивалент -ai)
docker start -a -i my-app
# Посмотреть, какие контейнеры можно запустить
docker ps -a # покажет и остановленные
Золотое правило: docker start используется только для повторного запуска. Если нужно создать контейнер заново с изменёнными параметрами, используй docker run.
Частые сценарии и хорошие практики
-
Перезапуск «по-чистовому» (пересобрали образ, хотите заново поднять):
docker stop my-app && docker rm my-app docker run --name my-app ... -
Обновление без простоя (blue/green на одном хосте): поднимите новый контейнер с другим именем/портом, переключите трафик, затем
stop && rmстарый. -
Регулярная уборка мусора:
docker ps -a # посмотрите, что «висит» docker container prune -
Данные живут дольше контейнера: если у контейнера подключён volume, его можно безопасно удалить — данные останутся в томе и будут доступны при следующем запуске.
Небольшие «рецепты»
# Остановить все запущенные контейнеры
docker stop $(docker ps -q)
# Удалить все остановленные контейнеры
docker rm $(docker ps -aq -f status=exited)
# Мгновенно «убить» зависший контейнер (без graceful shutdown)
docker kill my-app
Политики перезапуска (restart policies)
Контейнеры — это процессы. А процессы могут падать: приложение может завершиться с ошибкой, сервер может перезагрузиться, администратор случайно может остановить сервис. Чтобы не следить вручную за каждым контейнером, Docker позволяет задать политику перезапуска.
Эта настройка говорит демону Docker: «Что делать с контейнером, если он остановился?»
Виды политик
no(по умолчанию) Контейнер не будет перезапускаться автоматически. 👉 Подходит для тестов и экспериментов: запустили → посмотрели → остановили.alwaysКонтейнер будет всегда перезапускаться, даже если вы его остановили вручную или после перезагрузки сервера. 👉 Хорошо для критичных сервисов, которые должны жить «вечно».unless-stoppedКонтейнер будет перезапускаться автоматически при сбое или перезагрузке сервера, но не если вы остановили его руками. 👉 Золотая середина: удобно для постоянных сервисов, но оставляет вам контроль.on-failureКонтейнер будет перезапущен только если он завершился с ошибкой (ненулевой код выхода). Можно указать лимит перезапусков. 👉 Отличный вариант для приложений, где падение считается ненормальным, но ручной стоп должен оставаться стопом.
Примеры использования
# Перезапускать всегда
docker run --restart=always my-app
# Перезапускать, кроме случаев ручной остановки
docker run --restart=unless-stopped my-app
# Перезапускать только при сбое, не более 5 раз
docker run --restart=on-failure:5 my-app
Когда что использовать
no— для учебных и временных контейнеров.always— для продакшен-сервисов, которые критично держать «живыми» (например, веб-сервер Nginx).unless-stopped— для фоновых сервисов, которые должны переживать перезагрузку, но управляться человеком.on-failure— для приложений, которые должны пробовать стартовать заново при ошибках (например, скрипты с нестабильным API).
Наиболее частые ошибки
- Путать контейнер и образ.
Многие думают, что командаdocker runзапускает образ напрямую. На самом деле сначала создаётся контейнер из образа. - Не чистить остановленные контейнеры.
Если не использоватьdocker rm, система со временем захламляется. - Забывать про перезапуск.
Без политики restart ваш сервис может «упасть» и не подняться заново.
Наиболее частые вопросы
- Нужно ли останавливать контейнер перед удалением?
Обычно да. Но можно удалить сразу принудительно (rm -f), если он ещё работает. - Чем
stopотличается отkill?
stopдаёт приложению время завершиться корректно,kill— останавливает мгновенно. - Можно ли увидеть логи старого контейнера после его удаления?
Нет, логи хранятся только пока контейнер существует.
Итоги
Сегодня вы узнали:
- Как установить Docker на разные системы.
- Как запускать контейнеры через
docker run. - Как смотреть список контейнеров (
ps), логи (logs), останавливать (stop) и удалять (rm) их. - Какие бывают политики перезапуска и зачем они нужны.
Теперь у вас есть базовые навыки: вы можете создать, запустить, проверить и остановить контейнер. Это первый шаг к уверенной работе с Docker.