在进行论文的研读中,往往要对别人已有的开源代码,进行一次跑通的过程,期间可能会修改一些参数,调整一些代码。但是,由于代码的完成时间不同,可能是上古代码;可能会遇到各种奇怪的运行环境,比如各种奇怪的框架;当然另外一个问题是严格的插件版本适配性。
在保证可运行的基础上进行跑通,以及做一些基本的测试操作,代码修正等,会要求不同的运行环境,这时候除了使用docker构建对应版本的镜像,没有更好的选择,anaconda也许可以适配部分不同的运行环境,但是绝不是最完美的解决方式。
严格的远程开发,指的是代码编辑环境于代码运行环境独立开来,如:运行在window10上的编辑器连接到运行在同一电脑上的WSL2运行环境,WSL2是真内核…
要使用远程开发,总体而言,比较简单,只需要在VSCode的扩展插件中,安装 ‘Remote Development’ 即可,会安装 ‘Remote WSL’, ‘Remote SSH’, ‘Remote Containers’ 三件套。
在扩展插件图标的上面,找到 ‘Remote Explorer’ ,选择对应的远程类型即可, 有’Containers’, ‘SSH Targets’ ,WSL Targets’可选,'Containers’会查看远程和本地运行的镜像而生成的容器。
扩展插件图标下方有一个 ‘docker’ 的鲸鱼图标,这个只会查看本地运行的docker容器.
结论:极其不推荐。
可以查看 https://segmentfault.com/a/1190000023095631去了解配置.
核心部分如下:
# 在 window10上,需要开启ssh-agent,忘记开启,VSCode会自动提示。
"""
下载docker.exe文件,也可以完全安装docker desktop.不过安装完成重启电脑后,启动docker desktop会提示未完全安装,直接安装弹出的链接,按照安装即可.
docker desktop, 完全安装后,界面会提示:当前未完全适配容器作为远程开发环境,需要升级,很显然的是docker当前对远程的支持并没有完全处理好,VSCode同样。
保证docker desktop安装完成,或者docker.exe在path路径,或Powershell在当前路径打开.
"""
# 使用frpc 转发宿主机信息 到frps nat服务器,本地frpc接受后转发到 访问主机的12222
docker context create mytest --docker "host=ssh://[email protected]:12222"
# 使用远程主机docker,作为服务,访问主机查询宿主机开启的docker容器.
docker context use mytest
# 删除配置.
docker context rm mytest -f
# 查看是否能连接到宿主机,若可以显示宿主机系统,内存,显卡等,说明连接正常.
docker info
PS:使用将linux的docker服务镜像到docker client存在的问题.
结论:推荐,我甚至认为上述没有存在的必要,除非docker
有巨大的改进,能解决卡顿问题。
第二种方式是完全将docker运行的镜像内部开放22端口,使用ssh直接连接到内部的容器环境。这时候是完全将镜像环境当做一台真正的电脑进行操作即可。比如:Remote-SSH
雷同的所有远程方式,可以按照以上方式进行操作:
镜像构建的教程很多,一般是两种方式
# 像在真实的电脑上安装软件一样.
# 构建镜像,如切换到dockerfile对应的目录下执行如下.
docker build -t ubuntu1804:v1 .
'''
-t tag的意思,生成的镜像文件名称,v1代表版本号,可以不写,默认latest, .表示当前路径
其中更加复杂些的有context以及使用docker cp的限定范围问题。
'''
sudo vim /etc/docke/daemon.json
{
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
}
}
sudo systemctl daemon-reload
sudo systemctl start docker
docker run -it --runtime=nvidia --rm -v /media/gaoming/CommonBak/DFace:/var/data_test naoming/kuaikuaikim_dface /bin/bash
# 上述可以改为下面一条,其实保持容器打开,而不是运行之后就关闭,只需要 -it参数即可。
docker run -it --gpus all --rm -v /media/gaoming/CommonBak/DFace:/var/data_test naoming/kuaikuaikim_dface
# 更加合理的应该是停止容器不自动删除容器,并且映射出22到host端口.
docker run -d -it --gpus all --name newmy -p 25600:22 -v /media/gaoming/CommonBak:/var/data_test mmdetection
# 与上一行的区别:就是该行只能ssh [email protected] -p 25600,所以只能本机连接,上面一行局域网的主机都可以接入到docker内部环境.
# 但使用frpc转发端口的仍然可用,不会影响.
docker run -d -it --gpus all --name newmy -p 127.0.0.1:25600:22 -v /media/gaoming/CommonBak:/var/data_test mmdetection
# 必须配置密码.
passwd
1234567890
# 安装ssh.
uname -a
apt-get update && apt-get install openssh-server openssh-client vim -y
# 先关闭服务.
service ssh stop
# 需要编辑,添加以下五行.
vim /etc/ssh/sshd_config
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PermitRootLogin yes
MaxStartups 1000
# 调试模式运行:注意 有一个ssh连接,第二个自动拒绝连接,调试模式对判断是host还是docker容器的问题非常有用.
/usr/sbin/sshd -d
# 启动服务,chconfig开启自启,systemctl自启设置无效,因为没有该命令.貌似有没有装的必要,因为启动非常简单.
service ssh start
# 不需要密码,则需要添加访问端主机的公匙.
mkdir /root/.ssh
touch /root/.ssh/authorized_keys
cat i* > /root/.ssh/authorized_keys
# 访问主机公钥生成.
ssh-keygen
# 直接回车多次即可,默认在~/.ssh/目录下.
Remote-Explorer
提供的三种方式,我认为最合理最有效的是:Remote-SSH
,将容器22端口开放,也可以使用 Remote-SSH
。搭配frp的端口转发,非常完美,运行在nat主机上的frps也非常廉价,因为nat主机一年100多块钱,1000GB双向流量,也有200出头的500M带宽2T的双向流量套餐,简而言之nat流量和带宽的价格非常便宜。
可以使用Remote-Explorer
中的container,但是最好是同一台电脑上,比如windows10开一个WSL2,即使局域网下使用docker server <==> docker client
体验也非常糟糕。