Картинка описывает жизненный цикл контейнера. Кружками на нем изображены состояния, жирным выделены консольные команды, а квадратиками показывается то, что в реальности выполняется.
Проследите путь команды docker run
. Несмотря на то, что команда одна, с точки зрения работы Docker выполняется два действия: создание контейнера и запуск. Существуют и более сложные варианты исполнения, но в этом разделе мы рассмотрим только базовые команды.
docker run
Запустим nginx так, чтобы он работал в фоне. Для этого после слова run добавляется флаг -d
. Дополнительно, зададим контейнеру имя --name=nginx
, чтобы упростить обращение к нему.
docker run -d --name=nginx -p 8080:80 nginx
431a3b3fc24bf8440efe2bca5bbb837944d5ae5c3b23b9b33a5575cb3566444e
Убедитесь в том, что nginx работает, открыв в браузере ссылку localhost:8080
. Там вы увидите надпись Welcome to Nginx!.
docker logs
После запуска в фоне, Docker выводит идентификатор контейнера и возвращает управление в терминал. С одной стороны это позволяет работать программе независимо от терминала, с другой, мы теперь потеряли возможность смотреть логи в том месте, где мы ее запустили. Посмотреть логи можно командой docker logs
, которой нужно передать идентификатор контейнера или его имя
# docker logs 431a3b3fc24bf8440efe2bca5bbb837944d5ae5c3b23b9b33a5575cb3566444e
docker logs nginx
172.17.0.1 - - [19/Jan/2018:07:38:55 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36" "-"
docker logs
выводит текущий лог и завершает работу, что бывает неудобно, если логи нужно просматривать в реальном времени. Для этого можно держать их постоянно открытыми по принципу работы команды tail -f
. Для этого запустите docker logs -f 431a3b3fc24bf8440efe2bca5bbb837944d5ae5c3b23b9b33a5575cb3566444e
. Теперь лог будет обновляться каждый раз, когда вы обновляете страницу в браузере. Выйти из этого режима можно набрав Ctrl+C, при этом сам контейнер остановлен не будет.
docker ps
Теперь выведем информацию о запущенных контейнерах командой docker ps
:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
431a3b3fc24b nginx "nginx -g 'daemon of…" 2 minutes ago Up 2 minutes 80/tcp nginx
Расшифровка столбиков:
- 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
. Первыми тремя строчками вывода окажутся:
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
85fb81250406 ubuntu "bash -c unknown" Less than a second ago Exited (127) 3 seconds ago loving_bose
c379040bce42 ubuntu "ls" Less than a second ago Exited (0) 9 seconds ago determined_tereshkova
Здесь как раз два последних запуска. Если посмотреть на колонку STATUS
, то видно, что оба контейнера находятся в состоянии Exited
. То есть запущенная команда внутри них выполнилась, и они остановились. Разница лишь в том, что один завершился успешно (0), а второй с ошибкой (127).
docker stop
Теперь попробуем остановить контейнер. Выполним команду:
# docker stop 431a3b3fc24b
docker stop nginx
431a3b3fc24b
Остановка контейнера не удаляет его. Он будет отображаться в списке контейнеров:
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
431a3b3fc24b nginx "/docker-entrypoint.…" 7 seconds ago Exited (0) 1 second ago nginx
docker start
После остановки контейнер можно даже перезапустить:
# docker start 31a3b3fc24b
docker start nginx
Запуск контейнера всегда стартует его в фоновом режиме, поэтому вы не увидите лога. Чтобы его посмотреть, воспользуйтесь командой docker logs nginx
.
docker kill
docker stop
шлет сигнал SIGTERM
, который должен обработать приложение внутри контейнера и остановиться. Если оно настроено неправильно, то этого не произойдет и команда docker stop
не сможет остановить контейнер. В этом случае понадобится docker kill
. Эта команда использует сигнал SIGKILL
, который гарантировано останавливает контейнер. Ее вывод идентичен:
# docker kill 431a3b3fc24b
docker kill nginx
431a3b3fc24b
Если попробовать набрать docker ps -a
, то можно увидеть, что статус контейнера будет Exited. Это значит, что работа контейнера остановлена.
Самостоятельная работа
В команде запуска приложения devops-example-app в фоновом режиме допущена пара ошибок. Найдите их и запустите контейнер.
docker run -p 80:3000 hexletcomponents/devops-example-app:0.9.0
Приложение должно быть доступно адресу http://localhost
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
- Статья «Как учиться и справляться с негативными мыслями»
- Статья «Ловушки обучения»
- Статья «Сложные простые задачи по программированию»
- Вебинар «Как самостоятельно учиться»
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.