Я хочу 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
.
Ответ является Докером 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:/#
Чтобы колотить в бегущий контейнер, напечатайте это:
docker exec -t -i container_name /bin/bash
если контейнер остановлен как, например, контейнер только для данных тогда, хорошее решение состоит в том, чтобы управлять одноразовым контейнером каждый раз, когда Вы хотите быть свойственными контейнеру данных. В этом случае сам контейнер данных мог быть совершенно пустым, поскольку у временного контейнера будут инструменты OS.
$ docker run --rm --volumes-from mydata -it ubuntu bash
root@645045d3cc87:/# ls /mydata
root@645045d3cc87:/# touch /mydata/foo
root@645045d3cc87:/# exit
exit
Можно также дать контейнеру Докера routeable IP-адрес с Трубопроводкой, и после этого SSH в машину с тем новым IP-адресом.
Это будет более "традиционным" (ssh), вместо того, чтобы использовать специализированную команду как docker attach
, и в конечном счете сделает его более 'портативным' через системы и версии.
Иногда будет удобно смочь к ssh в контейнер Докера, особенно во время разработки. Следующее изображение Докера позволяет ssh в контейнер с помощью закрытого ключа:
суть Dockerfile https://gist.github.com/devbkhadka/98792f7bca57f9778793b2db758b3d07.
На основе ответа @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
буду заменен в вышеупомянутом сценарии.
, Если у Вас есть только один рабочий экземпляр, просто выполните
[111]gt; docker-ssh
Иначе, предоставьте ему идентификационный параметр докера, который Вы получаете от docker ps
(первое седло)
[112]gt; docker-ssh 50m3r4nd0m1d
От Докера 1.3 вперед:
docker exec -it <containerIdOrName> bash
В основном, если контейнер Докера был запущен с помощью эти /bin/bash
команда, можно получить доступ к нему с помощью attach
. В противном случае тогда необходимо выполнить команду для создания экземпляра Bash в контейнере с помощью exec
.
Также для выхода из Bash, не оставляя Bash, работающий в процессе жулика:
exit
Да, это настолько просто.
RUN
команда в dockerfile /bin/bash
. Но зависит, что Вы имеете в виду. Если Вы хотите работать, контейнер и сразу иметь удар в наличии в том же самом терминале, тогда работающем с -it
, должен сделать это
– Francis Avila
07.04.2015, 10:43
sudo
по сравнению с docker
группа. Так или иначе существует дыра в системе безопасности, встроенная в докера, который может обеспечить полные полномочия в файловой системе хоста от гостя - независимо от того, используете ли Вы группу докера или sudo
для запуска контейнера.
– Wade
12.08.2017, 00:39
Если Ваш контейнер не имеет удара, установил Вас, мог бы попробовать sh:
docker exec -it CONTAINER /bin/sh
Или ищут оболочки в / мусорном ведре сначала:
docker export CONTAINER|tar -t|egrep ^bin/
@jpetazzo имеет потрясающее сообщение об этом предмете . Короткий ответ должен был бы использовать nsenter
:
PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid
P.S.: не забывайте проверять обсуждение в комментарии сообщения...
Аплодисменты
docker exec
скорее более удобно.
– bernhof
10.03.2017, 17:46
Я создал контейнеризированный сервер 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
Попробуйте это:
sudo docker run -i -t webserver /bin/bash
Источник: https://docs.docker.com/articles/basics/#running-an-interactive-shell
root@42f1e37bd0e5:/#
а не root@665b4a1e17b6:/#
)
– Mirage
01.08.2014, 19:31
Хотя автор вопроса конкретно сказал, что они интересуются рабочим контейнером, также стоит отметить, что, если бы контейнер не работает, но требуется работать, это для ввода по абсолютному адресу вокруг Вас может работать:
docker run -i -t --entrypoint /bin/bash <imageID>
sudo docker attach loving_heisenberg
– Acorn 21.09.2014, 22:59-i -t
равняется-it
– Ryan Stefan 12.08.2016, 10:57docker attach
луг к экземпляру MongoDB, например, уничтожит экземпляр. Как объяснено более подробно в этот вопросattach
иexec
различные животные. – pad 10.05.2017, 21:27