我想创建以下基础结构流:
使用Docker如何实现?
我想创建以下基础结构流:
使用Docker如何实现?
Answers:
首先,您需要在要ssh-in的映像中安装SSH服务器。您可以对安装了ssh服务器的所有容器使用基础映像。然后,您只需要运行每个容器,即可将ssh端口(默认为22)映射到一个与主机端口(镜像中的远程服务器)对应的容器-p <hostPort>:<containerPort>
。即:
docker run -p 52022:22 container1
docker run -p 53022:22 container2
然后,如果可以从外部访问主机的端口52022和53022,则可以使用主机(远程服务器)的ip通过ssh在ssh中指定端口来直接ssh到容器-p <port>
。即:
ssh -p 52022 myuser@RemoteServer
-> SSH到container1
ssh -p 53022 myuser@RemoteServer
-> SSH到container2
注意:此答案将促进我编写的工具。
此处选择的答案建议将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服务器。
这些文件将成功打开sshd并运行服务,因此您可以在本地ssh。(您正在使用Cyberduck吗?)
Docker文件
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]
nodaemon=true
[program:sshd]
command=/usr/sbin/sshd -D
构建/运行启动守护程序/跳入外壳。
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进入容器应该非常少见,以免将主机SSH到主机,然后使用docker exec进入容器并不是一件麻烦事。
使用创建Docker镜像 openssh-server
预安装的:
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 root@192.168.1.2 -p 49154
# The password is ``screencast``.
root@f38c87f2a42d:/#
来源:https : //docs.docker.com/engine/examples/running_ssh_service/#build-an-eg_sshd-image
ssh root@localhost -p <ssh_host_port>
按照此处的