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-server
apt-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相匹配的版本。“

参考:

https://www.cnblogs.com/thoughtful-actors/p/10709943.html

http://www.sohu.com/a/324405587_465229

 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐