Вопрос: Как получить 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,


785
2017-08-01 16:19


Источник


альтернативно sudo docker exec -i -t 665b4a1e17b6 /bin/sh для установки apt-программ и пакетов - fonjeekay


Ответы:


Ответ Docker's attach команда. Итак, для моего примера выше, решение будет:

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

Для Docker версии 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:/#

1165
2017-08-05 06:01



В качестве альтернативы выполните sudo docker attach loving_heisenberg - thiagowfx
команда attach не работает для меня, это заставляет докер замораживать .. любые идеи, почему это происходит? - Mo J. Mughrabi
Напоминание для пользователей boot2docker: удалить sudo :) - Henno
-i -t равняется -it - pasha.zhukov
Это опасный ответ, который нужно выбрать и так проголосовать. docker attachнапример, к экземпляру MongoDB, он убьет экземпляр. Как поясняется более подробно в этот вопрос  attach а также exec являются разными животными. - fwc


Начиная с Docker 1.3 и далее:

docker exec -it <containerIdOrName> bash

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

Кроме того, чтобы выйти из Bash, не покидая Bash в процессе изгоев:

exit

Да, это так просто.


575
2017-10-29 07:46



еще не понял, как заставить нано работать. THink, который может включать докер-ssh от phusion - WiR3D
Есть ли способ установить bash по умолчанию в докеры? - ipeacocks
@ipeacocks да, если RUN команды в файле докеров /bin/bash, Но это зависит от того, что вы имеете в виду. Если вы хотите запустить контейнер и установить bash в тот же терминал, -it должен это сделать - WiR3D
Использование группы докеров - это плохая практика. Любой пользователь, который находится в группе докеров, по существу используется с правами root без использования sudo. projectatomic.io/blog/2015/08/... - Maiku Mori
Я думаю, что это не имеет большого значения, с точки зрения безопасности хоста, используете ли вы sudo против docker группа. В любом случае есть дыра безопасности, встроенная в докер, которая может предоставить полные привилегии в файловой системе хоста от гостя - независимо от того, используете ли вы группу докеров или sudo для запуска контейнера. - nobar


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

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


99
2017-11-07 18:46



Это дает другой контейнер, как и ответ @ kraxor. - Blaisorblade


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

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

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


24
2017-08-01 16:29



Это не подходит, потому что я получаю различный идентификатор контейнера (root@42f1e37bd0e5:/# и не root@665b4a1e17b6:/#) - Timur Fayzrakhmanov
ссылка мертва, вам следует обновить - Ahmet Karakaya


Основываясь на ответе @ Тимура, я создал следующее удобный скрипт

Настроить

Положил 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 должны быть заменены в приведенном выше сценарии.

Применение

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

$> docker-ssh 

В противном случае укажите его пармером id докеры, который вы получаете от docker ps (первый col)

$> docker-ssh 50m3r4nd0m1d

13
2018-04-20 11:39



Могу ли я узнать, зачем нам нужно в конце? - Nam G VU
для запуска bash в качестве оболочки входа в систему, считывая параметры среды (описанные в строке над командой) - Matyas


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

Если у вас есть контейнер с именем «web-server1». Следующая команда запуска docker запустит второй контейнер, который предоставит 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


8
2017-10-03 16:20



Это должен быть принятый ответ ^ - Nam G VU
Кстати, как мы можем загружать .bashrc автоматически при запуске сеанса ssh с помощью вашего решения? Также опубликован вопрос о github github.com/jeroenpeeters/docker-ssh/issues/30 - Nam G VU


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

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

P.S .: Не забудьте проверить обсуждение в комментариях публикации ...

ура


5
2018-03-14 10:12



Это довольно старый пост, который больше не требуется, @ WiR3D-х docker exec решение является более удобным. - drevicko


Если ваш контейнер не установлен bash (например, consul), вы можете попробовать sh:

docker exec -it CONTAINER /bin/sh

Или сначала найдите оболочки в / bin:

docker export CONTAINER|tar -t|egrep ^bin/

3
2017-07-29 13:40



Что "консул"? У вас есть ссылка на него? Ты имеешь ввиду "консоль"? - Peter Mortensen