如何通过 SSH 连接到 Docker?

问题描述 投票:0回答:7

我想创建以下基础架构流程,其中远程服务器上有三个 Docker 容器,并希望管理员和标准用户能够对这些资源使用相同的登录名。我希望管理员拥有与标准用户不同的 IP。

an image depicting the above described infrastructure originally hosted on lucidchart.com

如何使用 Docker 来实现这一点?我需要 ssh 进入容器。

docker containers lxc
7个回答
87
投票

首先,您需要在要通过 ssh 访问的映像中安装 SSH 服务器。您可以为所有安装了 ssh 服务器的容器使用基础映像。 然后,您只需运行每个容器,使用

-p <hostPort>:<containerPort>
将 ssh 端口(默认 22)映射到主机端口(映像中的远程服务器)。即:

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

然后,如果主机的端口 52022 和 53022 可以从外部访问,您可以使用主机(远程服务器)的 ip 直接 ssh 到容器,并在 ssh 中使用

-p <port>
指定端口。即:

ssh -p 52022 myuser@RemoteServer
--> SSH 到容器1

ssh -p 53022 myuser@RemoteServer
--> SSH 到容器2


50
投票

注意:这个答案推广了我编写的一个工具。

此处选择的答案建议在每个映像中安装 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 服务器。


14
投票

这些文件将成功打开 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"]

supervisord.conf

[supervisord]
nodaemon=true

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

构建/运行启动守护进程/跳转到 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

enter image description here


10
投票

创建预装了

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"]

使用以下方法构建图像:

$ 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 [email protected] -p 49154
# The password is ``screencast``.
root@f38c87f2a42d:/#

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


8
投票

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

但是,我不得不质疑你为什么要这样做。通过 SSH 进入容器的情况应该很少见,因此通过 ssh 连接到主机然后使用 docker exec 进入容器并不麻烦。


7
投票

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

首先创建一个容器

docker run  ..... -p 22022:2222 .....

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

apt update && apt install  openssh-server # install ssh server
passwd #change root password

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

Port 2222

取消注释 PermitRootLogin

PermitRootLogin yes

最后重启ssh服务器

/etc/init.d/ssh start

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

ssh -p 22022 root@HostIP

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


1
投票

假设您已经有一个要连接的正在运行的 docker,则不必使用 SSH。 好处是你不需要 ssh 服务器

docker ps -n  1 -q # print only container IDs, find the last created container id
docker exec -i -t <containerid> /bin/bash
© www.soinside.com 2019 - 2024. All rights reserved.