Alpine容器安装运行ssh
写在前面
本文介绍了在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