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

StackOverflow https://stackoverflow.com//questions/23014684

Вопрос

Я использую docker на OSX с загрузочный блокировщик.

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

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

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

Это было полезно?

Решение

Есть несколько вещей, которые вы должны сделать, чтобы включить подключение по ssh к контейнеру, запущенному в виртуальной машине:

  1. установите и запустите sshd в вашем контейнере (пример). sshd по умолчанию его там нет, потому что контейнеры обычно запускают только один процесс, хотя они могут запускать столько процессов, сколько вам нравится.
  2. EXPOSE порт как часть создания образа, обычно 22, так что при запуске контейнера демон подключается к EXPOSE'd порт внутри контейнера, и что-то может быть выставлено наружу контейнера.
  3. Когда вы запускаете контейнер, вам нужно решить, как сопоставить этот порт.Вы можете позволить Docker делать это автоматически или явно.Я бы посоветовал быть откровенным: docker run -p 42222:22 ... который сопоставляет порт 42222 на виртуальной машине с портом 22 в контейнере.
  4. Добавьте карту портов в виртуальную машину, чтобы предоставить доступ к порту вашему хосту.напр.когда ваша виртуальная машина не запущена, вы можете добавить сопоставление следующим образом: 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 root@localhost -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.
root@localhost's 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.

root@26e4b94e5a13:~# exit
logout

Итак, это показывает ssh->localhost 42222->порт виртуальной машины 42222->порт контейнера 22.

Другие советы

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

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

Это будет подключаться к приглашению Bash на беговой контейнере.

Если вы просто хотите попасть в запущенный контейнер, вы можете рассмотреть возможность использования nsenter.Вот простой скрипт bash (предложено Крисом Джонсом), который вы можете использовать для входа в контейнер docker.Сохраните это где-нибудь в своем $PATH как docker-введите и 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
args=$@
if[[ $# = 1 ]]; then
    args+=(/bin/bash)
fi

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

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

Слегка модифицированный вариант ответа Michael, который просто требует, чтобы контейнер, который вы хотите ввести, быть названным (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 }')
.

Я протестировал это для образа Ubuntu 16.04, запущенного на хосте с той же ОС, Docker 18.09.2, он также должен работать для boot2Docker с незначительными изменениями.

Создайте образ.Запустите его в фоновом контейнере (ваш пользователь может быть root):

$ docker run -ditu <youruser> <imageId>

Прикрепите к нему ракушку:

$ docker exec -it <containerId> /bin/bash

Установите openssh-сервер (sudo требуется только в том случае, если ваш пользователь не является root, команда может отличаться для boot2Docker):

$ sudo apt-get install -y openssh-server

Запустите его:

$ sudo service ssh start

(Следующий шаг необязателен, если у вашего пользователя есть пароль, вы можете пропустить его и указывать пароль при каждом ssh-соединении).

Создайте ключ RSA на клиентском узле:

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/youruser/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/youruser/.ssh/id_rsa.
Your public key has been saved in /home/youruser/.ssh/id_rsa.pub.

В образе docker создайте каталог $HOME/.ssh:

$ cd
$ mkdir .ssh && cd .ssh
$ vi authorized_keys

Скопируйте и вставьте содержимое $HOME/.ssh/id_rsa.pub на клиентском компьютере, чтобы authorized_keys щелкните по изображению docker и сохраните файл.

(Конец необязательного шага).

Запишите IP-адрес вашего изображения:

$ cat /etc/hosts
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2  63448863ac39
^^^^^^^^^^ this

Теперь соединение с клиентского хоста должно быть эффективным:

$ ssh 172.17.0.2
Enter passphrase for key '/home/youruser/.ssh/id_rsa': 
Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.15.0-46-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage
Last login: Fri Apr  5 09:50:30 2019 from 172.17.0.1

Конечно, вы можете применить описанную выше процедуру неинтерактивно в своем Dockerfile.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top