Linux Labs

Контейнеры: Docker и compose / Ступень 1 из 11

Образ, контейнер и процесс

Не запущена Запускается обычно ~20 с
Выйти из урока

Шаг 3 из 6 · на машине · 8 мин

Контейнер живёт, пока работает его процесс

Здесь — почему web остановился с кодом 0 и как оставить его работать.

В контейнере работает один главный процесс — команда из docker run или команда образа. Пока он работает, контейнер Up. Процесс завершился — контейнер остановлен, а в скобках после Exited стоит его код завершения: 0 — команда закончилась без ошибки.

Всё, что главный процесс печатает, Docker сохраняет — и у остановленного контейнера тоже. Прочитать это можно командой docker logs <имя>:

bash
sudo docker logs web

У web вывода нет: httpd ничего не напечатал.

Проверь себя 1 вопрос

Контейнер bad создан командой sudo docker run -d --name bad alpine sh -c 'echo starting; cat /etc/app.conf'. В docker ps -a у него Exited (1). Что напечатает sudo docker logs bad?

  • В журнал контейнера попадают оба потока процесса, и вывод, и ошибки: сообщение cat о файле там тоже есть.

  • Работающий контейнер нужен, чтобы запустить в нём новую команду. docker logs ничего не запускает — он читает сохранённый вывод.

  • Docker хранит вывод главного процесса и после остановки: docker logs работает и у контейнера в статусе Exited.

docker logs показывает всё, что главный процесс напечатал в вывод и в поток ошибок, и у остановленного контейнера тоже. Здесь видно, что sh напечатал starting, а cat не нашёл файл — отсюда код 1.

httpd по умолчанию уходит в фон, как классический демон: запускает свою копию и завершается сам. Для Docker это конец главного процесса: контейнер останавливается, а копия в фоне останавливается вместе с ним. У таких серверов есть ключ, который оставляет их на переднем плане. Справку httpd можно прочитать во временном контейнере:

bash
sudo docker run --rm busybox httpd --help

--rm удаляет контейнер, как только его команда завершилась. Остановленный web по-прежнему занимает своё имя: второй docker run --name web откажет с ошибкой Conflict. Освобождает имя docker rm web.

Упражнение · сделать

Оставь сервер работать

Запусти контейнер web заново так, чтобы он продолжал работать: тот же образ busybox, тот же сервер httpd на порту 8080 внутри контейнера.

Войти и начать Машина доступна после входа

Цели · 0 из 2

  • Запустить web, который не останавливается ещё не выполнена
  • Сервер внутри отвечает на порту 8080 ещё не выполнена

Цели шага

0 из 2
  • Запустить web, который не останавливается — ещё не выполнена
  • Сервер внутри отвечает на порту 8080 — ещё не выполнена
Ubuntu 24.04

Цели шага

0 из 2
  • Запустить web, который не останавливается — ещё не выполнена
  • Сервер внутри отвечает на порту 8080 — ещё не выполнена
Загрузка…