0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Картинка описывает жизненный цикл контейнера. Кружками на нем изображены состояния, жирным выделены консольные команды, а квадратиками показывается то, что в реальности выполняется.</p>
1
<p>Картинка описывает жизненный цикл контейнера. Кружками на нем изображены состояния, жирным выделены консольные команды, а квадратиками показывается то, что в реальности выполняется.</p>
2
<p>Проследите путь команды docker run. Несмотря на то, что команда одна, с точки зрения работы Docker выполняется два действия: создание контейнера и запуск. Существуют и более сложные варианты исполнения, но в этом разделе мы рассмотрим только базовые команды.</p>
2
<p>Проследите путь команды docker run. Несмотря на то, что команда одна, с точки зрения работы Docker выполняется два действия: создание контейнера и запуск. Существуют и более сложные варианты исполнения, но в этом разделе мы рассмотрим только базовые команды.</p>
3
<h2>docker run</h2>
3
<h2>docker run</h2>
4
<p>Запустим nginx так, чтобы он работал в фоне. Для этого после слова<em>run</em>добавляется флаг -d. Дополнительно, зададим контейнеру имя --name=nginx, чтобы упростить обращение к нему.</p>
4
<p>Запустим nginx так, чтобы он работал в фоне. Для этого после слова<em>run</em>добавляется флаг -d. Дополнительно, зададим контейнеру имя --name=nginx, чтобы упростить обращение к нему.</p>
5
<p>Убедитесь в том, что nginx работает, открыв в браузере ссылку localhost:8080. Там вы увидите надпись<em>Welcome to Nginx!</em>.</p>
5
<p>Убедитесь в том, что nginx работает, открыв в браузере ссылку localhost:8080. Там вы увидите надпись<em>Welcome to Nginx!</em>.</p>
6
<h2>docker logs</h2>
6
<h2>docker logs</h2>
7
<p>После запуска в фоне, Docker выводит идентификатор контейнера и возвращает управление в терминал. С одной стороны это позволяет работать программе независимо от терминала, с другой, мы теперь потеряли возможность смотреть логи в том месте, где мы ее запустили. Посмотреть логи можно командой docker logs, которой нужно передать идентификатор контейнера или его имя</p>
7
<p>После запуска в фоне, Docker выводит идентификатор контейнера и возвращает управление в терминал. С одной стороны это позволяет работать программе независимо от терминала, с другой, мы теперь потеряли возможность смотреть логи в том месте, где мы ее запустили. Посмотреть логи можно командой docker logs, которой нужно передать идентификатор контейнера или его имя</p>
8
<p>docker logs выводит текущий лог и завершает работу, что бывает неудобно, если логи нужно просматривать в реальном времени. Для этого можно держать их постоянно открытыми по принципу работы команды tail -f. Для этого запустите docker logs -f 431a3b3fc24bf8440efe2bca5bbb837944d5ae5c3b23b9b33a5575cb3566444e. Теперь лог будет обновляться каждый раз, когда вы обновляете страницу в браузере. Выйти из этого режима можно набрав Ctrl+C, при этом сам контейнер остановлен не будет.</p>
8
<p>docker logs выводит текущий лог и завершает работу, что бывает неудобно, если логи нужно просматривать в реальном времени. Для этого можно держать их постоянно открытыми по принципу работы команды tail -f. Для этого запустите docker logs -f 431a3b3fc24bf8440efe2bca5bbb837944d5ae5c3b23b9b33a5575cb3566444e. Теперь лог будет обновляться каждый раз, когда вы обновляете страницу в браузере. Выйти из этого режима можно набрав Ctrl+C, при этом сам контейнер остановлен не будет.</p>
9
<p>Теперь выведем информацию о запущенных контейнерах командой docker ps:</p>
9
<p>Теперь выведем информацию о запущенных контейнерах командой docker ps:</p>
10
<p>Расшифровка столбиков:</p>
10
<p>Расшифровка столбиков:</p>
11
<ul><li>CONTAINER_ID - идентификатор контейнера. Так же, как и в git, используется сокращенная запись хеша</li>
11
<ul><li>CONTAINER_ID - идентификатор контейнера. Так же, как и в git, используется сокращенная запись хеша</li>
12
<li>IMAGE - имя образа, из которого был поднят контейнер. Если не указан тег, то подразумевается<em>latest</em></li>
12
<li>IMAGE - имя образа, из которого был поднят контейнер. Если не указан тег, то подразумевается<em>latest</em></li>
13
<li>COMMAND - команда, которая выполнилась на самом деле при старте контейнера</li>
13
<li>COMMAND - команда, которая выполнилась на самом деле при старте контейнера</li>
14
<li>CREATED - время создания контейнера</li>
14
<li>CREATED - время создания контейнера</li>
15
<li>STATUS - текущее состояние</li>
15
<li>STATUS - текущее состояние</li>
16
<li>PORTS - проброс портов</li>
16
<li>PORTS - проброс портов</li>
17
<li>NAMES - алиас. Docker позволяет кроме идентификатора иметь имя. Так гораздо проще обращаться с контейнером. Если при создании контейнера имя не указано, то Docker самостоятельно его придумывает. В выводе выше как раз такое имя у nginx</li>
17
<li>NAMES - алиас. Docker позволяет кроме идентификатора иметь имя. Так гораздо проще обращаться с контейнером. Если при создании контейнера имя не указано, то Docker самостоятельно его придумывает. В выводе выше как раз такое имя у nginx</li>
18
</ul><p>Команда docker ps выводит только запущенные контейнеры. Но кроме них могут быть и остановленные. Причем остановка может происходить как по успешному завершению, так и в случае ошибок. Попробуйте набрать docker run ubuntu ls, а затем docker run ubuntu bash -c "unknown". Эти команды не запускают долгоживущий процесс, они завершаются сразу после выполнения, причем вторая с ошибкой, так как такой команды не существует.</p>
18
</ul><p>Команда docker ps выводит только запущенные контейнеры. Но кроме них могут быть и остановленные. Причем остановка может происходить как по успешному завершению, так и в случае ошибок. Попробуйте набрать docker run ubuntu ls, а затем docker run ubuntu bash -c "unknown". Эти команды не запускают долгоживущий процесс, они завершаются сразу после выполнения, причем вторая с ошибкой, так как такой команды не существует.</p>
19
<p>Теперь выведем все контейнеры командой docker ps -a. Первыми тремя строчками вывода окажутся:</p>
19
<p>Теперь выведем все контейнеры командой docker ps -a. Первыми тремя строчками вывода окажутся:</p>
20
<p>Здесь как раз два последних запуска. Если посмотреть на колонку STATUS, то видно, что оба контейнера находятся в состоянии Exited. То есть запущенная команда внутри них выполнилась, и они остановились. Разница лишь в том, что один завершился успешно (0), а второй с ошибкой (127).</p>
20
<p>Здесь как раз два последних запуска. Если посмотреть на колонку STATUS, то видно, что оба контейнера находятся в состоянии Exited. То есть запущенная команда внутри них выполнилась, и они остановились. Разница лишь в том, что один завершился успешно (0), а второй с ошибкой (127).</p>
21
<h2>docker stop</h2>
21
<h2>docker stop</h2>
22
<p>Теперь попробуем остановить контейнер. Выполним команду:</p>
22
<p>Теперь попробуем остановить контейнер. Выполним команду:</p>
23
<p>Остановка контейнера не удаляет его. Он будет отображаться в списке контейнеров:</p>
23
<p>Остановка контейнера не удаляет его. Он будет отображаться в списке контейнеров:</p>
24
<h2>docker start</h2>
24
<h2>docker start</h2>
25
<p>После остановки контейнер можно даже перезапустить:</p>
25
<p>После остановки контейнер можно даже перезапустить:</p>
26
<p>Запуск контейнера всегда стартует его в фоновом режиме, поэтому вы не увидите лога. Чтобы его посмотреть, воспользуйтесь командой docker logs nginx.</p>
26
<p>Запуск контейнера всегда стартует его в фоновом режиме, поэтому вы не увидите лога. Чтобы его посмотреть, воспользуйтесь командой docker logs nginx.</p>
27
<h2>docker kill</h2>
27
<h2>docker kill</h2>
28
<p>docker stop шлет сигнал SIGTERM, который должен обработать приложение внутри контейнера и остановиться. Если оно настроено неправильно, то этого не произойдет и команда docker stop не сможет остановить контейнер. В этом случае понадобится docker kill. Эта команда использует сигнал SIGKILL, который гарантировано останавливает контейнер. Ее вывод идентичен:</p>
28
<p>docker stop шлет сигнал SIGTERM, который должен обработать приложение внутри контейнера и остановиться. Если оно настроено неправильно, то этого не произойдет и команда docker stop не сможет остановить контейнер. В этом случае понадобится docker kill. Эта команда использует сигнал SIGKILL, который гарантировано останавливает контейнер. Ее вывод идентичен:</p>
29
<p>Если попробовать набрать docker ps -a, то можно увидеть, что статус контейнера будет Exited. Это значит, что работа контейнера остановлена.</p>
29
<p>Если попробовать набрать docker ps -a, то можно увидеть, что статус контейнера будет Exited. Это значит, что работа контейнера остановлена.</p>
30
30