Урок 3. Первые команды: run, ps, logs, stop, rm
В этом уроке — команды, которыми пользуются каждый день: запустить контейнер, посмотреть, что работает, прочитать вывод программы, остановить и удалить. Если вы добавили себя в группу docker (урок Установка Docker), команды набираются без sudo; иначе ставьте sudo перед каждой.
Что делает docker run
Запустите тестовый образ ещё раз и прочитайте ответ внимательно:
docker run hello-worldЕсли образа ещё нет на компьютере, первые строки будут такими:
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-worldДальше идут строки загрузки (Pull complete, Digest: sha256:…), а потом текст, который напечатала программа внутри контейнера. Она сама перечисляет, что произошло:
- Команда
dockerобратилась к службе Docker. - Служба скачала образ
hello-worldиз Docker Hub. - Служба создала из образа контейнер и запустила в нём программу.
- Вывод программы пришёл обратно в ваш терминал.
Программа напечатала текст и завершилась — вместе с ней остановился и контейнер. Это главное правило Docker: контейнер работает, пока работает его основная программа. При втором запуске образ уже есть, и строк загрузки не будет.
Список контейнеров
docker ps
docker ps -adocker 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 | когда создан |
STATUS | Up … — работает, Exited (код) … — остановлен; код 0 — программа завершилась без ошибки |
PORTS | порты контейнера и куда они проброшены |
NAMES | имя; если его не задали, Docker придумывает своё из двух слов |
К контейнеру можно обращаться по имени или по идентификатору; от идентификатора хватит первых нескольких знаков, если они не совпадают с другими: docker rm 9c2.
Образы
docker images
docker pull nginx:alpinedocker images выводит скачанные образы: имя, тег, идентификатор и размер. docker pull скачивает образ заранее, не запуская его. docker run делает это сам, если образа нет, — но pull полезен, когда нужно обновить образ до свежей версии (об этом — в уроке Обновление и очистка места).
Контейнер с терминалом
Запустите Ubuntu в контейнере и поработайте в нём, как в обычной системе:
docker run -it --rm ubuntu:24.04 bash-it— два ключа вместе:-iдержит ввод открытым,-tдаёт терминал. Без них интерактивная программа вродеbashсразу завершится;--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 — отсоединить):
docker run -d --name web nginx:alpineDocker напечатает длинный идентификатор нового контейнера и вернёт приглашение. Контейнер работает: проверьте 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 сохраняет. Посмотреть:
docker logs web
docker logs -f webПервая команда показывает всё, что накопилось. С -f (follow — следить) новые строки появляются по мере записи; выход — Ctrl+C, контейнер при этом продолжает работать. Подробнее — в справке Как посмотреть логи контейнера.
Остановить, запустить, удалить
docker stop web
docker start web
docker restart web
docker rm webdocker stopвежливо просит программу завершиться, а через 10 секунд, если она не успела, завершает её принудительно. Остановленный контейнер со всеми файлами остаётся на диске;docker startзапускает остановленный контейнер снова, с теми же настройками;docker rmудаляет остановленный контейнер. Работающий не удаляется — сначалаstop, или сразуdocker rm -f web;docker rmi nginx:alpineудаляет образ, если из него не создан ни один контейнер.
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 образ:тег |
Коротко
docker runскачивает образ, если его нет, создаёт контейнер и запускает его.- Контейнер работает, пока работает его основная программа.
docker ps— работающие контейнеры,docker ps -a— все,docker images— образы.-it— интерактивный терминал,--rm— удалить после остановки,-d— работать в фоне,--name— своё имя.docker logsпоказывает вывод программы,stop/start— остановить и запустить,rm— удалить.