配置ssh的目的是为了方便连接,也有一些文章里提到了docker里ssh不好,不过我觉得还挺方便,而且让大部分人使用ssh连接的方式而非先登录宿主机在进入docker,相当于是通过权限管理提高了安全性,不然一旦有个人误操作,可能所有人的环境和临时成果都要收到波及。
之前写过一篇在docker里配置jupyter lab,大家可以现配ssh再配jupyter。
之所以选择自己写,也是因为网上虽然教程很多,但是良莠不齐,很多是会误导人的,写下来也方便自己和其他同学使用的时候照猫画虎。
首先,假设你已经有了一个ubuntu镜像。代码如下:
nvidia-docker run -d -it --runtime=nvidia --name="container_name" -p 3090:22 -p 3091:8888 -p 3092:3092 xxxx
其中,--name是容器的名字,-p是端口映射,22和8888是默认的,22给ssh连接,8888给jupyter,3092则是docker与外部宿主机的端口映射,没这个的话,在docker里设置3092跑起来的服务外部是调用不到的。xxxx则是你想用的原始镜像的id前四位。
- 先执行更新
apt-get update
- 安装ssh-client命令
apt-get install openssh-client
- 安装ssh-server命令
apt-get install openssh-server
- 安装完成以后,先启动服务
/etc/init.d/ssh start
启动后,可以通过“ps -e|grep ssh”查看是否正确启动。
- 最后编辑sshd_config文件
vim /etc/ssh/sshd_config
这里一定要注意,sshd_config是下划线,网上有个教程打成了-,就导致vim创建了一个空的新文件,实际上打开正确的情况下sshd_config是有内容的。
打开之后改写以下内容,这里不赘述vi操作了。
1 将PermitRootLogin xxxx-password 改为 PermitRootLogin yes
2 将最后一行的usepam yes改成usepam no
3 将Subsystem sftp ***一大堆 改成Subsystem sftp internal-sftp
4 然后:wq 保存。
- 重启ssh服务
service ssh restart
- 设置ssh密码
passwd root
退出容器终端exit。
从外部ssh进入:
ssh root@x.x.x.x -p 3090
x.x.x.x就是宿主机的ip地址。
大功告成,这样就可以不需要宿主机的登录或权限而使用docker了。