如何SSH到Docker?

Kam*_*nek 75 containers lxc docker

我想创建以下基础架构流程:

如何使用Docker实现这一目标?

Jav*_*oso 60

首先,您需要在希望ssh-into的映像中安装SSH服务器.您可以在安装了ssh服务器的情况下为所有容器使用基本映像.然后你只需运行每个容器映射ssh端口(默认22)到一个到主机的端口(图像中的远程服务器),使用-p <hostPort>:<containerPort>.即:

docker run -p 52022:22 container1 
docker run -p 53022:22 container2
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • @squixy:它们只是你主机上的端口; 只是以与其他应用程序相同的方式公开它们.它可能正常工作,或者您可能需要在防火墙中打开端口. (2认同)

Jer*_*ers 39

注意:这个答案促进了我写的工具.

此处选择的答案建议在每个映像中安装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
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这应该是正确的答案.将SSH服务器安装到您想要的每个映像中都会遇到Docker的问题.每个容器应该只有一个服务,应该从服务/容器组成应用程序. (5认同)
  • 注意:尽力而为-但这还不支持scp / SFTP (2认同)
  • @JeroenPeeters我猜想另一个前提是“将Docker套接字映射到容器中,这使容器可以访问Docker引擎。” (2认同)
  • @JeroenPeeters,看起来这个项目被放弃了,最后一次提交是 5 年前。想法很好,但我无法让它与最新版本的 docker 一起使用。 (2认同)

joh*_*ope 12

这些文件将成功打开sshd并运行服务,以便您可以在本地ssh.(你使用的是cyberduck不是吗?)

Dockerfile

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"]
Run Code Online (Sandbox Code Playgroud)

supervisord.conf

[supervisord]
nodaemon=true

[program:sshd]
command=/usr/sbin/sshd -D
Run Code Online (Sandbox Code Playgroud)

构建/运行启动守护进程/跳转到shell.

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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

Adr*_*uat 10

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

但是,我不得不质疑你为什么要这样做.SSH进入容器应该是非常罕见的,ssh到主机然后使用docker exec进入容器并不麻烦.


use*_*ame 8

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

Dockerfile

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"]
Run Code Online (Sandbox Code Playgroud)

使用以下方法构建图像

$ docker build -t eg_sshd .
Run Code Online (Sandbox Code Playgroud)

运行test_sshd容器:

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

0.0.0.0:49154
Run Code Online (Sandbox Code Playgroud)

Ssh到你的容器:

$ ssh root@192.168.1.2 -p 49154
# The password is ``screencast``.
root@f38c87f2a42d:/#
Run Code Online (Sandbox Code Playgroud)

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


Meh*_*ani 5

这是一条捷径,但不是永久的

首先创建一个容器

docker run  ..... -p 22022:2222 .....
Run Code Online (Sandbox Code Playgroud)

主机上的端口 22022 将映射到 2222,我们稍后更改容器上的 ssh 端口,然后在容器上执行以下命令

apt update && apt install  openssh-server # install ssh server
passwd #change root password
Run Code Online (Sandbox Code Playgroud)

在文件 /etc/ssh/sshd_config 中更改这些:取消注释端口并将其更改为 2222

Port 2222
Run Code Online (Sandbox Code Playgroud)

取消注释 PermitRootLogin

PermitRootLogin yes
Run Code Online (Sandbox Code Playgroud)

最后重新启动ssh服务器

/etc/init.d/ssh start
Run Code Online (Sandbox Code Playgroud)

您现在可以登录到您的容器

ssh -p 22022 root@HostIP
Run Code Online (Sandbox Code Playgroud)

请记住:如果重新启动容器,则需要再次重新启动 ssh 服务器