[英]Docker difference docker run[…] docker container run […]
[英]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.