如何通过 SSH 进入 Docker?
How to SSH into Docker?
我想创建以下基础架构流程:
如何使用 Docker 实现?
我想这是可能的。您只需要在每个容器中安装一个 SSH 服务器并在主机上公开一个端口。主要的烦恼是 maintaining/remembering 端口到容器的映射。
但是,我不得不质疑你为什么要这样做。通过 SSH 进入容器应该很少见,以至于通过 ssh 连接到主机然后使用 docker exec 进入容器并不麻烦。
首先,您需要在您希望通过 ssh 访问的映像中安装 SSH 服务器。您可以为安装了 ssh 服务器的所有容器使用基础映像。
然后你只需要 运行 每个容器将 ssh 端口(默认 22)映射到主机的端口(你的镜像中的远程服务器),使用 -p <hostPort>:<containerPort>
。即:
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 到 container1
ssh -p 53022 myuser@RemoteServer
--> SSH 到 container2
注意:这个回答推广了我写的一个工具
此处选择的答案建议在每个映像中安装 SSH 服务器。从概念上讲,这不是正确的方法 (https://docs.docker.com/articles/dockerfile_best-practices/)。
我创建了一个容器化的 SSH 服务器,您可以 'stick' 到任何 运行 容器。这样你就可以用每个容器创建组合。唯一的要求是容器有 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
Not only does this defeat the idea of one process per container, it is also a cumbersome approach when using images from the Docker Hub since they often don't (and shouldn't) contain an SSH server.
这些文件将成功打开 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 图像并预安装 openssh-server
:
Docker 文件
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
这是一条捷径,但不是永久的
首先创建一个容器
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 2022 root@HostIP
记住:如果你重启容器,你需要再次重启 ssh 服务器
我想创建以下基础架构流程:
如何使用 Docker 实现?
我想这是可能的。您只需要在每个容器中安装一个 SSH 服务器并在主机上公开一个端口。主要的烦恼是 maintaining/remembering 端口到容器的映射。
但是,我不得不质疑你为什么要这样做。通过 SSH 进入容器应该很少见,以至于通过 ssh 连接到主机然后使用 docker exec 进入容器并不麻烦。
首先,您需要在您希望通过 ssh 访问的映像中安装 SSH 服务器。您可以为安装了 ssh 服务器的所有容器使用基础映像。
然后你只需要 运行 每个容器将 ssh 端口(默认 22)映射到主机的端口(你的镜像中的远程服务器),使用 -p <hostPort>:<containerPort>
。即:
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 到 container1
ssh -p 53022 myuser@RemoteServer
--> SSH 到 container2
注意:这个回答推广了我写的一个工具
此处选择的答案建议在每个映像中安装 SSH 服务器。从概念上讲,这不是正确的方法 (https://docs.docker.com/articles/dockerfile_best-practices/)。
我创建了一个容器化的 SSH 服务器,您可以 'stick' 到任何 运行 容器。这样你就可以用每个容器创建组合。唯一的要求是容器有 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
Not only does this defeat the idea of one process per container, it is also a cumbersome approach when using images from the Docker Hub since they often don't (and shouldn't) contain an SSH server.
这些文件将成功打开 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 图像并预安装 openssh-server
:
Docker 文件
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
这是一条捷径,但不是永久的
首先创建一个容器
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 2022 root@HostIP
记住:如果你重启容器,你需要再次重启 ssh 服务器