Docker
2026-02-26 20:12 Diff

Картинка описывает жизненный цикл контейнера. Кружками на нем изображены состояния, жирным выделены консольные команды, а квадратиками показывается то, что в реальности выполняется.

Проследите путь команды docker run. Несмотря на то, что команда одна, с точки зрения работы Docker выполняется два действия: создание контейнера и запуск. Существуют и более сложные варианты исполнения, но в этом разделе мы рассмотрим только базовые команды.

docker run

Запустим nginx так, чтобы он работал в фоне. Для этого после слова run добавляется флаг -d. Дополнительно, зададим контейнеру имя --name=nginx, чтобы упростить обращение к нему.

Убедитесь в том, что nginx работает, открыв в браузере ссылку localhost:8080. Там вы увидите надпись Welcome to Nginx!.

docker logs

После запуска в фоне, Docker выводит идентификатор контейнера и возвращает управление в терминал. С одной стороны это позволяет работать программе независимо от терминала, с другой, мы теперь потеряли возможность смотреть логи в том месте, где мы ее запустили. Посмотреть логи можно командой docker logs, которой нужно передать идентификатор контейнера или его имя

docker logs выводит текущий лог и завершает работу, что бывает неудобно, если логи нужно просматривать в реальном времени. Для этого можно держать их постоянно открытыми по принципу работы команды tail -f. Для этого запустите docker logs -f 431a3b3fc24bf8440efe2bca5bbb837944d5ae5c3b23b9b33a5575cb3566444e. Теперь лог будет обновляться каждый раз, когда вы обновляете страницу в браузере. Выйти из этого режима можно набрав Ctrl+C, при этом сам контейнер остановлен не будет.

Теперь выведем информацию о запущенных контейнерах командой docker ps:

Расшифровка столбиков:

  • CONTAINER_ID — идентификатор контейнера. Так же, как и в git, используется сокращенная запись хеша
  • IMAGE — имя образа, из которого был поднят контейнер. Если не указан тег, то подразумевается latest
  • COMMAND — команда, которая выполнилась на самом деле при старте контейнера
  • CREATED — время создания контейнера
  • STATUS — текущее состояние
  • PORTS — проброс портов
  • NAMES — алиас. Docker позволяет кроме идентификатора иметь имя. Так гораздо проще обращаться с контейнером. Если при создании контейнера имя не указано, то Docker самостоятельно его придумывает. В выводе выше как раз такое имя у nginx

Команда docker ps выводит только запущенные контейнеры. Но кроме них могут быть и остановленные. Причем остановка может происходить как по успешному завершению, так и в случае ошибок. Попробуйте набрать docker run ubuntu ls, а затем docker run ubuntu bash -c "unknown". Эти команды не запускают долгоживущий процесс, они завершаются сразу после выполнения, причем вторая с ошибкой, так как такой команды не существует.

Теперь выведем все контейнеры командой docker ps -a. Первыми тремя строчками вывода окажутся:

Здесь как раз два последних запуска. Если посмотреть на колонку STATUS, то видно, что оба контейнера находятся в состоянии Exited. То есть запущенная команда внутри них выполнилась, и они остановились. Разница лишь в том, что один завершился успешно (0), а второй с ошибкой (127).

docker stop

Теперь попробуем остановить контейнер. Выполним команду:

Остановка контейнера не удаляет его. Он будет отображаться в списке контейнеров:

docker start

После остановки контейнер можно даже перезапустить:

Запуск контейнера всегда стартует его в фоновом режиме, поэтому вы не увидите лога. Чтобы его посмотреть, воспользуйтесь командой docker logs nginx.

docker kill

docker stop шлет сигнал SIGTERM, который должен обработать приложение внутри контейнера и остановиться. Если оно настроено неправильно, то этого не произойдет и команда docker stop не сможет остановить контейнер. В этом случае понадобится docker kill. Эта команда использует сигнал SIGKILL, который гарантировано останавливает контейнер. Ее вывод идентичен:

Если попробовать набрать docker ps -a, то можно увидеть, что статус контейнера будет Exited. Это значит, что работа контейнера остановлена.