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