如何SSH进入Docker?
我想创build以下基础架构stream程:
如何使用Docker来实现?
首先,您需要在您希望使用的映像中安装SSH服务器。 您可以使用安装了ssh服务器的所有容器的基础映像。 然后,您只需使用-p <hostPort>:<containerPort>
将每个将ssh端口(默认为22)映射到主机的端口(映像中的远程服务器)的-p <hostPort>:<containerPort>
。 即:
docker run -p 52022:22 container1 docker run -p 53022:22 container2
然后,如果主机的端口52022和53022可以从外部访问,则可以使用指定ssh中的端口的主机(远程服务器)的ip用-p <port>
直接ssh到容器。 即:
ssh -p 52022 myuser@RemoteServer
– > SSH到container1
ssh -p 53022 myuser@RemoteServer
– > SSH到container2
这些文件将成功打开sshd并运行服务,以便您可以在本地ssh。 (你正在使用networking呃不是吗?)
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
构build/运行启动守护进程/跳转到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
我想这是可能的。 您只需要在每个容器中安装一个SSH服务器,并在主机上显示一个端口。 主要的烦恼是维护/记住港口到集装箱的映射。
但是,我不得不质疑你为什么要这样做。 SSH'ng到容器应该是非常罕见的,ssh到主机不是一个麻烦,然后使用docker exec进入容器。
注意 :这个答案提供了一个我写的工具。
这里select的答案build议在每个映像中安装一个SSH服务器。 从概念上讲,这不是正确的方法( https://docs.docker.com/articles/dockerfile_best-practices/ )。
我创build了一个容器化的SSH服务器,可以“粘”到任何正在运行的容器。 这样你可以创build每个容器的作品。 唯一的要求是容器有bash。
以下示例将启动附加到名称为“sshd-web-server1”的容器的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服务器。