首页 > 解决方案 > 在 Docker 容器中运行 sshd

问题描述

我在这里Dockerfile找到了这个样本:

// version 1
FROM ubuntu:latest
RUN apt update && apt install ssh  -y
RUN service ssh start
CMD ["/usr/sbin/sshd","-D"]

当我构建并运行它时Dockerfile,它会在前台运行一个 SSH 服务器,这很棒。

如果我使用以下内容Dockerfile

// version 2
FROM ubuntu:latest
RUN apt update && apt install ssh -y
RUN service ssh start
# CMD ["/usr/sbin/sshd","-D"] // without this line

然后运行容器:

~$ docker run -p 2222:22 -it ssh_server

并尝试从另一个终端连接到它,它不起作用。看起来这个对 sshd 的调用是必要的。另一方面,如果我只是在 Dockerfile 中安装 SSH:

// version 3
FROM ubuntu:latest
RUN apt-get update && apt-get install -y ssh

并像这样运行容器:

~$ docker run -p 2222:22 -it ssh:test
~$ service ssh start
* Starting OpenBSD Secure Shell server sshd 

现在我可以连接到容器了。所以我想知道:如果RUN ssh service start 版本 1 中的行是必要的,为什么版本 3 不需要?

为了增加混乱,如果我构建并运行版本 4:

// version 4
FROM ubuntu:latest
RUN apt update && apt install ssh  -y
#RUN service ssh start // without this line
CMD ["/usr/sbin/sshd","-D"] 

它也不起作用。

有人可以解释这些行为吗?service ssh start和之间有什么关系/usr/sbin/sshd

标签: linuxdockerssh

解决方案


好的,现在一切都清楚了:

基本上运行/usr/sbin/sshd就是运行 ssh 服务器。它无法自行解决(版本 4)的原因是因为运行时运行service ssh start的脚本(即脚本/etc/init.d/ssh)创建了/run/sshd运行 sshd 所需的目录。

该脚本还调用了可执行文件/usr/sbin/sshd,但由于这是作为构建的一部分运行的,因此它无法在构成该层的临时容器之外维持。W

支撑的是/run/sshd目录!这就是为什么当我们/usr/sbin/sshd作为 CMD 运行时它可以工作!

谢谢大家!


推荐阅读