Урок 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 — она спросит подтверждение.
Мини-тест: проверьте себя
Закрепите урок: несколько вопросов, разбор ответов — в конце.
-
Что делает флаг -d в команде docker run -d nginx:alpine?
-d — detached, отсоединённый режим. Контейнер работает в фоне, а терминал свободен для других команд.
-
Вы остановили контейнер web. Почему docker ps его не показывает?
Остановленный контейнер существует, просто не работает. Его можно снова запустить командой docker start web.
-
Чем docker start web отличается от повторного docker run?
Каждый docker run создаёт новый контейнер. Чтобы вернуть к работе существующий, используют docker start.
-
Как удалить работающий контейнер web?
Docker не даёт удалить работающий контейнер простой командой rm — его сначала останавливают. Есть и флаг -f, но им пользуются осознанно.