Я использую docker на OSX с boot2docker.
Я хочу получить Ssh-соединение с моего терминала в работающий контейнер.
Но я не могу этого сделать :(
Я думаю, это потому, что Docker работает на виртуальной машине.
Я использую docker на OSX с boot2docker.
Я хочу получить Ssh-соединение с моего терминала в работающий контейнер.
Но я не могу этого сделать :(
Я думаю, это потому, что Docker работает на виртуальной машине.
Есть несколько вещей, которые вы должны сделать, чтобы включить ssh для контейнера, работающего на виртуальной машине:
sshd
в своем контейнере (пример). sshd
по умолчанию отсутствует, потому что контейнеры обычно запускают только один процесс, хотя они могут запускать сколько угодно процессов.EXPOSE
порт как часть создания образа, обычно 22, так что, когда вы запускаете контейнер, демон подключается к EXPOSE
порту внутри контейнера, и что-то может быть выставлено снаружи контейнера.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 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 в работающем контейнере.
docker-compose run <container-name> /bin/bash
- person Scott Jungwirth; 12.04.2016
Если вы просто хотите попасть в работающий контейнер, вы можете использовать nsenter
< /а>. Вот простой скрипт bash (предложенный Chris Jones), который можно использовать для входа в контейнер Docker. Сохраните его где-нибудь в своем $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
args=$@
if[[ $# = 1 ]]; then
args+=(/bin/bash)
fi
boot2docker ssh -t sudo /var/lib/boot2docker/docker-enter "${args[@]}"
Затем вы можете запустить docker-enter 89af3d
(или любую другую конфигурацию, которую вы хотите ввести)
Немного измененный вариант ответа Майкла, который просто требует, чтобы контейнер, который вы хотите ввести, был назван (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.
На образе докера создайте каталог $HOME/.ssh
:
$ cd
$ mkdir .ssh && cd .ssh
$ vi authorized_keys
Скопируйте и вставьте содержимое $HOME/.ssh/id_rsa.pub
на клиентском компьютере в authorized_keys
образа докера и сохраните файл.
(Конец необязательного шага).
Запишите 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.