寫在前面
本文介紹了在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部落格
[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