Alpine容器安裝執行ssh

同勉共進發表於2021-11-17

寫在前面

本文介紹了在Alpine容器(docker)上安裝執行ssh並保證外界(宿主機)能通過ssh登入的方法,給出了相應的命令。在下在探索過程中借鑑了許多前人的經驗,在此先行謝過,所有參考內容都會給出連結。

正文

前言

本文所述的Alpine容器不限於通過 docker pull alpine:tag 拉取的映象建立的容器,而是泛指執行著Alpine作業系統的容器。

可以通過在容器內執行 cat /etc/issue 指令檢視容器所執行的OS。注意,即便在容器內執行 cat /process/version 或 uname -a ,得到的仍然是宿主機的OS,參考文件[1]。

過程

step1: pull & run Alpine container

沒什麼好說的,需要注意的是在run的時候新增埠對映 -v xxxx:yyyy ,其中, xxxx 不建議為22,因為宿主機的ssh很可能已佔用了該埠; yyyy 建議為22,因為這是傳統習慣,當然,也可以是其它數字。

step2: install

使用 apk add --no-cache openssh-server 安裝。參考文件[2]。

step3: set

首先 vi /etc/ssh/sshd_config 開啟配置檔案,然後,1)找到 # port 22 ,去掉 # ,同時,如果您在step1中將22設定為別的數字,這裡也要將22改成那個數字;2)[可選] 視情況修改 #PermitRootLogin prohibit-password 一句,具體可參考文件[3]。3)儲存,退出。該步驟還參考了文件[2][4]。

step4: start

通過 /etc/init.d/sshd start 啟動。如果報錯 bash: /etc/init.d/sshd: /sbin/openrc-run: bad interpreter: No such file or directory ,請先依次執行 apk add --no-cache openrc 和 rc-update add sshd 。參考文件[2][5]。

step5: test & debug

在宿主機上使用 ssh container-ip 測試是否能通,其中 container-ip 可以通過在宿主機上執行 docker inspect container-id | grep IPAddress 得到。如果報錯,請依次執行下面的命令。參考文件[6]。

1 ssh-keygen -A
2 rc-status
3 touch /run/openrc/softlevel
4 /etc/init.d/sshd restart

 在下沒有詳細研究這些命令的含義,有興趣的讀者請自行學習。

step6: test & debug again

再次測試,這次可能得到下圖所示報錯。

解決方法:執行圖中建議的命令 ssh-keygen -f "/root/.ssh/known_hosts" -R "container-ip" ,親測 ssh-keygen -R "container-ip" 也可以。

這次,不出意外,可以得到類似下面的輸出,表明可以了。接下來可以配置ssh免密登入,但這不在本文介紹範圍之內,請讀者自行學習。

寫在後面

本文是在下的實踐記錄。由於個體差異,不保證百分百解決您的問題,但希望能給您提供一些參考和思路。再次由衷感謝所有連結的作者。在下才疏學淺,錯誤疏漏之處在所難免,懇請廣大讀者批評指正,您的批評是在下前進的不竭動力。

參考

[1] 如何檢視docker容器裡的作業系統_ksj367043706的部落格-CSDN部落格

[2] Alpine 安裝 ssh 和 sftp - 一記

[3] sshd_config 中 PermitRootLogin 的探討_huigher的專欄-CSDN部落格

[4] ssh配置檔案詳解 - 簡書

[5] linux - Running OpenSSH in an Alpine Docker Container - Stack Overflow

[6] Unable to SSH into Docker container running Alpine Linux 3.10 - Stack Overflow

相關文章