如何在OSX上使用docker容器进行ssh连接(boot2docker)

时间:2014-04-11 13:55:51

标签: macos ssh docker boot2docker linux-containers

我使用boot2docker在OSX上使用docker。

我希望从终端获得一个Ssh连接到一个正在运行的容器中。

但我不能这样做:(

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

5 个答案:

答案 0 :(得分:32)

要启用ssh到VM中运行的容器,必须执行以下操作:

  1. 在您的容器中安装并运行sshdexample)。默认情况下,sshd不存在,因为容器通常只运行一个进程,尽管它们可以运行任意数量的进程。
  2. EXPOSE一个端口作为创建映像的一部分,通常为22,因此当您运行容器时,守护程序连接到容器内的EXPOSE端口,并且可以暴露在容器外面。
  3. 运行容器时,需要决定如何映射该端口。您可以让Docker自动执行或明确执行。我建议明确:docker run -p 42222:22 ...将VM上的端口42222映射到容器中的端口22。
  4. 向VM添加端口映射以将端口公开给主机。例如当您的VM未运行时,您可以添加如下映射:VBoxManage modifyvm "boot2docker-vm" --natpf1 "containerssh,tcp,,42222,,42222"
  5. 然后,从您的主机,您应该能够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。

答案 1 :(得分:32)

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

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

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

答案 2 :(得分:1)

如果您只想进入正在运行的容器,可以考虑使用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 :(得分:0)

迈克尔答案的略微修改后的变体,只需要输入您要输入的容器(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 :(得分:0)

我已经针对在具有相同操作系统Docker 18.09.2的主机上运行的Ubuntu 16.04映像进行了测试,它也应该在经过少量修改的情况下也可以用于boot2Docker。

构建图像。 在后台容器中运行它(您的用户可能是root):

$ docker run -ditu <youruser> <imageId>

使用外壳将其连接:

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

安装openssh服务器(仅当您的用户不是root用户时才需要sudo,对于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中非交互地应用上述过程。