Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何SSH进入Docker?_Docker_Containers_Lxc - Fatal编程技术网

如何SSH进入Docker?

如何SSH进入Docker?,docker,containers,lxc,Docker,Containers,Lxc,我想创建以下基础架构流: 使用Docker如何实现这一点?我想这是可能的。您只需要在每个容器中安装一个SSH服务器,并在主机上公开一个端口。主要的麻烦是维护/记住港口到集装箱的映射 然而,我不得不问你为什么要这么做。SSH'ng到容器中应该是非常罕见的,这样就可以轻松地通过SSH连接到主机,然后使用docker exec进入容器。首先,您需要在希望通过SSH连接到的映像中安装SSH服务器。在安装了ssh服务器的情况下,可以对所有容器使用基本映像。 然后,您只需使用-p:运行每个容器,将ssh端

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


使用Docker如何实现这一点?

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


然而,我不得不问你为什么要这么做。SSH'ng到容器中应该是非常罕见的,这样就可以轻松地通过SSH连接到主机,然后使用docker exec进入容器。

首先,您需要在希望通过SSH连接到的映像中安装SSH服务器。在安装了ssh服务器的情况下,可以对所有容器使用基本映像。 然后,您只需使用
-p:
运行每个容器,将ssh端口(默认22)映射到主机端口(映像中的远程服务器)。i、 e:

docker run -p 52022:22 container1 
docker run -p 53022:22 container2
然后,如果可以从外部访问主机的端口52022和53022,则可以使用主机(远程服务器)的ip直接ssh到容器,并在ssh中使用
-p
指定端口。即:

ssh-p52022myuser@RemoteServer
-->SSH到容器1

ssh-p53022myuser@RemoteServer
-->SSH到container2

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

这里选择的答案建议在每个映像中安装SSH服务器。从概念上讲,这不是正确的方法()

我已经创建了一个容器化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
有关更多指针和文档,请参阅:

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


这些文件将成功打开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
docker build-tswift3ssh。
docker运行-p 2222:22-i-t swift3 ssh
docker ps#查找容器id
docker exec-i-t/bin/bash

使用预安装的
openssh服务器创建docker映像:

Dockerfile 使用以下方法构建图像:

$ docker build -t eg_sshd .
运行
测试\u sshd
容器:

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

0.0.0.0:49154
$ ssh root@192.168.1.2 -p 49154
# The password is ``screencast``.
root@f38c87f2a42d:/#
Ssh到您的容器:

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

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

来源:

这是一条很短的路,但不是永久的

首先创建一个容器

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

apt update && apt install  openssh-server # install ssh server
passwd #change root password
在文件/etc/ssh/sshd\u config中更改以下内容: 取消对端口的注释并将其更改为2222

Port 2222
取消对PermitroLogin的注释

PermitRootLogin yes
最后重启ssh服务器

/etc/init.d/ssh start
您现在可以登录到您的容器

ssh -p 2022 root@HostIP

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

,因此我希望以我为每个项目创建容器的方式对我的环境进行建模。所以每个项目都有自己的环境、用户、数据库、python/ruby版本等等。我想在不创建多个服务器的情况下隔离项目。@squxy;好啊通常docker容器只包含一个进程——按照习惯,您应该为mysql、php和apache使用单独的容器。我不确定这对你来说会有多好。我知道,你知道我的案子有更好的解决办法吗?@squxy这取决于很多事情。我建议将每个容器分成多个容器。你需要ssh做什么?如果只是维护,为什么不能ssh到主机上,然后docker exec?恐怕这个问题太大了,无法在评论中回答。正如阿德里安所写,一旦你掌握了使用Docker的窍门,你就会意识到容器虚拟机。实际上(双关语)不需要对运行中的容器进行交互式访问。如何将这些端口公开给外部世界?我的意思是,如果有可能在没有nginx的情况下配置它?@squxy:它们只是主机上的端口;只需以与其他应用程序相同的方式公开它们。它可能只是工作,或者你可能需要在防火墙中打开端口。我明白了,我只是想知道什么是将域名映射到端口的最佳方式,但我相信NginX是我可以轻松实现的解决方案。什么是container1?当我执行“docker run”时,会将其解释为图像名称,因此docker会在repos中查找图像。我的容器ID与docker run不兼容。我使用“docker start”来启动容器,但docker start不接受-p参数。如果docker用户是“root”,则需要通过“passwd root”为root用户提供密码。我还发现这是可行的:docker run-p 52022:22 container1服务ssh start-D foreground这应该是正确的答案。将SSH服务器安装到您想要的每个映像中违背了docker的初衷。每个容器应该只有一个服务,并且应该从服务/容器组成应用程序。@JeroenPeeters我想另一个先决条件是“Docker套接字映射到容器中,这允许容器访问Docker引擎。”上面的命令中的“JeroenPeeters”是什么?它是容器上的用户名吗?@PratikPatil是图像名称的一部分。嘿,回答得好。我的容器出现并提示我登录,但是凭证是“root”和“password”吗?这似乎对我不起作用,但我喜欢你的解决方案,我想使用它。不确定-我在访问端口22时遇到问题-确保你经常使用端口2222,因为本地设备上打开的东西可能会与该端口冲突。默认情况下,/etc/ssh/sshd\u config中的这一行('permitrotlogin without password')是注释掉的,因此,请使用“s/#permitrotlogin而不使用密码/permitrotlogin yes/”。您可能还必须使用“禁止密码”