Как получить 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.

940
задан 11 November 2016 в 18:16

15 ответов

Ответ является Докером 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:/#
1293
ответ дан 11 November 2016 в 18:16

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

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

4
ответ дан 11 November 2016 в 18:16

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

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

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

27
ответ дан 11 November 2016 в 18:16

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

docker exec -it <containerIdOrName> bash

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

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

exit

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

666
ответ дан 11 November 2016 в 18:16

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

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

121
ответ дан 11 November 2016 в 18:16

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

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

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

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

6
ответ дан 11 November 2016 в 18:16

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

docker exec -it CONTAINER /bin/sh

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

docker export CONTAINER|tar -t|egrep ^bin/
11
ответ дан 11 November 2016 в 18:16

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

$ docker run --rm --volumes-from mydata -it ubuntu bash
root@645045d3cc87:/# ls /mydata
root@645045d3cc87:/# touch /mydata/foo
root@645045d3cc87:/# exit
exit
-1
ответ дан 11 November 2016 в 18:16

Я создал контейнеризированный сервер 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
ответ дан 11 November 2016 в 18:16

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

docker exec -t -i container_name /bin/bash
0
ответ дан 11 November 2016 в 18:16

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

docker start {id}
docker attach {id}
0
ответ дан 11 November 2016 в 18:16
docker run -it openjdk:8

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

2
ответ дан 11 November 2016 в 18:16

На основе ответа @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 буду заменен в вышеупомянутом сценарии.

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

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

$> docker-ssh 

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

$> docker-ssh 50m3r4nd0m1d
19
ответ дан 11 November 2016 в 18:16

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

UbuntuWithSSH-докер

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

3
ответ дан 11 November 2016 в 18:16

GOINSIDE

установка goinside инструмент командной строки с:

sudo npm install -g goinside

и войдите в контейнер докера с надлежащим терминальным размером с:

goinside docker_container_name

поскольку больше деталей проверяет это.

1
ответ дан 22 November 2019 в 22:31

Другие вопросы по тегам:

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