Як мені потрапити в оболонку контейнера Docker?


1160

Я починаю працювати з Докером. Я використовую базове зображення WordPress та докер-композицію.

Я намагаюся сш в один з контейнерів, щоб перевірити файли / каталоги, які були створені під час початкової збірки. Я намагався бігати docker-compose run containername ls -la, але це нічого не робило. Навіть якби це було, я б скоріше мав консоль, де я міг би переходити структуру каталогів, а не виконувати одну команду. Який правильний спосіб зробити це за допомогою Докера?


Тож це звучить як відповідь - прикріплення докер. Але як я можу дійти до цього з докер-композиту?
— Андрій

3
Використовуйте docker exec askubuntu.com/a/543057/35816 . Отримайте ідентифікатор контейнера за допомогоюdocker ps
— Mauricio Scheffer

26
sudo docker run -it --entrypoint /bin/bash <container_name>інтерактивно потрапляє в контейнер. Тоді можна перевірити файлову систему в контейнері за допомогоюcd <path>
— Сергій

Відповіді:


1729

docker attachдозволить вам підключитися до свого контейнера Docker, але це насправді не те саме, що ssh. Якщо, наприклад, у вашому контейнері працює веб-сервер, docker attachймовірно, він підключить вас до вибору процесу веб-сервера. Це не обов'язково дає вам оболонку.

docker execКоманда, ймовірно , що ви шукаєте; це дозволить запускати довільні команди всередині наявного контейнера. Наприклад:

docker exec -it <mycontainer> bash

Звичайно, будь-яка команда, яку ви виконуєте, повинна існувати у файловій системі контейнерів.

У вищевказаній команді <mycontainer>є ім'я або ідентифікатор цільового контейнера. Не має значення, користуєтесь ви чи ні docker compose; просто запустіть docker psі використовуйте або ідентифікатор (шістнадцятковий рядок, відображений у першому стовпці), або ім'я (відображається у фінальному стовпчику). Наприклад, дано:

$ docker ps
d2d4a89aaee9        larsks/mini-httpd   "mini_httpd -d /cont   7 days ago          Up 7 days                               web                 

Я можу бігати:

$ docker exec -it web ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
18: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.3/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:acff:fe11:3/64 scope link 
       valid_lft forever preferred_lft forever

Я міг би зробити те ж саме, запустивши:

$ docker exec -it d2d4a89aaee9 ip addr

Так само я міг запустити оболонку в контейнер;

$ docker exec -it web sh
/ # echo This is inside the container.
This is inside the container.
/ # exit
$

76
Також docker execпрацює лише на запущених контейнерах (в іншому випадку використовувати docker run -it --entrypoint /bin/bashабо подібні).
— L0j1k

59
для вашої зручності, -itце поєднання -iі -tщо --interactive( «Keep STDIN відкрити , навіть якщо не підключений») , відповідно --tty( «Розподілити псевдо-TTY»).
— Адріан Федер

23
У контейнерах на базі Alpine Linux у вас може не бути bash, тому, якщо так, використовуйте sh замість цього.
— Робін Грін

9
@ L0j1k це docker run -it --entrypoint /bin/bash <imageid> --any --more --args, просто для уточнення для людей
— Олександр Міллз

2
@AlexanderMills Так, і щоб уточнити далі, ті, хто у --any --more --argsвас буде, будуть введені в те, що зображення визначило як своє, CMDа не докерське (або якщо ваше зображення визначає лише " ENTRYPOINTа" і "ні") CMD, ці параметри будуть введені, /bin/bashяк ви вказали тут ). Так, наприклад, будь-які інші docker runпараметри (наприклад --net "host") потрібно пройти перед <imageid>.
— L0j1k

302

Щоб ударити в запущений контейнер, введіть це:

docker exec -t -i container_name /bin/bash

або

docker exec -ti container_name /bin/bash

або

docker exec -ti container_name sh

Припускаючи, що це контейнер Linux?
— Пітер Мортенсен

5
/ bin / bash wasnt was just bash зробив це для мене
— Anand Varkey Philips

6
Я б хотів docker exec -itзамість цьогоdocker exec -t -i
— VaTo

яка різниця @VaTo
— AATHITH RAJENDRAN

@AATHITHRAJENDRANI просто віддайте перевагу більш короткій формі команди, а не двом прапорам, ви можете включити ці два варіанти в один аргумент -it.
— VaTo

85

Скажімо, з власних причин ви дійсно хочете використовувати SSH. Проходить кілька кроків, але це можна зробити. Ось команди, які ви запустили б у контейнер, щоб налаштувати його ...

apt-get update
apt-get install openssh-server

mkdir /var/run/sshd
chmod 0755 /var/run/sshd
/usr/sbin/sshd

useradd --create-home --shell /bin/bash --groups sudo username ## includes 'sudo'
passwd username ## Enter a password

apt-get install x11-apps ## X11 demo applications (optional)
ifconfig | awk '/inet addr/{print substr($2,6)}' ## Display IP address (optional)

Тепер ви навіть можете запускати графічні програми (якщо вони встановлені в контейнері), використовуючи пересилання X11 на клієнт SSH:

ssh -X username@IPADDRESS
xeyes ## run an X11 demo app in the client

Ось деякі пов'язані ресурси:


33

Якщо ви шукаєте відповідь Docker Compose, як я, це забезпечує простий спосіб без пошуку ідентифікованого ідентифікатора контейнера.

docker-compose execприймає назву служби відповідно до вашого docker-compose.ymlфайлу.

Отже, щоб отримати оболонку Bash для вашої "веб-служби", ви можете зробити:

$ docker-compose exec web bash

docker-compose runпрацює також, якщо ваш контейнер ще не існує.
— Павло

23

Зауважте : ця відповідь сприяє написаному інструментом.

Я створив контейнерний SSH-сервер, який ви можете "приклеїти" до будь-якого запущеного контейнера. Таким чином ви можете створювати композиції з кожного контейнера. Єдина вимога - контейнер має Bash.

Наступний приклад запустить SSH-сервер, приєднаний до контейнера з назвою "my-container".

docker run -d -p 2222:22 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e CONTAINER=my-container -e AUTH_MECHANISM=noAuth \
  jeroenpeeters/docker-ssh

ssh localhost -p 2222

Коли ви підключитесь до цієї служби SSH (з вибором вашого SSH-клієнта), в контейнері буде розпочато сеанс Bash з назвою "мій-контейнер".

Більше додаткових покажчиків та документації див: https://github.com/jeroenpeeters/docker-ssh


1
Це досить мило. Велика перевага зробити це таким чином - ви отримуєте повністю функціональний термінал. Коли я використовував "docker exec" підхід, тоді я не міг очистити вміст терміналу, lessпоказував попередження кожного разу, коли я його запускаю і т.д. Використання контейнера Jeroen дає мені набагато кращий досвід поки що. Просто переконайтеся, що перегляньте документацію . Зразок команди у відповіді вже не здається дійсним.
— Rafał G.

1
це чудовий інструмент. Чи знаєте ви, як я можу використовувати його як докерний агент донк-конвеєра Дженкінса? Я хочу, щоб jenkins перенесла деякі файли SCP на віддалений хост і
— Gilson

21

Якщо ви використовуєте Docker в Windows і хочете отримати доступ до оболонки до контейнера, скористайтеся цим:

winpty docker exec -it <container_id> sh

Швидше за все, у вас уже встановлений Git Bash . Якщо ви цього не зробите, не забудьте встановити його.


1
Передбачає контейнер Linux Docker?
— Пітер Мортенсен

1
docker exec -ti <container_id> cmd працює добре
— PBo

17

Якщо контейнер вже вийшов (можливо, через певну помилку), ви можете зробити це

$ docker run --rm -it --entrypoint /bin/ash image_name

або

$ docker run --rm -it --entrypoint /bin/sh image_name

або

$ docker run --rm -it --entrypoint /bin/bash image_name

щоб створити новий контейнер і отримати в нього оболонку. Оскільки ви вказали --rm, контейнер буде видалено при виході з оболонки.


16

У деяких випадках ваше зображення може бути на альпійській основі. У цьому випадку він кине:

Ошибка виконання OCI exec: збій exec: container_linux.go: 348: запуск контейнерного процесу викликав "exec: \" bash \ ": виконуваний файл не знайдений у $ PATH": невідомо

Тому /bin/bashщо не існує. Замість цього слід використовувати:

docker exec -it 9f7d99aa6625 ash

або

docker exec -it 9f7d99aa6625 sh

15

SSH в контейнер Docker за допомогою цієї команди:

sudo docker exec -i -t (container ID) bash

12

Для підключення до cmd у контейнері Windows використовуйте

docker exec -it d8c25fde2769 cmd

Де d8c25fde2769 - ідентифікатор контейнера.


11

Це просто !

Перерахуйте всі ваші зображення Docker:

sudo docker images

У моїй системі він показав такий вихід:

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
bash                latest              922b9cc3ea5e        9 hours ago
14.03 MB
ubuntu              latest              7feff7652c69        5 weeks ago         81.15 MB

У мене на ПК два зображення Docker. Скажімо, я хочу запустити перший.

sudo docker run -i -t ubuntu:latest /bin/bash

Це дасть вам термінальний контроль над контейнером. Тепер ви можете виконувати всі типи операцій з оболонкою всередині контейнера. Як і робити, lsвиведе всі папки в корені файлової системи.

bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

11

Щоб перевірити файли, запустіть, docker run -it <image> /bin/shщоб отримати інтерактивний термінал. Список зображень можна отримати за допомогою docker images. На відміну від docker execцього рішення працює і в тому випадку, коли зображення не запускається (або закривається відразу після запуску).


Імовірна образа Linux Docker?
— Пітер Мортенсен

10

ГОЛОВНЕ РІШЕННЯ

встановити goinsideінструмент командного рядка за допомогою:

sudo npm install -g goinside

і зайти всередину докерного контейнера належного розміру терміналу з:

goinside docker_container_name

стара відповідь

Ми розмістили цей фрагмент ~/.profile:

goinside(){
    docker exec -it $1 bash -c "stty cols $COLUMNS rows $LINES && bash";
}
export -f goinside

Мало того, що це дозволяє всім потрапити всередину запущеного контейнера за допомогою:

goinside containername

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

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


1
Дякую. Це працює як принадність, принаймні для тих зображень, які вже включені в удар. Можливо, зображення для альпійських зображень не можуть бути виправлені за допомогою іншої функції, спеціально написаної для sh / ash тощо.
— Gaurav Bhaskar

8
$ docker exec -it <Container-Id> /bin/bash

Або залежно від оболонки, це може бути

$ docker exec -it <Container-Id> /bin/sh

Ви можете отримати контейнер-Id черезdocker ps команди

-i = інтерактивний

-t = виділити psuedo-TTY


8

Я створив функцію терміналу для полегшення доступу до терміналу контейнера. Можливо, вам це також стане в нагоді:

Отже, результат замість того, щоб вводити:

docker exec -it [container_id] /bin/bash

ти напишеш:

dbash [container_id]

Помістіть у своєму ~ / .bash_profile (або будь-що інше, що працює для вас), а потім відкрийте нове вікно терміналу і насолоджуйтесь ярликом:

#usage: dbash [container_id]
dbash() {
    docker exec -it "$1" /bin/bash
}

7

ви можете взаємодіяти з терміналом у контейнері docker, передавши параметр -ti

docker run --rm -ti <image-name>
eg: docker run --rm -ti ubuntu

-t означає термінал -i означає інтерактивний


6

docker execоднозначно буде рішенням. Найпростішим способом роботи з заданим вами питанням є встановлення каталогу в Docker до каталогу локальної системи .

Так що ви зможете миттєво переглянути зміни в локальному шляху.

docker run -v /Users/<path>:/<container path> 

1
ваша команда насправді монтує каталог хосту в контейнер.
— Demonbane

Ага! Перенесіть резервну копію в інший каталог, потім встановіть гучність, а потім перемістіть резервну копію в змонтовану папку.
— Пратік

6

Використання:

docker attach <container name/id here>

Інший спосіб, хоч і є для нього небезпека, - використовувати attach , але якщо ви Ctrl+ Cдля виходу з сеансу, ви також зупините контейнер. Якщо ви просто хочете побачити, що відбувається, використовуйте docker logs -f.

:~$ docker attach --help
Usage:  docker attach [OPTIONS] CONTAINER

Attach to a running container

Options:
      --detach-keys string   Override the key sequence for detaching a container
      --help                 Print usage
      --no-stdin             Do not attach STDIN
      --sig-proxy            Proxy all received signals to the process (default true)


4

Якщо у вас встановлений Docker Kitematic, ви можете використовувати графічний інтерфейс. Відкрийте Kitematicіконку Docker і у Kitematicвікні виберіть контейнер, а потім натисніть наexec іконку.

У цьому графічному інтерфейсі ви також можете побачити журнал контейнерів та багато інформації про контейнер (на вкладці налаштувань).

Виберіть у меню Kitematic

Клацніть на exec


2

У моєму випадку мені з певних причин потрібно перевірити всю інформацію, що стосується мережі, у кожному контейнері. Отже, наступні команди повинні бути дійсними в контейнері ...

ip
route
netstat
ps
...

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

Скажімо, у вас є один запущений контейнер під назвою light-test. Виконайте наведені нижче дії.

  • docker inspect light-test -f {{.NetworkSettings.SandboxKey}}. Ця команда отримає відповідь типу /var/run/docker/netns/xxxx.
  • Потім ln -s /var/run/docker/netns/xxxx /var/run/netns/xxxx. Каталог може не існувати, зробіть mkdir /var/run/netnsспочатку.
  • Тепер ви можете виконати, ip netns exec xxxx ip addr showщоб вивчити мережевий світ у контейнері.

PS. xxxxзавжди однакове значення, отримане від першої команди. І звичайно, будь-які інші команди є дійсними, тобто ip netns exec xxxx netstat -antp|grep 8080.


1

Ще один варіант - використовувати nsenter .

PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid

2
З цим існує низка проблем nsenter. По-перше, це вимагає від вас фізичного доступу до хоста докера, що не є даним (можливо, ви працюєте з віддаленим API докера). Крім того, біг під програмою nsenterзвільняє вас від декількох обмежень щодо безпеки та ресурсів, які встановлює Докер (що може бути профі чи противником, залежно від вашого оточення).
— larsks

1
Навіть автор nsenter каже, що користуватися в docker execці дні.
— L0j1k

1
@larsks Так, обидва мають свої переваги. Наприклад, ця послуга є перевагою nsenter docker exec. docker execмені виглядає більш елегантно.
— xuhdev

2
@ L0j1k Просто щоб бути менш заплутаним: публікація, яку ви послали, - не автор nsenter, а автор зображення Docker, який працює з nsenter.
— xuhdev

1

Якщо ви використовуєте Docker Compose, це переведе вас у контейнер Docker.

docker-compose run container_name /bin/bash

Всередині контейнера він доставить вас до WORKDIR, визначеного в Dockerfile. Ви можете змінити свій робочий каталог за допомогою

WORKDIR directory_path # E.g  /usr/src -> container's path

0

Для виконання в запущеному контейнері з іменем testнижче наведені нижче команди

Якщо контейнер має bashоболонку

docker exec -it test /bin/bash

Якщо контейнер має bourneоболонку і в більшості випадків він присутній

docker run -it test /bin/sh

-3

Для докер-композиції (Docker4Drupal)

docker-compose exec php bash

Я використовую Docker для Drupal на ноутбуці Linux. Після запуску контейнера я використовую " docker-compose exec php bash" для з'єднання з контейнером, щоб я міг запускати ударні командоси. Це прекрасно працює для мене.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.