Как получить bash или ssh в работающий контейнер в фоновом режиме?

Я хочу ssh или bash в работающий докер-контейнер. Пожалуйста, посмотрите пример:

$ sudo docker run -d webserver
webserver is clean image from ubuntu:14.04
$ sudo docker ps
CONTAINER ID  IMAGE            COMMAND    CREATED STATUS  PORTS          NAMES
665b4a1e17b6  webserver:latest /bin/bash  ...     ...     22/tcp, 80/tcp loving_heisenberg 

теперь я хочу получить что-то вроде этого (перейти в запущенный контейнер):

$ sudo docker run -t -i webserver (or maybe 665b4a1e17b6 instead)
$ root@665b4a1e17b6:/# 
However when I run the line above I get new CONTAINER ID
$ root@42f1e37bd0e5:/#

Я использовал Vagrant и хотел бы получить поведение, подобное vagrant ssh.

933
задан 11.11.2016, 17:16

14 ответов

Ответ является Докером attach команда. Таким образом для моего примера выше, решение будет:

$ sudo docker attach 665b4a1e17b6 #by ID
or
$ sudo docker attach loving_heisenberg #by Name
$ root@665b4a1e17b6:/#

Для версии 1.3 Докера или позже: Благодаря пользователю WiR3D, кто предложил другой способ получить оболочку контейнера. Если мы используем attach, мы можем использовать только один экземпляр оболочки. Таким образом, если мы хотим открытый новый терминал с новым экземпляром оболочки контейнера, мы просто должны выполнить следующее:

$ sudo docker exec -i -t 665b4a1e17b6 /bin/bash #by ID

или

$ sudo docker exec -i -t loving_heisenberg /bin/bash #by Name
$ root@665b4a1e17b6:/#
1306
ответ дан 07.10.2019, 10:22
  • 1
    С другой стороны, выполнитесь sudo docker attach loving_heisenberg – Acorn 21.09.2014, 22:59
  • 2
    команда присоединения не работает на меня, она заставляет докера замораживаться.. какие-либо идеи, почему его случай? – Nanhe Kumar 21.10.2014, 11:32
  • 3
    Напоминание для boot2docker пользователей: удалите sudo:) – Ben Wilson 29.12.2014, 15:56
  • 4
    -i -t равняется -it – Ryan Stefan 12.08.2016, 10:57
  • 5
    Это - опасный ответ, который будет выбран и так высоко проголосуется. docker attach луг к экземпляру MongoDB, например, уничтожит экземпляр. Как объяснено более подробно в этот вопрос attach и exec различные животные. – pad 10.05.2017, 21:27

Чтобы колотить в бегущий контейнер, напечатайте это:

docker exec -t -i container_name /bin/bash
0
ответ дан 07.10.2019, 10:22
  • 1
    это - тот же ответ как @AdamKalnas хотя – Erno de Weerd 06.09.2016, 20:33

Только для получения информации. Если необходимо войти в систему в простом контейнере, который не является демоном, необходимо использовать следующие команды:

docker start {id}
docker attach {id}
0
ответ дан 07.10.2019, 10:22

если контейнер остановлен как, например, контейнер только для данных тогда, хорошее решение состоит в том, чтобы управлять одноразовым контейнером каждый раз, когда Вы хотите быть свойственными контейнеру данных. В этом случае сам контейнер данных мог быть совершенно пустым, поскольку у временного контейнера будут инструменты OS.

$ docker run --rm --volumes-from mydata -it ubuntu bash
root@645045d3cc87:/# ls /mydata
root@645045d3cc87:/# touch /mydata/foo
root@645045d3cc87:/# exit
exit
-1
ответ дан 07.10.2019, 10:22

Можно также дать контейнеру Докера routeable IP-адрес с Трубопроводкой, и после этого SSH в машину с тем новым IP-адресом.

Это будет более "традиционным" (ssh), вместо того, чтобы использовать специализированную команду как docker attach, и в конечном счете сделает его более 'портативным' через системы и версии.

4
ответ дан 07.10.2019, 10:22
  • 1
    Добавьте simples путь, как сделать это. Если честно говоря, мне действительно нужен он, но у меня нет времени искать простое решение это. Вы могли отправить свой ответ здесь? Это было бы большим.. – EKS 29.10.2014, 14:08
  • 2
    Существует 2 способа выполнить это, но это isn' t простой, и стал бы большим сообщением. Вы могли проверить этот ссылка собой для использования трубопроводки или этого ссылка , ведьма по существу выполняет то же как Трубопроводку и немного более проста, но необходимо сделать это вручную. Таким образом, это зависит о сколько серверов где разговор. Если Вы can' t выясняют что-то более определенное, сообщают мне. Но я также don' t имеют время для записи полного учебного руководства. – bernhof 29.10.2014, 14:30
  • 3
    Вы правы - нет никакого очевидного и простого способа сделать это (Спасибо за ссылки, я думаю, что пересмотрю его позже. – Mike Seeds 29.10.2014, 14:57
docker run -it openjdk:8

Это работает :-)

2
ответ дан 07.10.2019, 10:22

Иногда будет удобно смочь к ssh в контейнер Докера, особенно во время разработки. Следующее изображение Докера позволяет ssh в контейнер с помощью закрытого ключа:

UbuntuWithSSH-докер

суть Dockerfile https://gist.github.com/devbkhadka/98792f7bca57f9778793b2db758b3d07.

3
ответ дан 07.10.2019, 10:22

На основе ответа @Timur я создал следующий удобный сценарий

Установка

Помещенный docker-ssh файл в Ваш $PATH со следующим содержанием

#!/bin/bash -xe

# docker container id or name might be given as a parameter
CONTAINER=$1

if [[ "$CONTAINER" == "" ]]; then
  # if no id given simply just connect to the first running container
  CONTAINER=$(docker ps | grep -Eo "^[0-9a-z]{8,}\b")
fi

# start an interactive bash inside the container
# note some containers don't have bash, then try: ash (alpine), or simply sh
# the -l at the end stands for login shell that reads profile files (read man)
docker exec -i -t $CONTAINER bash -l

Примечание : Некоторый контейнер не содержит bash, но ash, sh и т.д. В этих случаях bash буду заменен в вышеупомянутом сценарии.

Использование

, Если у Вас есть только один рабочий экземпляр, просто выполните

[111]gt; docker-ssh 

Иначе, предоставьте ему идентификационный параметр докера, который Вы получаете от docker ps (первое седло)

[112]gt; docker-ssh 50m3r4nd0m1d
18
ответ дан 07.10.2019, 10:22

От Докера 1.3 вперед:

docker exec -it <containerIdOrName> bash

В основном, если контейнер Докера был запущен с помощью эти /bin/bash команда, можно получить доступ к нему с помощью attach. В противном случае тогда необходимо выполнить команду для создания экземпляра Bash в контейнере с помощью exec.

Также для выхода из Bash, не оставляя Bash, работающий в процессе жулика:

exit

Да, это настолько просто.

673
ответ дан 07.10.2019, 10:22
  • 1
    все еще не выяснили, как заставить нано работать. Думайте, что это может вовлечь докера-ssh от phusion – Daniel Bang 29.10.2014, 15:46
  • 2
    Там какой-либо путь состоит в том, чтобы установить удар по умолчанию в докерах? – Tony 06.04.2015, 16:13
  • 3
    @ipeacocks да, если эти RUN команда в dockerfile /bin/bash. Но зависит, что Вы имеете в виду. Если Вы хотите работать, контейнер и сразу иметь удар в наличии в том же самом терминале, тогда работающем с -it, должен сделать это – Francis Avila 07.04.2015, 10:43
  • 4
    Используя докера группа является плохой практикой. Любой пользователь, который находится в группе докера, по существу используется с корневыми полномочиями без потребности использовать sudo. projectatomic.io/blog/2015/08/… – mehdix_ 07.03.2016, 19:48
  • 5
    Я думаю он doesn' t имеют много значения с точки зрения безопасности хоста, используете ли Вы sudo по сравнению с docker группа. Так или иначе существует дыра в системе безопасности, встроенная в докера, который может обеспечить полные полномочия в файловой системе хоста от гостя - независимо от того, используете ли Вы группу докера или sudo для запуска контейнера. – Wade 12.08.2017, 00:39

Если Ваш контейнер не имеет удара, установил Вас, мог бы попробовать sh:

docker exec -it CONTAINER /bin/sh

Или ищут оболочки в / мусорном ведре сначала:

docker export CONTAINER|tar -t|egrep ^bin/
11
ответ дан 07.10.2019, 10:22
  • 1
    Что " consul" ? У Вас есть ссылка для него? Сделайте Вы имеете в виду " console" ? – Kiquenet 05.08.2018, 16:28

@jpetazzo имеет потрясающее сообщение об этом предмете . Короткий ответ должен был бы использовать nsenter:

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

P.S.: не забывайте проверять обсуждение в комментарии сообщения...

Аплодисменты

6
ответ дан 07.10.2019, 10:22

Я создал контейнеризированный сервер SSH, который предоставляет возможности SSH любому рабочему контейнеру. Вы не должны изменять свой контейнер. Единственное требование - то, что контейнер имеет удар.

, Если у Вас есть контейнер с именем 'сеть-server1'. Следующая команда выполнения докера запустила бы второй контейнер, который обеспечит SSH для первого контейнера.

docker run -ti --name sshd-web-server1 -e CONTAINER=web-server1 -p 2222:22 \
-v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker \
jeroenpeeters/docker-ssh

Для большего количества указателей, контроль https://github.com/jeroenpeeters/docker-ssh

9
ответ дан 07.10.2019, 10:22
  • 1
    Это должно быть принятым ответом ^ – Steven 08.07.2017, 09:03
  • 2
    Между прочим, как мы можем иметь .bashrc автоматический загруженный при запуске ssh сессии с помощью решения? Также отправленный проблема о github github.com/jeroenpeeters/docker-ssh/issues/30 – Bernhard Kircher 08.07.2017, 09:05

Попробуйте это:

sudo docker run -i -t webserver /bin/bash

Источник: https://docs.docker.com/articles/basics/#running-an-interactive-shell

27
ответ дан 07.10.2019, 10:22
  • 1
    Это не подходит, потому что я получаю различный КОНТЕЙНЕРНЫЙ идентификатор (root@42f1e37bd0e5:/# а не root@665b4a1e17b6:/#) – Mirage 01.08.2014, 19:31
  • 2
    ссылка мертва, необходимо обновить – Nour Chawich 15.04.2018, 18:04

Хотя автор вопроса конкретно сказал, что они интересуются рабочим контейнером, также стоит отметить, что, если бы контейнер не работает, но требуется работать, это для ввода по абсолютному адресу вокруг Вас может работать:

docker run -i -t --entrypoint /bin/bash <imageID>

123
ответ дан 07.10.2019, 10:22
  • 1
    Это дает различный контейнер, точно так же, как @kraxor' s ответ. – Ignacio Vazquez 17.09.2015, 18:39

Теги

Похожие вопросы