簡體   English   中英

在 Docker 容器中運行 sshd

[英]Run sshd in Docker container

我在這里找到了這個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 

現在我可以連接到容器了。 所以我想知道:如果版本 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"] 

它也不起作用。

有人可以解釋這些行為嗎? service ssh start/usr/sbin/sshd之間有什么關系?

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

基本上運行/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 運行時它可以工作的原因!

謝謝大家!

為了建立@YoavKlein 的答案, service ssh start可以采用 arguments 傳遞給sshd ,所以而不是

# Incidentally creates /run/sshd
RUN service ssh start
# Run the service in the foreground when starting the container
CMD ["/usr/sbin/sshd", "-D"]

你可以做

# Run the service in the foreground when starting the container
CMD ["service", "ssh", "start", "-D"]

這將通過service啟動 SSH 服務器,但在前台運行它,避免必須有單獨的RUN進行首次設置。

我從@mark-raymond 那里得到了這個想法:)

遵循帶有 -D 標志的 docker 運行命令對我有用::

docker run -itd -p 2222:22 <dockerImageName:Tag> /usr/sbin/sshd -D

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM