Глиф Учебники

Урок 3. Первые команды: run, ps, logs, stop, rm

Курс «Docker» · урок 3 из 10 · 5 минут чтения

В этом уроке — команды, которыми пользуются каждый день: запустить контейнер, посмотреть, что работает, прочитать вывод программы, остановить и удалить. Если вы добавили себя в группу docker (урок Установка Docker), команды набираются без sudo; иначе ставьте sudo перед каждой.

Что делает docker run

Запустите тестовый образ ещё раз и прочитайте ответ внимательно:

Bash
docker run hello-world

Если образа ещё нет на компьютере, первые строки будут такими:

Текст
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world

Дальше идут строки загрузки (Pull complete, Digest: sha256:…), а потом текст, который напечатала программа внутри контейнера. Она сама перечисляет, что произошло:

  1. Команда docker обратилась к службе Docker.
  2. Служба скачала образ hello-world из Docker Hub.
  3. Служба создала из образа контейнер и запустила в нём программу.
  4. Вывод программы пришёл обратно в ваш терминал.

Программа напечатала текст и завершилась — вместе с ней остановился и контейнер. Это главное правило Docker: контейнер работает, пока работает его основная программа. При втором запуске образ уже есть, и строк загрузки не будет.

Список контейнеров

Bash
docker ps
docker ps -a

docker ps показывает только работающие контейнеры. Контейнер hello-world уже завершился, поэтому список пуст. docker ps -a (all — все) показывает и остановленные:

Терминал
$ docker ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED         STATUS                     PORTS     NAMES
9c2f4e1b7a3d   hello-world   "/hello"   2 minutes ago   Exited (0) 2 minutes ago             eager_turing

Идентификатор и имя у вас будут другими. Что в столбцах:

СтолбецЧто значит
CONTAINER IDкороткий идентификатор контейнера
IMAGEобраз, из которого запущен
COMMANDкоманда, которую выполняет контейнер
CREATEDкогда создан
STATUSUp … — работает, Exited (код) … — остановлен; код 0 — программа завершилась без ошибки
PORTSпорты контейнера и куда они проброшены
NAMESимя; если его не задали, Docker придумывает своё из двух слов

К контейнеру можно обращаться по имени или по идентификатору; от идентификатора хватит первых нескольких знаков, если они не совпадают с другими: docker rm 9c2.

Образы

Bash
docker images
docker pull nginx:alpine

docker images выводит скачанные образы: имя, тег, идентификатор и размер. docker pull скачивает образ заранее, не запуская его. docker run делает это сам, если образа нет, — но pull полезен, когда нужно обновить образ до свежей версии (об этом — в уроке Обновление и очистка места).

Контейнер с терминалом

Запустите Ubuntu в контейнере и поработайте в нём, как в обычной системе:

Bash
docker run -it --rm ubuntu:24.04 bash

Приглашение сменится на root@…:/# — вы внутри контейнера, под root контейнера. Попробуйте ls /, cat /etc/os-release. Многих привычных программ нет: образ сделан минимальным, и даже ping или nano в нём нужно ставить через apt. Выход — exit: bash завершится, контейнер остановится и, благодаря --rm, удалится.

Короткие программы можно запускать и без терминала — контейнер выполнит команду и завершится:

Терминал
$ docker run --rm alpine echo Привет
Привет

При первом запуске Docker сначала скачает образ alpine — над словом «Привет» появятся строки загрузки.

Контейнер в фоне

Сервисы — веб-сервер, база данных — работают постоянно, и терминал им не нужен. Их запускают в фоне ключом -d (detach — отсоединить):

Bash
docker run -d --name web nginx:alpine

Docker напечатает длинный идентификатор нового контейнера и вернёт приглашение. Контейнер работает: проверьте docker ps:

Терминал
$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS     NAMES
3f2a1b9c8d7e   nginx:alpine   "/docker-entrypoint.…"   5 seconds ago   Up 4 seconds   80/tcp    web

--name web дало контейнеру понятное имя. 80/tcp в столбце PORTS — Nginx слушает порт 80 внутри контейнера, но снаружи он пока недоступен: как открыть его, рассказано в следующем уроке.

Логи

Всё, что программа в контейнере печатает на экран, Docker сохраняет. Посмотреть:

Bash
docker logs web
docker logs -f web

Первая команда показывает всё, что накопилось. С -f (follow — следить) новые строки появляются по мере записи; выход — Ctrl+C, контейнер при этом продолжает работать. Подробнее — в справке Как посмотреть логи контейнера.

-it — с терминалом docker run -it --rm ubuntu:24.04 bash ввод вывод контейнер, в нём bash root@…:/# после exit остановлен и удалён -d — в фоне docker run -d --name web nginx:alpine запуск контейнер web логи docker logs web терминал свободен сразу
С ключом -it терминал связан с программой в контейнере, а с -d контейнер работает в фоне и его вывод читают командой docker logs.

Остановить, запустить, удалить

Bash
docker stop web
docker start web
docker restart web
docker rm web
docker ps -a docker ps работает Up … остановлен Exited (0) … docker stop или программа завершилась docker start образ nginx:alpine docker run docker rm удалён с файлами внутри
Контейнер работает, пока работает его программа; остановленный виден только в docker ps -a, а docker rm удаляет его совсем.

docker rm удаляет контейнер вместе со всем, что программа записала внутри него. Если в контейнере были нужные данные не в томе — они пропадут безвозвратно. Как хранить данные правильно — в уроке Данные: тома и папки.

Шпаргалка

ЗадачаКоманда
Запустить контейнерdocker run образ
В фоне и с именемdocker run -d --name имя образ
С терминалом, одноразовоdocker run -it --rm образ bash
Работающие контейнерыdocker ps
Все контейнерыdocker ps -a
Образыdocker images
Скачать образdocker pull образ:тег
Логиdocker logs -f имя
Остановить и запуститьdocker stop имя, docker start имя
Удалить контейнерdocker rm имя
Удалить образdocker rmi образ:тег

Коротко

Проверьте себя

1. Почему контейнер hello-world не виден в docker ps сразу после запуска?
2. Что делает ключ --rm в docker run --rm ...?
3. Какой командой запустить контейнер в фоне?
4. Что будет с файлами внутри контейнера после docker stop?
5. Как посмотреть вывод программы, работающей в фоновом контейнере web?