Как получить 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)
$ [email protected]:/# 
However when I run the line above I get new CONTAINER ID
$ [email protected]:/#

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

778 голосов | спросил Timur Fayzrakhmanov 1 PM00000080000000731 2014, 20:19:07

14 ответов


1159

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

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

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

$ sudo docker exec -i -t 665b4a1e17b6 /bin/bash #by ID
or
$ sudo docker exec -i -t loving_heisenberg /bin/bash #by Name
$ [email protected]:/#
ответил Timur Fayzrakhmanov 5 AM000000100000000731 2014, 10:01:07
573

От докера 1.3 и далее.

docker exec -it <containerIdOrName> bash

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

Также для выхода из bash, не выходя из bash в процессе изгоев

exit

Сделайте это простым.

Примечание. Вы должны попытаться не запускать команды как sudo, скорее добавьте своего пользователя в группу docker и просто запустите нормально.

ответил WiR3D 29 +03002014-10-29T10:46:12+03:00312014bEurope/MoscowWed, 29 Oct 2014 10:46:12 +0300 2014, 10:46:12
97

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

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

ответил Adam Kalnas 7 52014vEurope/Moscow11bEurope/MoscowFri, 07 Nov 2014 21:46:25 +0300 2014, 21:46:25
23

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

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

Источник: https://docs.docker.com/articles/basics/#running -an-интерактивная-оболочка

ответил kraxor 1 PM00000080000002731 2014, 20:29:27
11

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

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

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

bash

В противном случае укажите его с помощью парметера id докеры, который вы получаете из $> docker-ssh (first col)

docker ps
ответил Matyas 20 PMpWed, 20 Apr 2016 14:39:14 +030039Wednesday 2016, 14:39:14
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

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

ответил Jeroen Peeters 3 +03002015-10-03T19:20:03+03:00312015bEurope/MoscowSat, 03 Oct 2015 19:20:03 +0300 2015, 19:20:03
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 MarpmSat, 14 Mar 2015 13:12:38 +03002015-03-14T13:12:38+03:0001 2015, 13:12:38
3

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

docker exec -it CONTAINER /bin/sh

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

docker export CONTAINER|tar -t|egrep ^bin/
ответил laktak 29 J000000Wednesday15 2015, 16:40:21
3

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

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

ответил radriaanse 29 +03002014-10-29T14:58:59+03:00312014bEurope/MoscowWed, 29 Oct 2014 14:58:59 +0300 2014, 14:58:59
2
docker run -it openjdk:8

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

ответил Kishan B 6 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 06 Sep 2016 18:11:51 +0300 2016, 18:11:51
2

Несколько раз это будет удобно, если вы сможете использовать ssh-in docker container, особенно во время разработки. Следующий докер позволяет ssh-в контейнере использовать закрытый ключ
https: //hub.docker .com /г /devkhadka /ubuntuwithssh /
Gist of Dockerfile - https://gist.github.com/devbkhadka/98792f7bca57f9778793b2db758b3d07

ответил Dev Khadka 26 PM00000060000003131 2017, 18:26:31
0

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

docker exec -t -i container_name /bin/bash
ответил Agustí Sánchez 11 +03002015-10-11T04:33:27+03:00312015bEurope/MoscowSun, 11 Oct 2015 04:33:27 +0300 2015, 04:33:27
0

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

$ 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 +03002015-10-14T13:32:53+03:00312015bEurope/MoscowWed, 14 Oct 2015 13:32:53 +0300 2015, 13:32:53
0

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

docker start {id}
docker attach {id}
ответил Nek 5 42015vEurope/Moscow11bEurope/MoscowThu, 05 Nov 2015 00:05:37 +0300 2015, 00:05:37

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132