Я хочу 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:/#
Можно также дать контейнеру Докера routeable IP-адрес с Трубопроводкой, и после этого SSH в машину с тем новым IP-адресом.
Это будет более "традиционным" (ssh), вместо того, чтобы использовать специализированную команду как docker attach
, и в конечном счете сделает его более 'портативным' через системы и версии.
Попробуйте это:
sudo docker run -i -t webserver /bin/bash
Источник: https://docs.docker.com/articles/basics/#running-an-interactive-shell
От Докера 1.3 вперед:
docker exec -it <containerIdOrName> bash
В основном, если контейнер Докера был запущен с помощью эти /bin/bash
команда, можно получить доступ к нему с помощью attach
. В противном случае тогда необходимо выполнить команду для создания экземпляра Bash в контейнере с помощью exec
.
Также для выхода из Bash, не оставляя Bash, работающий в процессе жулика:
exit
Да, это настолько просто.
Хотя автор вопроса конкретно сказал, что они интересуются рабочим контейнером, также стоит отметить, что, если бы контейнер не работает, но требуется работать, это для ввода по абсолютному адресу вокруг Вас может работать:
docker run -i -t --entrypoint /bin/bash <imageID>
@jpetazzo имеет потрясающее сообщение об этом предмете . Короткий ответ должен был бы использовать nsenter
:
PID=$(docker inspect --format {{.State.Pid}} <container_name_or_ID>)
nsenter --target $PID --mount --uts --ipc --net --pid
P.S.: не забывайте проверять обсуждение в комментарии сообщения...
Аплодисменты
Если Ваш контейнер не имеет удара, установил Вас, мог бы попробовать sh:
docker exec -it CONTAINER /bin/sh
Или ищут оболочки в / мусорном ведре сначала:
docker export CONTAINER|tar -t|egrep ^bin/
если контейнер остановлен как, например, контейнер только для данных тогда, хорошее решение состоит в том, чтобы управлять одноразовым контейнером каждый раз, когда Вы хотите быть свойственными контейнеру данных. В этом случае сам контейнер данных мог быть совершенно пустым, поскольку у временного контейнера будут инструменты OS.
$ docker run --rm --volumes-from mydata -it ubuntu bash
root@645045d3cc87:/# ls /mydata
root@645045d3cc87:/# touch /mydata/foo
root@645045d3cc87:/# exit
exit
Я создал контейнеризированный сервер 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
Чтобы колотить в бегущий контейнер, напечатайте это:
docker exec -t -i container_name /bin/bash
Только для получения информации. Если необходимо войти в систему в простом контейнере, который не является демоном, необходимо использовать следующие команды:
docker start {id}
docker attach {id}
На основе ответа @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
Иногда будет удобно смочь к ssh в контейнер Докера, особенно во время разработки. Следующее изображение Докера позволяет ssh в контейнер с помощью закрытого ключа:
суть Dockerfile https://gist.github.com/devbkhadka/98792f7bca57f9778793b2db758b3d07.
установка goinside
инструмент командной строки с:
sudo npm install -g goinside
и войдите в контейнер докера с надлежащим терминальным размером с:
goinside docker_container_name
поскольку больше деталей проверяет это.