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

817

Я хочу, чтобы 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)
$ [email protected]:/# 
However when I run the line above I get new CONTAINER ID
$ [email protected]:/#

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

    
задан Timur Fayzrakhmanov 01.08.2014 в 18:19
источник

15 ответов

1201

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

$ sudo docker attach 665b4a1e17b6 #by ID
or
$ sudo docker attach loving_heisenberg #by Name
$ [email protected]:/#

Для 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
$ [email protected]:/#
    
ответ дан Timur Fayzrakhmanov 05.08.2014 в 08:01
источник
597

От Docker 1.3 и далее:

docker exec -it <containerIdOrName> bash

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

Также, чтобы выйти из Bash, не оставив Bash в процессе изгоев:

exit

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

    
ответ дан WiR3D 29.10.2014 в 08:46
103

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

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

    
ответ дан Adam Kalnas 07.11.2014 в 19:46
26

Попробуйте следующее:

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

Источник: Ссылка

    
ответ дан kraxor 01.08.2014 в 18:29
14

Основываясь на ответе @ 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 (первый col)

$> docker-ssh 50m3r4nd0m1d
    
ответ дан Matyas 20.04.2016 в 13:39
8

Я создал контейнерный 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

Для большего количества указателей, checkout Ссылка

    
ответ дан Jeroen Peeters 03.10.2015 в 18:20
5

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

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

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

Приветствия

    
ответ дан Richard 14.03.2015 в 11:12
4

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

docker exec -it CONTAINER /bin/sh

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

docker export CONTAINER|tar -t|egrep ^bin/
    
ответ дан laktak 29.07.2015 в 15:40
3

Вы также можете предоставить контейнеру Docker маршрутизируемый IP-адрес с помощью Pipework и после этого SSH в машину с этим новым IP-адресом.

Это будет более «традиционным» (ssh), вместо использования команды, специфичной для приложения, например docker attach , и в конечном итоге сделает ее более «переносимой» в разных системах и версиях.

    
ответ дан radriaanse 29.10.2014 в 12:58
2
docker run -it openjdk:8

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

    
ответ дан Kishan B 06.09.2016 в 17:11
2

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

UbuntuWithSSH-Docker

Суть файла Dockerfile Ссылка .

    
ответ дан Dev Khadka 26.08.2017 в 17:26
1

GOINSIDE

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

sudo npm install -g goinside

и зайдите в контейнер докеров с соответствующим размером терминала с помощью:

goinside docker_container_name

для более подробной информации проверьте этот .

    
ответ дан Soorena 13.08.2018 в 11:56
0

Чтобы перейти в запущенный контейнер, введите следующее:

docker exec -t -i container_name /bin/bash
    
ответ дан Agustí Sánchez 11.10.2015 в 03:33
0

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

docker start {id}
docker attach {id}
    
ответ дан Nek 04.11.2015 в 22:05
-1

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

$ docker run --rm --volumes-from mydata -it ubuntu bash
[email protected]:/# ls /mydata
[email protected]:/# touch /mydata/foo
[email protected]:/# exit
exit
    
ответ дан David Dehghan 14.10.2015 в 12:32