我在 OSX 上使用 docker 启动2docker.

我想从我的终端获得到正在运行的容器的 Ssh 连接。

但我不能这样做:(

我认为这是因为Docker运行在虚拟机中。

有帮助吗?

解决方案

要启用 ssh 连接到虚拟机中运行的容器,您必须执行以下几项操作:

  1. 安装并运行 sshd 在你的容器中(例子). sshd 默认情况下不存在,因为容器通常只运行一个进程,尽管它们可以运行任意多个进程。
  2. EXPOSE 作为创建映像一部分的端口,通常为 22,以便当您运行容器时,守护进程会连接到 EXPOSE容器内部有端口,并且某些东西可能会暴露在容器外部。
  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->VM 端口 42222->容器端口 22。

其他提示

docker已将docker exec命令添加到docker 1.3.0。您可以使用以下内容连接到正在运行的容器:

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

将连接到正在运行的容器上的bash提示。

如果你只是想进入正在运行的容器,你可以考虑使用 nsenter. 。这是一个简单的 bash 脚本(由克里斯·琼斯建议),您可以使用它进入 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 }')
.

我已经针对在具有相同操作系统 Docker 18.09.2 的主机上运行的 Ubuntu 16.04 映像进行了测试,它也应该适用于 boot2Docker,只需进行一些小的修改。

构建形象。在后台容器中运行它(你的用户 可能是根):

$ 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 在客户端计算机上 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