← Docker
12 мин · просто · Урок 2 из 8

Первый контейнер

docker run и его флаги, ps/logs/exec, как зайти внутрь работающего контейнера и чем отличается образ от контейнера.

docker run: самая базовая команда

Шаблон:

docker run [флаги] <образ> [команда]

Если опустить <команда> — запустится та, что зашита в образе (через CMD или ENTRYPOINT, см. урок про Dockerfile). Если указать - переопределит.

Минимальный пример:

docker run alpine echo "hello"

Что произошло:

  1. Docker проверил, есть ли образ alpine локально. Нет — дёрнул Docker Hub и скачал.
  2. Создал контейнер: новые namespace, новый rootfs, writable-слой поверх образа.
  3. Запустил внутри echo "hello" как pid 1.
  4. Процесс завершился — контейнер перешёл в состояние exited. Он не удалён, просто остановлен. Его можно docker start обратно.

Ключевые флаги

ФлагЧто делаетКогда нужен
-ddetached, контейнер уходит в фондля сервисов (nginx, postgres)
-itinteractive + 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. Сами по себе они означают:

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

Это три разные сущности. Путать их — типичная ошибка новичка.

Из одного образа можно запустить десять контейнеров — каждый со своим 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>удалить остановленный контейнер
running exited removed docker run docker stop / kill docker start docker rm
Четыре команды, три состояния. Удалить можно только остановленный контейнер.

Типичный сеанс при отладке:

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

Эти три путаются часто.

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 — ловушка.

Самопроверка

Впишите команду / ключевую строку. Регистр и пробелы не важны.

1. Запусти nginx в фоне, проброс 8080 хоста на 80 контейнера, имя контейнера web.
2. Посмотри логи контейнера `web` в режиме follow (хвост в реальном времени).
3. Зайди внутрь работающего контейнера `web` и запусти `sh` в интерактивном режиме.

Дрилл · вопросы как на собесе

Проверь себя без подсказок

Сформулируй ответ вслух или письменно, потом раскрой и честно отметь: знал или нет.

01

В чём разница между образом и контейнером Docker?

DOC-003
02

Как пробросить порт 80 контейнера на 8081 хоста?

DOC-013
03

Как убить контейнер изнутри?

DOC-029
04

Как контейнер может перезапускаться сам?

DOC-028
05

В чём разница между `docker stop` и `docker pause`?

DOC-005

Прошли материал до конца? Отметьте урок пройденным.