在 Docker 容器中运行 sshd

Yoa*_*ein 6 linux ssh docker

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

// version 1
FROM ubuntu:latest
RUN apt update && apt install ssh  -y
RUN service ssh start
CMD ["/usr/sbin/sshd","-D"]
Run Code Online (Sandbox Code Playgroud)

当我构建并运行它时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

Run Code Online (Sandbox Code Playgroud)

然后运行容器:

~$ docker run -p 2222:22 -it ssh_server
Run Code Online (Sandbox Code Playgroud)

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

// version 3
FROM ubuntu:latest
RUN apt-get update && apt-get install -y ssh
Run Code Online (Sandbox Code Playgroud)

并像这样运行容器:

~$ docker run -p 2222:22 -it ssh:test
~$ service ssh start
* Starting OpenBSD Secure Shell server sshd 
Run Code Online (Sandbox Code Playgroud)

现在我可以连接到容器了。所以我想知道:如果版本 1 中的行RUN ssh service start 是必要的,为什么版本 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"] 
Run Code Online (Sandbox Code Playgroud)

它也不起作用。

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

Yoa*_*ein 7

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

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

该脚本还调用可执行文件/usr/sbin/sshd,但由于这是作为构建的一部分运行的,因此它不会超出构成该层的临时容器。瓦

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

谢谢大家!