Как получить 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
.
14 ответов
Ответ - это команда 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]:/#
От докера 1.3 и далее.
docker exec -it <containerIdOrName> bash
В принципе, если контейнер-докер был запущен с помощью команды /bin /bash, вы можете получить к нему доступ с помощью attach
, если нет, то вам нужно выполнить команду для создания экземпляра bash внутри контейнера с помощью exec
Также для выхода из bash, не выходя из bash в процессе изгоев
exit
Сделайте это простым.
Примечание. Вы должны попытаться не запускать команды как sudo
, скорее добавьте своего пользователя в группу docker
и просто запустите нормально.
Хотя автор вопроса специально сказал, что они заинтересованы в запущенном контейнере, также стоит отметить, что если контейнер не запущен, но вы хотите запустить его, чтобы выкачать, вы можете запустить:
docker run -i -t --entrypoint /bin/bash <imageID>
Попробуйте следующее:
sudo docker run -i -t webserver /bin/bash
Источник: https://docs.docker.com/articles/basics/#running -an-интерактивная-оболочка
Основываясь на ответе @ 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
Я создал контейнерный 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
@jpetazzo имеет удивительный пост об этой теме . Короткий ответ заключался бы в использовании nsenter
:
PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid
P.S .: Не забудьте проверить обсуждение в комментариях сообщения ...
Приветствия
Если в контейнере не установлен bash (например, consul), вы можете попробовать sh:
docker exec -it CONTAINER /bin/sh
Или сначала найдите оболочки в /bin:
docker export CONTAINER|tar -t|egrep ^bin/
Вы также можете предоставить Docker Container маршрутизируемый IP-адрес с помощью Pipework и после этого SSH в машину с этим новым IP.
Это будет более «традиционным» (ssh) вместо использования команды приложения, например docker attach
, и в конечном итоге сделает ее более «переносимой» в разных системах и версиях.
docker run -it openjdk:8
Это работает: -)
Несколько раз это будет удобно, если вы сможете использовать ssh-in docker container, особенно во время разработки. Следующий докер позволяет ssh-в контейнере использовать закрытый ключ
https: //hub.docker .com /г /devkhadka /ubuntuwithssh /
Gist of Dockerfile - https://gist.github.com/devbkhadka/98792f7bca57f9778793b2db758b3d07
Чтобы перейти в запущенный контейнер, введите следующее:
docker exec -t -i container_name /bin/bash
, если контейнер остановлен, как, например, контейнер только для данных, тогда хорошим решением является запуск контейнера сбрасывания каждый раз, когда вы хотите подключиться к контейнеру данных. В этом случае сам контейнер данных может быть полностью пустым, так как временный контейнер будет иметь инструменты ОС.
$ docker run --rm --volumes-from mydata -it ubuntu bash
[email protected]:/# ls /mydata
[email protected]:/# touch /mydata/foo
[email protected]:/# exit
exit
Просто для информации. Если вам нужно войти в простой контейнер, который не является демоном, вам необходимо использовать следующие команды:
docker start {id}
docker attach {id}