如何通过SSH连接到Docker?


Answers:


68

首先,您需要在要ssh-in的映像中安装SSH服务器。您可以对安装了ssh服务器的所有容器使用基础映像。然后,您只需要运行每个容器,即可将ssh端口(默认为22)映射到一个与主机端口(镜像中的远程服务器)对应的容器-p <hostPort>:<containerPort>。即:

docker run -p 52022:22 container1 
docker run -p 53022:22 container2

然后,如果可以从外部访问主机的端口52022和53022,则可以使用主机(远程服务器)的ip通过ssh在ssh中指定端口来直接ssh到容器-p <port>。即:

ssh -p 52022 myuser@RemoteServer -> SSH到container1

ssh -p 53022 myuser@RemoteServer -> SSH到container2


以及如何将这些端口暴露给外界?我的意思是是否可以不使用nginx进行配置?
卡米尔·莱洛尼克

2
@squixy:它们只是您主机上的端口;只需以与其他应用程序相同的方式公开它们即可。它可能只是工作,或者您可能需要在防火墙中打开端口。
阿德里安·穆阿特

我明白了,我只是想知道将域名映射到端口的最佳方法是什么,但是我相信NginX是我可以轻松实现的解决方案。
卡米尔·莱洛内克2015年

什么是container1?当我执行“ docker run <name>”时,<name>被解释为映像名称,因此docker在存储库中查找映像。我的容器ID在docker run中不起作用。我使用“ docker start <containerID>”启动容器,但docker start不接受-p参数。
mvmn16年

1
如果Docker用户是“ root”用户,则需要通过“ passwd root”为root用户提供密码。我也发现这可行:docker run -p 52022:22 container1 service ssh start -D FOREGROUND
CMP

42

注意:此答案将促进我编写的工具。

此处选择的答案建议将SSH服务器安装到每个映像中。从概念上讲,这不是正确的方法(https://docs.docker.com/articles/dockerfile_best-practices/)。

我创建了一个容器化的SSH服务器,您可以将其“粘贴”到任何正在运行的容器。这样,您可以为每个容器创建合成。唯一的要求是容器具有bash。

以下示例将启动在本地计算机的端口2222上公开的SSH服务器。

$ docker run -d -p 2222:22 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -e CONTAINER=my-container -e AUTH_MECHANISM=noAuth \
  jeroenpeeters/docker-ssh

$ ssh -p 2222 localhost

有关更多指针和文档,请参见:https : //github.com/jeroenpeeters/docker-ssh

这不仅破坏了每个容器一个进程的想法,而且在使用来自Docker Hub的映像时也是一种麻烦的方法,因为它们通常不(也不应该)包含SSH服务器。


6
这应该是正确的答案。将SSH服务器安装到所需的每个映像中都违反了docker的原则。每个容器应该只有一项服务,并且应该由服务/容器组成应用程序。
babbata

2
@JeroenPeeters我猜想另一个前提是“将Docker套接字映射到容器中,这使容器可以访问Docker引擎。”
Nam G VU

1
以上命令中的“ jeroenpeeters”是什么?容器上的用户名吗?
Pratik Patil

1
@PratikPatil为其图像名称的一部分。hub.docker.com/r/jeroenpeeters/docker-ssh
Jeroen Peeters

13

这些文件将成功打开sshd并运行服务,因此您可以在本地ssh。(您正在使用Cyber​​duck吗?)

Docker文件

FROM swiftdocker/swift
MAINTAINER Nobody

RUN apt-get update && apt-get -y install openssh-server supervisor
RUN mkdir /var/run/sshd
RUN echo 'root:password' | chpasswd
RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config

# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf

EXPOSE 22
CMD ["/usr/bin/supervisord"]

主管

[supervisord]
nodaemon=true

[program:sshd]
command=/usr/sbin/sshd -D

构建/运行启动守护程序/跳入外壳。

docker build -t swift3-ssh .  
docker run -p 2222:22 -i -t swift3-ssh
docker ps # find container id
docker exec -i -t <containerid> /bin/bash

在此处输入图片说明


2
嘿,很好的答案。我的容器出现了,并提示我登录,但是凭据是“ root”和“ password”吗?这似乎对我不起作用,但是我喜欢您的解决方案,并且我想使用它。
Jabari Dash

不确定-碰到端口22时遇到麻烦-确保您使用端口2222,因为经常会在本地设备上打开某些内容以与该端口发生冲突。
johndpope

默认情况下,/ etc / ssh / sshd_config中的这一行(“ PermitRootLogin Without-password”)是注释掉的,因此请改用“ s /#PermitRootLogin Without-password / PermitRootLogin yes /”。对于Ubuntu 16.04+,您可能还必须使用“禁止密码”而不是“无密码”。您可以确定将exec放入容器中以进行提前检查。
ItsJack

10

我想有可能。您只需要在每个容器中安装SSH服务器并在主机上公开端口即可。主要的烦恼将是维护/记住端口到容器的映射。

但是,我不得不质疑您为什么要这样做。通过SSH进入容器应该非常少见,以免将主机SSH到主机,然后使用docker exec进入容器并不是一件麻烦事。


因此,我想以每个项目创建容器的方式对环境进行建模。因此,每个项目都有其自己的环境,用户,数据库,python / ruby​​版本等。我想隔离项目而不创建多个服务器。
卡米尔·莱洛尼克

1
@squixy; 好。通常,docker容器仅包含一个进程-习惯上,您应该为mysql,php和apache使用单独的容器。我不确定这对您的效果如何。
阿德里安·穆阿特

我知道,您知道针对我的案件的更好解决方案吗?
卡米尔·莱洛内克2015年

1
@squixy取决于很多事情。我建议将每个容器分成多个容器。您需要ssh做什么?如果只是维护,为什么不能先将主机和docker exec SSH到主机?恐怕在评论中要回答的问题太大了。
阿德里安·穆阿特

正如Adrian所写的那样,一旦掌握了使用Docker的诀窍,您就会意识到容器!=虚拟机。实际上,(双关语意)无需交互访问正在运行的容器。
mzedeler 2015年

8

使用创建Docker镜像 openssh-server预安装的:

Docker文件

FROM ubuntu:16.04

RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
RUN echo 'root:screencast' | chpasswd
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd

ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile

EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]

使用以下方法生成图像:

$ docker build -t eg_sshd .

运行一个test_sshd容器:

$ docker run -d -P --name test_sshd eg_sshd
$ docker port test_sshd 22

0.0.0.0:49154

SSH到您的容器:

$ ssh root@192.168.1.2 -p 49154
# The password is ``screencast``.
root@f38c87f2a42d:/#

来源:https : //docs.docker.com/engine/examples/running_ssh_service/#build-an-eg_sshd-image


值得一提的是,对于Mac OS X,您可以尝试ssh root@localhost -p <ssh_host_port>按照此处的
Claudio Santos
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.