【问题标题】:Run sshd in Docker container在 Docker 容器中运行 sshd
【发布时间】:2020-12-21 03:43:52
【问题描述】:

我找到了这个Dockerfile 示例here

// 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是什么关系?

【问题讨论】:

  • 为什么要在容器中运行 sshd?它闻起来像anti-pattern。我建议不要将容器视为虚拟机。如果你想闯入一个正在运行的容器,最好使用docker exec
  • RUN 是仅在构建时执行的步骤,而不是在您实际运行容器时执行的步骤。此外,当运行 Ubuntu 容器时,它只会启动其中的单个 CMD 进程,init/systemd 将不会运行。
  • RUN 命令实际上是一个完全的空操作。

标签: linux docker ssh


【解决方案1】:

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

基本上运行/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 运行时它会起作用!

谢谢大家!

【讨论】:

  • 你的答案是正确的:/etc/init.d/ssh 在调用 /usr/bin/sshd 之前会做一些事情,并且对文件系统的任何更改都会保存到 docker 映像中。除了创建 /run/sshd 之外,启动脚本还会生成 ssh 主机密钥(/etc/ssh/ssh_host_*),如果它们不存在的话。
猜你喜欢
  • 2014-04-26
  • 2020-07-28
  • 1970-01-01
  • 2022-10-04
  • 2015-03-05
  • 1970-01-01
  • 2014-05-18
  • 2017-05-23
  • 1970-01-01
相关资源
最近更新 更多