Найти в Дзене

Docker. Запуск контейнеров.

Оглавление

Docker — мощный инструмент для упаковки, распространения и запуска приложений в изолированной среде. Однако для новичков порой бывает неочевидно, как правильно запускать контейнеры, особенно с различными опциями и параметрами. В этой статье мы подробно рассмотрим запуск контейнеров в интерактивном и фоновом режимах, разберем ошибки, возникающие при старте, и научимся работать с логами и процессами контейнеров.

Первый запуск контейнера: Ubuntu в интерактивном режиме

Самый простой способ запустить контейнер — использовать команду docker run. Если образ ещё не загружен локально, Docker автоматически скачает его из Docker Hub.

docker run -it ubuntu

Здесь:

  • -i — запуск в интерактивном режиме;
  • -t — создание псевдотерминала;
  • ubuntu — имя образа.

Вы оказываетесь в консоли, где работаете как пользователь root.

Пример запуска контейнера Ubuntu в интерактивном режиме
Пример запуска контейнера Ubuntu в интерактивном режиме

Проверим, что действительно запущена 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:

Работа в консоли MySQL-контейнера с помощью команды docker exec
Работа в консоли MySQL-контейнера с помощью команды docker exec

Анализ процессов внутри контейнера

Для визуального понимания структуры процессов внутри контейнера используем pstree.

До подключения через exec:

sudo pstree -p
├─containerd-shim(55206)─┬─mysqld(55225)─┬─mysqld(55362)

После:

├─containerd-shim(55206)─┬─bash(55477)
├─mysqld(55225)─┬─mysqld(55362)
Появление нового процесса bash внутри контейнера
Появление нового процесса bash внутри контейнера

Также можно использовать 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 — несложен, если понимать, как он работает "под капотом". Осваивайтесь, экспериментируйте и не бойтесь ошибок — именно так приходит опыт.

Дополнительный материал