Як виконати команду docker exec у Docker-контейнері? (docker exec у контейнер)

Щоб виконати команду всередині запущеного Docker-контейнера, використовуйте:

docker exec -it <container_id> <command>

Наприклад, щоб відкрити оболонку bash:

docker exec -it mycontainer bash

Щоб виконати одну команду:

docker exec mycontainer ls /app

Docker - це популярний інструмент із відкритим кодом, який спрощує розгортання, масштабування і керування застосунками за допомогою технології контейнерів. Завдяки Docker-контейнерам розробники можуть пакувати застосунки разом із залежностями в портативні контейнери, забезпечуючи однакову роботу в різних середовищах.

Запускаєте docker exec на VPS? Переконайтеся, що вашому серверу вистачає ресурсів: ознайомтеся з Docker VPS-хостингом від BlueVPS.

Що робить docker exec?

Одна з ключових команд Docker - docker exec, яка дозволяє виконувати команди всередині запущеного контейнера. Ця можливість дає змогу безпосередньо взаємодіяти з процесами та середовищем контейнера, що корисно для усунення несправностей або керування застосунками.

Docker універсальний і сумісний з різними операційними системами, зокрема Linux, Windows і macOS. Його навіть можна встановити на віртуальний приватний сервер (VPS). Щоб налаштувати Docker, потрібно виконати певні кроки конфігурації для обраної платформи.

Як використовувати команду docker exec?

Перш ніж використовувати команду docker exec, переконайтеся, що Docker правильно встановлено у вашій системі. Потім визначте конкретний контейнер, у якому ви хочете виконати команду.

У цьому гайді розберемо команду docker exec. Ми покажемо, як запускати docker exec від імені root усередині Docker-контейнера на різних прикладах використання.

Передумови

  • Переконайтеся, що у вашій системі встановлено останню версію Ubuntu.
  • Встановіть Docker, виконавши кроки з офіційної документації Docker.
  • Додайте свого користувача до групи docker, щоб запускати команди Docker без введення пароля адміністратора щоразу.

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

Щоб показати, як використовувати команду docker exec, спочатку запустимо контейнер. 

Спершу завантажте образ у Docker-контейнер:

# docker pull redis

Ось приклад із контейнером Redis:

# docker run -d --name myredis redis

Ця команда запускає контейнер Redis у фоновому режимі (прапорець -d). Контейнер з іменем myredis слугуватиме нашим прикладом середовища для виконання команд.

Виконання команд усередині Docker-контейнера (Docker Container)

Щоб виконувати команди всередині контейнера, спершу потрібен його ID. Знайти ID контейнера можна, вивівши список усіх запущених контейнерів такою командою:

# docker ps

Коли у вас є ID контейнера (наприклад, 6a8b7d170a12), ви можете використовувати його для виконання команд усередині контейнера.

вивід команди docker exec у терміналі

Синтаксис команди docker exec (docker exec від імені root)

Загальний синтаксис команди docker exec такий:

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

Ось опції, які використовують найчастіше:

-d, --detach: Runs the command in the background.

--detach-keys: Sets a custom key sequence to detach from the container.

-e, --env: Specifies environment variables for the command.

--env-file: Loads environment variables from a file.

-i, --interactive: Keeps the standard input (STDIN) open even if not attached to a terminal.

--privileged: Grants the command extended privileges.

-t, --tty: Allocates a pseudo-terminal for the command.

-u, --user: Runs the command as a specific user or UID.

-w, --workdir:Sets the working directory inside the container for the command.

Виконання docker exec у контейнері в неінтерактивному режимі (docker exec у контейнер)

У неінтерактивному режимі можна виконати одну команду всередині запущеного контейнера. Наприклад, щоб перевірити версію Redis у запущеному контейнері, використайте таку команду:

# docker exec <container_id> redis-server --version

Ця команда виконує redis-server --version усередині вказаного контейнера (замініть <container_id> на реальний ID, наприклад 6a8b7d170a12). Вона отримує і виводить версію Redis безпосередньо у вашому терміналі.

Виконання команд в інтерактивній оболонці 

Інтерактивний режим дозволяє відкрити сеанс оболонки всередині контейнера, щоб виконувати кілька команд і досліджувати середовище контейнера. Щоб отримати доступ до інтерактивної оболонки, використовуйте такий синтаксис:

docker exec -it CONTAINER COMMAND [ARG...]

Наприклад, щоб відкрити оболонку в запущеному контейнері Redis, використайте:

# docker exec -it 6a8b7d170a12 bash

Замініть <container_id> на ID вашого контейнера Redis (наприклад, 6a8b7d170a12). Ця команда відкриває сеанс оболонки всередині контейнера, дозволяючи взаємодіяти із середовищем і виконувати кілька команд.

Приклад: виконання команди в інтерактивній оболонці (Docker bash)

Опинившись в оболонці, ви можете виконувати специфічні для Redis команди. Наприклад:

# redis-cli ping

Ця команда перевіряє стан сервера Redis, що працює в контейнері, і повертає PONG, якщо він працює правильно. Тепер ви можете за потреби досліджувати файлову систему і середовище контейнера.

інтерактивна оболонка bash у docker exec

Виконання docker exec від імені іншого користувача (docker exec as user)

За замовчуванням docker exec виконує команди всередині контейнера від імені root. Однак ви можете вказати для команди іншого користувача. Щоб виконати команду від імені конкретного користувача, використовуйте такий синтаксис:

docker exec -u USERNAME CONTAINER COMMAND [ARG...]

Наприклад, щоб виконати команду «whoami» від імені користувача redis усередині контейнера Redis, потрібно використати:

# docker exec -u redis 6a8b7d170a12 whoami

приклад docker exec від імені root

Виконання команд зі змінними середовища

Ви можете виконувати команди всередині контейнера, задаючи певні змінні середовища, за допомогою такого синтаксису:

docker exec -e VAR_NAME=VAR_VALUE CONTAINER COMMAND [ARG...]

Наприклад, щоб виконати команду env усередині контейнера Redis із власною змінною середовища, використайте:

# docker exec -e MY_VARIABLE='testing_env' <container_id> env

Це задає MY_VARIABLE значення testing_env, а потім виконує команду env, щоб показати змінні середовища контейнера. Цей спосіб корисний для безпечної передачі чутливих даних, наприклад API-ключів, у контейнер без їхнього розкриття в середовищі контейнера.

Приклади docker exec (типові сценарії використання)

Команда docker exec дозволяє виконувати команди всередині активного Docker-контейнера без його зупинки чи перезапуску. Її широко використовують для усунення несправностей, обслуговування, діагностики та разових адміністративних операцій. Типовий приклад docker exec - відкриття інтерактивної оболонки всередині запущеного контейнера, щоб переглянути файли, перевірити процеси або розібратися з проблемами застосунку.

Типові сценарії використання docker exec:

 1. Відкриття оболонки всередині запущеного контейнера.

Використовуйте docker exec -it з Bash або іншою оболонкою, щоб переглянути файли, процеси, права доступу і середовище контейнера.

 2. Перегляд конфігураційних файлів.

Адміністратори можуть перевірити налаштування застосунку, змінні середовища, змонтовані каталоги і права доступу до файлів. Зміни, внесені вручну, можуть бути втрачені під час повторного створення контейнера, тому постійні зміни слід додавати в образ або в змонтовану конфігурацію.

 3. Виконання команд бази даних.

docker exec зручно використовувати для запуску клієнтів баз даних, виконання SQL-запитів, застосування міграцій, створення резервних копій або виконання завдань з обслуговування.

 4. Перевірка системної інформації.

Команди ps, top, df, free і env допомагають діагностувати використання ресурсів, запущені процеси, дисковий простір і налаштування середовища.

 5. Очищення кешу застосунку.

Команди очищення кешу, специфічні для фреймворку, можна виконувати після змін у коді, маршрутизації, шаблонах або конфігурації.

 6. Перевірка мережевого з'єднання.

Такі інструменти, як curl, ping, wget або nslookup, допомагають перевірити з'єднання між контейнерами, базами даних, API і зовнішніми сервісами.

 7. Запуск скриптів обслуговування.

Ви можете виконувати імпорт даних, виправлення прав доступу, команди черг, тестування запланованих завдань та інші разові операції.

Ці приклади docker exec показують, чому ця команда незамінна для налагодження й адміністрування контейнерів. Проте її варто використовувати переважно для тимчасових завдань, а постійні зміни мають бути в Dockerfile, конфігурації Docker Compose, змінних середовища або змонтованих томах.

Як увійти в запущений Docker-контейнер

Іноді потрібно зазирнути всередину контейнера, поки застосунок ще працює. Це може знадобитися, щоб перевірити файли, переглянути конфігурацію, протестувати команду, перевірити процеси або знайти причину помилки. Здебільшого вхід у Docker-контейнер виконують за допомогою docker exec, бо ця команда дозволяє запустити оболонку всередині наявного контейнера без його повторного створення чи зупинки.

Спершу перевірте, які контейнери зараз активні:

docker ps

Скопіюйте ім'я або ID потрібного контейнера, а потім відкрийте інтерактивну оболонку:

docker exec -it container_name /bin/bash

Ця команда створює термінальний сеанс усередині контейнера. Опція -i залишає потік введення відкритим, а -t надає зручний термінальний інтерфейс.

Не кожен образ містить Bash. Мінімальні образи, особливо на основі Alpine Linux, часто мають лише стандартну оболонку sh. У такому разі використовуйте:

docker exec -it container_name /bin/sh

Це звичайний підхід, коли потрібно виконати exec у Docker-контейнер, а Bash недоступний.

Користувачі іноді шукають «docker get into container» або «docker login into container», але ці формулювання можуть вводити в оману. Команда docker login не відкриває контейнер. Вона використовується для автентифікації в Docker Hub або іншому реєстрі контейнерів. Щоб отримати доступ до середовища запущеного контейнера, правильна команда - docker exec.

Для сервісу, запущеного через Docker Compose, синтаксис трохи інший:

docker compose exec service_name sh

Опинившись усередині, ви можете переглядати каталоги, запускати діагностичні інструменти, перевіряти змінні середовища або виконувати разові завдання з обслуговування. Щоб закрити оболонку, введіть exit або натисніть Ctrl + D. Це завершує лише інтерактивний сеанс, сам контейнер продовжує працювати.

Оболонка в docker exec: Bash чи sh

Під час роботи з оболонкою через docker exec одне з перших рішень - запускати bash чи sh. Правильний вибір залежить від операційної системи та інструментів, що входять до образу контейнера.

Bash - функціональна оболонка, яка зазвичай доступна в Ubuntu, Debian та подібних дистрибутивах. Вона підтримує історію команд, автодоповнення клавішею Tab, аліаси, можливості для скриптів та інші інструменти, що роблять усунення несправностей і адміністрування зручнішими. Якщо вам потрібно запустити bash у запущеному контейнері, зазвичай це найкращий варіант:

docker exec -it container_name /bin/bash

Однак багато легких образів, як-от Alpine Linux, не містять Bash, щоб зберегти невеликий розмір образу. Натомість вони надають POSIX-сумісну оболонку sh, якої достатньо для більшості адміністративних завдань:

docker exec -it container_name /bin/sh

Якщо ви не впевнені, яка оболонка доступна, спершу спробуйте Bash. Якщо команда повертає помилку про те, що /bin/bash не існує, просто використайте sh. Цей підхід працює з більшістю мінімальних Docker-образів.

На практиці обидві оболонки дозволяють переглядати файли, перевіряти логи, редагувати конфігурацію і виконувати команди всередині контейнера. Bash забезпечує зручнішу інтерактивну роботу, а sh дає максимальну сумісність із різними образами контейнерів.

docker exec, docker run і docker attach: порівняння

Docker має кілька команд для взаємодії з контейнерами, але вони вирішують різні завдання. Розуміння того, коли використовувати кожну з них, допомагає уникнути типових помилок, особливо під час усунення несправностей або керування робочими навантаженнями в продакшені.

Команда

Що робить

Створює новий контейнер

Працює із запущеним контейнером

Типовий сценарій

docker run

Створює і запускає новий контейнер з образу

Так

Ні

Запуск застосунку або сервісу

docker exec

Запускає нову команду або оболонку всередині наявного контейнера

Ні

Так

Налагодження, обслуговування, виконання разових команд

docker attach

Підключається до основного процесу контейнера та його стандартного введення/виведення

Ні

Так

Перегляд основного застосунку або взаємодія з ним


Для більшості завдань адміністрування й усунення несправностей рекомендовано використовувати docker exec, бо ця команда дозволяє працювати всередині запущеного контейнера, не втручаючись у його основний процес.

Висновок

У цьому гайді розглянуто різні способи взаємодії з Docker-контейнерами: виконання команд у неінтерактивному режимі, доступ до інтерактивної оболонки, використання змінних середовища, а також виконання docker exec від імені root та іншого користувача. Ці методи дають гнучкість у керуванні Docker-контейнерами. Докладніше дивіться в офіційній документації docker exec.

Потрібне надійне середовище для ваших контейнерів? Розгорніть свої екземпляри Docker на високопродуктивних серверах BlueVPS.com.ua з безлімітним трафіком, масштабованими ресурсами та виділеним хостинг-середовищем.

 

Blog

FAQ