pycharm + docker 远程调试容器内程序
一、首先假设你已启动了一个docker容器,并在启动时将容器的22端口映射到宿主机的10022端口
启动示例:
nvidia-docker run -it -p 5000:80 -p 10022:22 -v ~/longlongaaago/workspace/docker:/root/workspace --name "longlongaaago" kaixhin/cuda-caffe:8.0
启动后使用xshell远程连接宿主机的10022端口是无法连接成功的,此时我们需要进入docker容器内部进行一些操作:
二、进行容器内部修改
docker exec -it 容器名 /bin/bash
1、修改root用户密码
passwd
2、首先检查容器内部是否以安装 openssh-server与openssh-client 若没安装执行一下命令安装
apt-get install openssh-serverapt-get install openssh-client
3、修改SSH配置文件以下选项
vim /etc/ssh/sshd_config
# PermitRootLogin prohibit-password # 默认打开 禁止root用户使用密码登陆,需要将其注释RSAAuthentication yes #启用 RSA 认证PubkeyAuthentication yes #启用公钥私钥配对认证方式PermitRootLogin yes #允许root用户使用ssh登录
4、启动sshd服务
/etc/init.d/ssh restart
5、退出容器,连接测试
ssh root@127.0.0.1 -p 10022
输入密码成功进入容器内部即配置成功
6、如若需要将修改后的容器重新保存为镜像,则可进行相应处理,本文直接使用修改后的镜像进行后续操
三、在PyCharm里配置部署环境
打开PyCharmTools > Deployment > Configuration, 新建一个SFTP服务器,名字自己取:
输入如下图配置,注意这里的端口是你刚刚设置的映射到容器22端口的宿主机中的端口,我这里使用的是8022,账号密码是你刚刚自己设置的,这里的Root Path设置一个远程docker容器里的路径:
配置完点击Test SFTP connection,如果成功就恭喜你,可以进行下一步了。
最后在Mappings中配置路径,这里的路径是你本地存放代码的路径,与刚刚配置的Root Path相互映射(意思是Mapping里本机的路径映射到远程的Root Path),方便以后在本地和远程docker中进行代码和其他文件同步。
4. 在PyCharm里配置远程解释器
点击PyCharm的File > Setting > Project > Project Interpreter右边的设置按钮新建一个项目的远程解释器:
配置完成以后在项目解释器界面就会出现如下图所示,可以看到此时已经完成远程解释器的本地化:
配置完成以后需要等本地和远程的环境同步一下,到这里,恭喜你,可以用最舒服的姿势。。。写代码了。
左边是本地的文件,修改之后可以随时右键deployment->upload到远程主机,或者直接在本地调试运行;最右边是远程主机的文件,假如直接在远程修改了文件刷新一下同样可以右键下载到本地,但是我不建议这样做,因为这样很容易带来冲突(毕竟没有很好的版本控制)。目前最好的实践是在局域网的服务器上,时延低,同步速度快。
常见问题:
1. 最常见的问题就是docker容器停了以后里面的SSH服务也会相应停止,因此当你发现自己某一天连不上的时候,记得去docker里重启一下ssh服务:
$service ssh restart
感谢 @丁果 对这个问题提出的解决方案:
“可以在run的时候加上--restart=always,同时ssh启动的写到dockerfile里去。”
2. 在容器中执行apt update的时候可能会出现0% working 的问题
感谢 @奥古斯都 提出该问题以及解决方案:
”这里不是源的问题,因为容器环境太过纯净,这里需要安装apt-transport-https这个deb文件,下载的时候也要注意不要下载最新的版本,否则也会出现依赖问题,要下载和当前docker容器内的apt相匹配的版本。“
参考:
/thoughtful-actors/p/10709943.html
/a/324405587_465229
如果觉得《pycharm + docker 远程调试容器内程序》对你有帮助,请点赞、收藏,并留下你的观点哦!