Docker — мощный инструмент для упаковки, распространения и запуска приложений в изолированной среде. Однако для новичков порой бывает неочевидно, как правильно запускать контейнеры, особенно с различными опциями и параметрами. В этой статье мы подробно рассмотрим запуск контейнеров в интерактивном и фоновом режимах, разберем ошибки, возникающие при старте, и научимся работать с логами и процессами контейнеров.
Первый запуск контейнера: Ubuntu в интерактивном режиме
Самый простой способ запустить контейнер — использовать команду docker run. Если образ ещё не загружен локально, Docker автоматически скачает его из Docker Hub.
docker run -it ubuntu
Здесь:
- -i — запуск в интерактивном режиме;
- -t — создание псевдотерминала;
- ubuntu — имя образа.
Вы оказываетесь в консоли, где работаете как пользователь root.
Проверим, что действительно запущена Ubuntu:
cat /etc/*release | grep DISTRIB_DESCRIPTION
Пример вывода:
DISTRIB_DESCRIPTION="Ubuntu 24.04.2 LTS"
⚠️ Обратите внимание: команда uname -a покажет ядро хоста, так как контейнер использует его.
Именование контейнеров
Docker по умолчанию присваивает контейнеру случайное имя, например:
docker ps
NAMES
nostalgic_shtern
Вы можете задать своё имя с помощью опции --name:
docker run -it --name myubuntu ubuntu
💡Интересный факт: случайные имена формируются из прилагательного и фамилии известного учёного (например, "frosty_neumann").
Список запущенных контейнеров
Для отображения текущих активных контейнеров используйте:
docker ps
Чтобы увидеть все контейнеры, включая завершённые:
docker ps -a
Запуск в фоне: работа с демонами
Запустим контейнер с MySQL:
docker run -d mysql
Однако, если сразу посмотреть список:
docker ps
…контейнера может не оказаться. Почему? Он мог завершиться с ошибкой.
docker ps -a
Статус будет:
Exited (1)
Чтобы узнать причину:
docker logs frosty_neumann
Пример вывода:
2025-05-13 20:18:20+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
You need to specify one of the following as an environment variable:
- MYSQL_ROOT_PASSWORD
- MYSQL_ALLOW_EMPTY_PASSWORD
- MYSQL_RANDOM_ROOT_PASSWORD
Docker сообщает, что нужно передать переменную среды:
docker run --name mysql-test -e MYSQL_ROOT_PASSWORD=docker -d mysql
Подключение к работающему контейнеру
Используем docker exec для запуска команд внутри уже работающего контейнера:
docker exec -it mysql-test bash
Вы окажетесь внутри контейнера MySQL:
Анализ процессов внутри контейнера
Для визуального понимания структуры процессов внутри контейнера используем pstree.
До подключения через exec:
sudo pstree -p
├─containerd-shim(55206)─┬─mysqld(55225)─┬─mysqld(55362)
После:
├─containerd-shim(55206)─┬─bash(55477)
├─mysqld(55225)─┬─mysqld(55362)
Также можно использовать docker top:
docker top mysql-test
Вывод покажет все процессы внутри контейнера.
Отладочный запуск без скрипта
Если вы хотите запустить контейнер и сразу получить доступ к командной строке, минуя начальный скрипт (docker-entrypoint.sh), используйте:
docker run -it --name mysql-test2 -e MYSQL_ROOT_PASSWORD=docker mysql /bin/bash
Затем:
bash-5.1# cat $(which docker-entrypoint.sh)
Разница в инициализации
Одинаковые команды запускают контейнер с одним и тем же образом:
docker ps -a
COMMAND
"docker-entrypoint.sh"
Но pstree покажет разную инициализацию:
- В mysql-test запускается mysqld как основной процесс.
- В mysql-test2 — только bash, MySQL не запущен.
Заключение
Теперь вы знаете, как запускать Docker-контейнеры:
- в интерактивном режиме (-it);
- в фоне (-d);
- с именем (--name);
- с переменными среды (-e);
- с отладкой (/bin/bash вместо скрипта);
- и как анализировать процессы (pstree, docker top).
Docker — несложен, если понимать, как он работает "под капотом". Осваивайтесь, экспериментируйте и не бойтесь ошибок — именно так приходит опыт.