Як мені потрапити в оболонку контейнера 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.