如何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/”。您可能还必须使用“禁止密码”