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

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




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

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

Bash
docker run -it ubuntu

Здесь:

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

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

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

Проверим, что действительно запущена Ubuntu:

Bash
cat /etc/*release | grep DISTRIB_DESCRIPTION

Пример вывода:

INI
DISTRIB_DESCRIPTION="Ubuntu 24.04.2 LTS"

⚠️ Обратите внимание: команда uname -a покажет ядро хоста, так как контейнер использует его.


Именование контейнеров

Docker по умолчанию присваивает контейнеру случайное имя, например:

Bash
docker ps
NAMES
nostalgic_shtern

Вы можете задать своё имя с помощью опции --name:

Bash
docker run -it --name myubuntu ubuntu

💡Интересный факт: случайные имена формируются из прилагательного и фамилии известного учёного (например, «frosty_neumann«).


Список запущенных контейнеров

Для отображения текущих активных контейнеров используйте:

Bash
docker ps

Чтобы увидеть все контейнеры, включая завершённые:

Bash
docker ps -a

Список всех контейнеров, включая завершившиеся

Запуск в фоне: работа с демонами

Запустим контейнер с MySQL:

Bash
docker run -d mysql

Однако, если сразу посмотреть список:

Bash
docker ps

…контейнера может не оказаться. Почему? Он мог завершиться с ошибкой.

Bash
docker ps -a

Статус будет:

SCSS
Exited (1)

Чтобы узнать причину:

Bash
docker logs frosty_neumann

Пример вывода:

Bash
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 сообщает, что нужно передать переменную среды:

Bash
docker run --name mysql-test -e MYSQL_ROOT_PASSWORD=docker -d mysql

Подключение к работающему контейнеру

Используем docker exec для запуска команд внутри уже работающего контейнера:

Bash
docker exec -it mysql-test bash

Вы окажетесь внутри контейнера MySQL:

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

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

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

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

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

После:

Bash
├─containerd-shim(55206)─┬─bash(55477)
                         ├─mysqld(55225)─┬─mysqld(55362)

Появление нового процесса bash внутри контейнера

Также можно использовать docker top:

Bash
docker top mysql-test

Вывод покажет все процессы внутри контейнера.


Отладочный запуск без скрипта

Если вы хотите запустить контейнер и сразу получить доступ к командной строке, минуя начальный скрипт (docker-entrypoint.sh), используйте:

Bash
docker run -it --name mysql-test2 -e MYSQL_ROOT_PASSWORD=docker mysql /bin/bash

Затем:

Bash
bash-5.1# cat $(which docker-entrypoint.sh)

Разница в инициализации

Одинаковые команды запускают контейнер с одним и тем же образом:

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


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

Was this helpful?

0 / 0

Добавить комментарий 0