Первый контейнер
docker run и его флаги, ps/logs/exec, как зайти внутрь работающего контейнера и чем отличается образ от контейнера.
docker run: самая базовая команда
Шаблон:
docker run [флаги] <образ> [команда]
Если опустить <команда> — запустится та, что зашита в образе (через
CMD или ENTRYPOINT, см. урок про Dockerfile). Если указать -
переопределит.
Минимальный пример:
docker run alpine echo "hello"
Что произошло:
- Docker проверил, есть ли образ
alpineлокально. Нет — дёрнул Docker Hub и скачал. - Создал контейнер: новые namespace, новый rootfs, writable-слой поверх образа.
- Запустил внутри
echo "hello"как pid 1. - Процесс завершился — контейнер перешёл в состояние
exited. Он не удалён, просто остановлен. Его можноdocker startобратно.
Ключевые флаги
| Флаг | Что делает | Когда нужен |
|---|---|---|
-d | detached, контейнер уходит в фон | для сервисов (nginx, postgres) |
-it | interactive + TTY | когда хочешь shell внутри |
-p HOST:CONT | публикация порта | веб-сервисы, API |
--name NAME | человекочитаемое имя | иначе будет wizardly_kepler |
--rm | удалить контейнер после exit | для одноразовых запусков |
-e KEY=VAL | переменная окружения | конфиг |
-v SRC:DST | маунт (volume или bind) | данные, конфиги |
--restart | политика перезапуска | unless-stopped для прод-сервисов |
-i и -t обычно идут парой -it. Сами по себе они означают:
-i— не закрывать stdin, чтобы можно было что-то печатать.-t— выделить псевдо-терминал (tty), чтобы shell нормально работал с цветами и переводами строк.
Образ, контейнер и запущенный процесс
Это три разные сущности. Путать их — типичная ошибка новичка.
- Образ (image) — неизменяемый шаблон. Состоит из read-only слоёв
и манифеста. Идентифицируется тэгом (
nginx:1.27) или digest'ом. - Контейнер (container) — инстанс образа. Это writable-слой поверх
стопки слоёв + метаданные (имя, переменные, порты). Может быть в
состоянии
running,exited,paused. - Запущенный процесс — реальный процесс ядра, который сейчас бегает внутри контейнера. У него pid 1 внутри namespace и какой-то pid снаружи.
Из одного образа можно запустить десять контейнеров — каждый со своим writable-слоем и своими процессами. Образ при этом не меняется.
Жизненный цикл контейнера
Команд много, но в реальной работе хватает вот этих:
| Команда | Что делает |
|---|---|
docker run | создать и запустить контейнер из образа |
docker ps | показать запущенные контейнеры |
docker ps -a | показать все, включая остановленные |
docker logs [-f] <name> | stdout/stderr контейнера, -f — стримить |
docker exec -it <name> sh | запустить ещё один процесс внутри уже работающего контейнера |
docker stop <name> | послать SIGTERM, через 10 секунд SIGKILL |
docker kill <name> | послать SIGKILL сразу |
docker rm <name> | удалить остановленный контейнер |
Типичный сеанс при отладке:
docker run -d --name web -p 8080:80 nginx
docker ps # видим web в списке
curl http://localhost:8080 # 200 OK
docker logs -f web # смотрим запросы в realtime
docker exec -it web sh # зашли внутрь
# внутри:
ls /etc/nginx # потыкали конфиги
exit # вышли, контейнер продолжает жить
docker stop web
docker rm web
stop vs kill vs rm
Эти три путаются часто.
stop— вежливо. Шлёт SIGTERM, ждёт 10 секунд, потом SIGKILL. Postgres и приличные сервисы успевают закрыть соединения и сбросить буферы.kill— грубо. SIGKILL сразу. Применять, если процесс завис и не отвечает на SIGTERM.rm— удаляет уже остановленный контейнер вместе с его writable-слоем. Всё, что туда писали без volume, уходит. Если хочешь сразу —rm -f, он сам остановит и удалит.
ps выводит мало — что добавить
docker ps по умолчанию режет команду и не показывает порты компактно.
Полезные флаги:
docker ps -a # включая exited
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'
docker ps -q # только ID, для пайпа в xargs
-q удобно для массовых операций:
docker stop $(docker ps -q) # стопнуть все запущенные
docker rm $(docker ps -aq) # удалить вообще все
Что важно запомнить
docker run — это «создать новый контейнер». Чтобы повторно запустить
существующий, нужен docker start <name>.
Образ запекается раз, контейнер — это эфемерный writable-слой поверх него.
Логи смотрят через docker logs, внутрь заходят через docker exec -it <name> sh. Не путать с docker run -it ... sh (это создаст новый
контейнер).
В следующем уроке разберём образы детальнее: слои, тэги, digest и
почему latest — ловушка.
Самопроверка
Впишите команду / ключевую строку. Регистр и пробелы не важны.
Дрилл · вопросы как на собесе
Проверь себя без подсказок
Сформулируй ответ вслух или письменно, потом раскрой и честно отметь: знал или нет.
В чём разница между образом и контейнером Docker?
DOC-003Как пробросить порт 80 контейнера на 8081 хоста?
DOC-013Как убить контейнер изнутри?
DOC-029Как контейнер может перезапускаться сам?
DOC-028В чём разница между `docker stop` и `docker pause`?
DOC-005Прошли материал до конца? Отметьте урок пройденным.
Прогресс сохранён в этом браузере
Почистишь историю или откроешь с телефона, и отметки пропадут. Оставь почту, они переедут в аккаунт. Пароль придумывать не нужно.
Готово. теперь в аккаунте: прогресс виден с любого устройства. Мой прогресс