如何在 OSX(boot2docker)上获得与 docker 容器的 ssh 连接
Posted
技术标签:
【中文标题】如何在 OSX(boot2docker)上获得与 docker 容器的 ssh 连接【英文标题】:How to get ssh connection with docker container on OSX(boot2docker) 【发布时间】:2014-05-25 17:34:56 【问题描述】:我在 OSX 上使用带有 boot2docker 的 docker。
我想从我的终端获得一个 SSH 连接到一个正在运行的容器。
但我不能这样做:(
我认为是因为 Docker 在虚拟机中运行。
【问题讨论】:
【参考方案1】:您必须做几件事才能启用 SSH 到在 VM 中运行的容器:
-
在您的容器 (example) 中安装并运行
sshd
。 sshd
默认情况下不存在,因为容器通常只运行一个进程,尽管它们可以运行任意数量。
EXPOSE
一个端口作为创建镜像的一部分,通常是 22,这样当你运行容器时,守护进程会连接到容器内部的 EXPOSE
'd 端口,并且可以在容器外部暴露一些东西。
当您运行容器时,您需要决定如何映射该端口。您可以让 Docker 自动或显式地执行此操作。我建议明确一点:docker run -p 42222:22 ...
将 VM 上的端口 42222 映射到容器中的端口 22。
将端口映射添加到 VM 以将端口公开给您的主机。例如当您的虚拟机未运行时,您可以添加如下映射: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->VM 端口 42222->容器端口 22。
【讨论】:
【参考方案2】:如果你只是想进入正在运行的容器,你可以考虑使用nsenter
。这是一个简单的 bash 脚本 (suggested by 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
(或者你想输入的任何配置)
【讨论】:
【参考方案3】: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 ')
【讨论】:
【参考方案4】:Docker 已将docker exec
命令添加到 Docker 1.3.0。您可以使用以下方法连接到正在运行的容器:
docker exec -it <container id> /bin/bash
这将连接到正在运行的容器上的 bash 提示符。
【讨论】:
也可以与 docker-compose 一起使用docker-compose run <container-name> /bin/bash
【参考方案5】:
我已经针对在具有相同操作系统 Docker 18.09.2 的主机上运行的 Ubuntu 16.04 映像对此进行了测试,稍作修改后它也应该适用于 boot2Docker。
构建图像。 在后台容器中运行它(youruser 可能是 root):
$ docker run -ditu <youruser> <imageId>
用外壳连接它:
$ docker exec -it <containerId> /bin/bash
安装 openssh-server(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
的内容复制粘贴到docker镜像上的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 中以非交互方式应用上述过程。
【讨论】:
以上是关于如何在 OSX(boot2docker)上获得与 docker 容器的 ssh 连接的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Kitematic Boot2docker linux 上安装东西?