Как получить соединение ssh с контейнером докера на OSX (boot2docker)

Я использую докер в OSX с boot2docker.

Я хочу получить Ssh-соединение из моего терминала в запущенный контейнер.

Но я не могу этого сделать: (

Я думаю, это потому, что Docker работает на виртуальной машине.

Ответы

Ответ 1

Есть несколько вещей, которые вы должны сделать, чтобы включить ssh'ing в контейнер, работающий в VM:

  • установите и запустите sshd в вашем контейнере (пример). sshd не существует по умолчанию, потому что контейнеры обычно запускают только один процесс, хотя они могут запускать сколько угодно.
  • EXPOSE порт как часть создания изображения, обычно 22, так что при запуске контейнера демон подключается к порту EXPOSE 'd внутри контейнера, и что-то может быть открыто на внешней стороне контейнер.
  • Когда вы запускаете контейнер, вам нужно решить, как сопоставить этот порт. Вы можете позволить Docker делать это автоматически или быть явным. Я предлагаю быть явным: docker run -p 42222:22 ..., который отображает порт 42222 на виртуальной машине на порт 22 в контейнере.
  • Добавьте портпорт для виртуальной машины, чтобы открыть порт для вашего хоста. например когда ваша виртуальная машина не запущена, вы можете добавить такое отображение следующим образом: VBoxManage modifyvm "boot2docker-vm" --natpf1 "containerssh,tcp,,42222,,42222"

Затем с вашего хоста вы сможете передать ssh на порт 42222 на хосте, чтобы получить демон ssh контейнера.

Вот что происходит, когда я выполняю вышеуказанные шаги:

$ VBoxManage modifyvm "boot2docker-vm" --natpf1 "containerssh,tcp,,42222,,42222"
$ ./boot2docker start
[2014-04-11 12:07:35] Starting boot2docker-vm...
[2014-04-11 12:07:55] Started.
$ docker run -d -p 42222:22 dhrp/sshd
Unable to find image 'dhrp/sshd' (tag: latest) locally
Pulling repository dhrp/sshd
2bbfe079a942: Download complete 
c8a2228805bc: Download complete 
8dbd9e392a96: Download complete 
11d214c1b26a: Download complete 
27cf78414709: Download complete 
b750fe79269d: Download complete 
cf7e766468fc: Download complete 
082189640622: Download complete 
fa822d12ee30: Download complete 
1522e919ec9f: Download complete 
fa594d99163a: Download complete 
1bd442970c79: Download complete 
0fda9de88c63: Download complete 
86e22a5fdce6: Download complete 
79d05cb13124: Download complete 
ac72e4b531bc: Download complete 
26e4b94e5a13b4bb924ef57548bb17ba03444ca003128092b5fbe344110f2e4c
$ docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                   NAMES
26e4b94e5a13        dhrp/sshd:latest    /usr/sbin/sshd -D      6 seconds ago       Up 3 seconds        0.0.0.0:42222->22/tcp   loving_einstein     
$ ssh [email protected] -p 42222
The authenticity of host '[localhost]:42222 ([127.0.0.1]:42222)' can't be established.
RSA key fingerprint is ....
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[localhost]:42222' (RSA) to the list of known hosts.
[email protected] password: screencast
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.12.1-tinycore64 x86_64)

 * Documentation:  https://help.ubuntu.com/

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

[email protected]:~# exit
logout

Так что показывает ssh- > localhost 42222- > порт VM 42222- > контейнерный порт 22.

Ответ 2

Docker добавил команду docker exec в Docker 1.3.0. Вы можете подключиться к работающему контейнеру, используя следующее:

docker exec -it <container id> /bin/bash

Это будет подключаться к приглашению bash на запущенном контейнере.

Ответ 3

Если вы просто хотите попасть в запущенный контейнер, вы можете использовать nsenter. Вот простой bash script (предложенный Крисом Джонсом), который вы можете использовать для входа в контейнер докеров. Сохраните его где-нибудь в своем $PATH как docker-enter и chmod +x

#!/bin/bash
set-e
# Check for nsenter. If not found, install it
boot2docker ssh '[ -f /var/lib/boot2docker/nsenter ] || docker run --rm -v /var/lib/boot2docker/:/target jpetazzo/nsenter'
# Use bash if no command is specified
[email protected]
if[[ $# = 1 ]]; then
    args+=(/bin/bash)
fi

boot2docker ssh -t sudo /var/lib/boot2docker/docker-enter "${args[@]}"

Затем вы можете запустить docker-enter 89af3d (или любую конфигурацию, которую хотите ввести)

Ответ 4

Немного измененный вариант ответа Майкла, который требует, чтобы контейнер, который вы хотите ввести, назывался (APPNAME):

boot2docker ssh '[ -f /var/lib/boot2docker/nsenter ] || docker run --rm -v /var/lib/boot2docker/:/target jpetazzo/nsenter'

boot2docker ssh -t sudo /var/lib/boot2docker/docker-enter $(docker ps | grep $APPNAME | awk '{ print $1 }')