Урок 2 из 8 · 20 мин · обновлено

Первый контейнер: запуск, список, логи, остановка

Как запустить контейнер с веб-сервером и открыть его в браузере, посмотреть список контейнеров и логи, остановить, запустить снова и удалить, а также зайти в контейнер в интерактивном режиме.

Запускаем веб-сервер

hello-world напечатал строку и закончил работу. Настоящие программы работают долго: веб-сервер, база данных. Запустим популярный веб-сервер nginx в лёгком варианте alpine:

Терминал
docker run -d --name web -p 8080:80 nginx:alpine

Разберём по частям:

  • docker run — создать и запустить новый контейнер;
  • -d — в фоне: терминал сразу освободится;
  • --name web — имя контейнера, чтобы обращаться к нему по-человечески;
  • -p 8080:80 — порт 8080 вашего компьютера ведёт на порт 80 внутри контейнера;
  • nginx:alpine — образ и его тег: имя версии.

Откройте в браузере http://localhost:8080 — увидите страницу «Welcome to nginx!». Веб-сервер работает в контейнере, а вы ничего не устанавливали, кроме Docker. Подробнее о портах — в уроке 6.

Что сейчас работает

Терминал
docker ps
Результат
CONTAINER ID   IMAGE          STATUS          PORTS                  NAMES
3f2a9c1b7e44   nginx:alpine   Up 2 minutes    0.0.0.0:8080->80/tcp   web

Вывод сокращён: Docker показывает ещё команду и время создания. Видно образ, статус, порты и имя.

docker ps показывает только работающие контейнеры. Все, включая остановленные, — docker ps -a. Там же будут два контейнера hello-world из прошлого урока.

Логи

Программа в контейнере пишет сообщения в журнал. Посмотреть его:

Терминал
docker logs web

Обновите страницу в браузере пару раз и снова посмотрите логи — появятся строки о запросах к серверу. Флаг -f показывает журнал в реальном времени, пока вы не нажмёте Ctrl + C:

Терминал
docker logs -f web

Логи — первое место, куда смотрят, если контейнер работает не так или сразу завершается.

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

Терминал
docker stop web     # остановить
docker start web    # запустить тот же контейнер снова
docker stop web
docker rm web       # удалить остановленный контейнер

Важно различать: docker start возвращает к работе существующий контейнер, а каждый docker run создаёт новый. Если выполнить docker run --name web … второй раз, Docker ответит ошибкой: имя web уже занято. Сначала удалите старый контейнер.

Работающий контейнер docker rm не удалит — сначала остановите его.

Заглянуть внутрь

Контейнер можно запустить с командной строкой внутри. Например, крошечный Linux alpine:

Терминал
docker run --rm -it alpine sh
  • -it — интерактивный режим с терминалом: вы вводите команды внутри контейнера;
  • --rm — удалить контейнер сразу после выхода;
  • sh — какую программу запустить внутри.

Попробуйте ls, cat /etc/os-release, затем exit — и контейнер исчезнет. Так удобно что-то быстро проверить, не засоряя систему.

Попробуйте сами. Запустите nginx под именем site на порту 8081, откройте его в браузере, посмотрите логи, остановите и удалите контейнер. Затем уберите два старых контейнера hello-world.

Решение
Терминал
docker run -d --name site -p 8081:80 nginx:alpine
docker ps
docker logs site
docker stop site
docker rm site

Страница открывается по адресу http://localhost:8081.

Контейнеры hello-world остановлены, но лежат в списке docker ps -a со случайными именами. Удалите их по имени или ID — достаточно первых символов ID:

Терминал
docker ps -a
docker rm 1b2c 4d5e

Вместо 1b2c и 4d5e подставьте начало ID своих контейнеров. Удалить разом все остановленные контейнеры можно командой docker container prune — она спросит подтверждение.

Мини-тест: проверьте себя

Закрепите урок: несколько вопросов, разбор ответов — в конце.

  1. Что делает флаг -d в команде docker run -d nginx:alpine?

  2. Вы остановили контейнер web. Почему docker ps его не показывает?

  3. Чем docker start web отличается от повторного docker run?

  4. Как удалить работающий контейнер web?