使用pycharm调用docker中的python处理宿主机的文件
一、准备工作
本文所需的工具如下
1.pycharm(专业版)只有专业版才支持ssh调试链接,本文pycharm与docker容器之间的链接是通过ssh完成(注意,不是镜像),没有专业版的朋友可以去官网使用edu申请邮箱。
2.docker社区版,直接在官网下载。安装教程见https://blog.csdn.net/liqiang12689/article/details/121276873
3.配置好python环境的docker镜像,可以直接从docker hub也可参照以下教程配置上下载:https://blog.csdn.net/liqiang12689/article/details/121276873
二、为docker镜像配置ssh-server
首先启动docker镜像,创建一个新的容器,并安装在容器中ssh-server
PS C:\Users\ChenJH> docker run -it ubuntu:potk # 创造docker容器 (base) root@dd53ea4c2f2b:/# apt-get install openssh-server # 安装ssh-server
之后检查ssh-server安装成功与否
(base) root@dd53ea4c2f2b:/# service ssh start
接下来,设置ssh-server自动启动
echo 'service ssh start'>>~/.bashrc
随后,为ssh登录设置密码,此处暂定密码csdn,不要使用数字开头,请记住您的密码,用户名默认为root
(base) root@dd53ea4c2f2b:/# passwd Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully
使用命令vim /etc/ssh/sshd_config,修改以下两种配置
PermitRootLogin yes UsePAM no
到这里,docker容器中的ssh-server所有配置都成功了。让我们把容器提交给镜像,留在后面使用。
(base) root@dd53ea4c2f2b:/# exit exit PS C:\Users\ChenJH> docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES dd53ea4c2f2b ubuntu:potk "/bin/bash" About an hour ago Exited (0) 13 seconds ago condescending_kell PS C:\Users\ChenJH> docker commit dd53ea4c2f2b ubuntu:ssh sha256:a3d978258f5901210263cfa730d8b54a230df356e4c302b4a22e0ebd744e21a3 PS C:\Users\ChenJH> docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu ssh a3d978258f59 5 seconds ago 8.94GB ubuntu potkd c7c187496762 30 hours ago 9.01GB
三、映射本地目录docker容器中
在实际应用中,如果将需要处理的数据和代码放入实际应用中docker在镜像或容器中,docker镜像会变得越来越大,所以我们使用映射本地文件夹docker容器中的方法可以通过docker处理当地文件的环境。
docker映射本地文件夹的命令如下:
docker run -v [本地文件夹路径]:[docker容器中映射的目标文件夹路径] [IMAGE]:[TAG]
让我们试试效果:
PS C:\Users\ChenJH> docker run -it -v C:\opencv:/data ubuntu:ssh
* Starting OpenBSD Secure Shell server sshd
# 启动容器
(base) root@4661eca714bc:/# cd /data/
# 切换到/data目录
(base) root@4661eca714bc:/data# ll
total 4
drwxrwxrwx 2 root root 0 Jul 19 09:42 ./
drwxr-xr-x 1 root root 4096 Jul 19 09:44 ../
drwxrwxrwx 2 root root 0 Jul 10 01:29 opencv/
# 查看该文件夹中有什么文件
(base) root@4661eca714bc:/data# mkdir hello_docker
# 为了验证效果,我们在该目录下新建一个叫hello_docker的文件夹
(base) root@4661eca714bc:/data# ll
total 4
drwxrwxrwx 2 root root 0 Jul 19 09:44 ./
drwxr-xr-x 1 root root 4096 Jul 19 09:44 ../
drwxrwxrwx 2 root root 0 Jul 19 09:44 hello_docker/
drwxrwxrwx 2 root root 0 Jul 10 01:29 opencv/
# 可以看到,文件夹建立成功
接下来,切换到windows,看看‘C:\opencv’下有没有多出一个文件夹。 OK,离成功又进一步,这说明我们在docker环境中成功处理了宿主机中的文件。
四、将pycharm于docker容器相链接
为了使pycharm可以通过ssh链接到docker容器,我们需要为docker容器分配端口,分配端口的命令如下:
docker run -p [宿主机端口号]:[要映射的docker容器端口号] [IMAGE]:[TAG]
如上,我们使用以下命令开启开启映射端口并且映射目录的容器,在这里,我们将docker容器中的22端口(ssh默认端口)映射到宿主机的10001(随便写的)端口中。不同的是,我们这次不启动docker的命令行,而是使用守护进程的方式让docker容器在后台运行,这时,只需要把’-it’改成’-id‘就行,‘d’在这里的意思即为让该容器以守护进程的方式运行。
docker run -it -p 10001:22 -v C:\Users\ChenJH\Documents\DataSet:/data ubuntu:ssh
此处 C:\Users\ChenJH\Documents\DataSet为主机目录路径,/data为docker镜像中要新建并保存的目录 可以看到,我们的容器不仅运行成功,而且端口也映射好了,现在我们对docker镜像的操作就可以告一段落,下面我们将进入pycharm进行设置。
首先确认我们的Pycharm是专业版,分辨方法也非常简单,在启动pycharm时,如果有看到professional字样,那就说明你的pycharm是专业版啦。
在本文中,我们添加为pycharm添加docker环境的方法是通过远程ssh的方式来添加的,但其实Pycharm已经为我们设置好了直接使用docker环境的方法,但是笔者一直没有调试成功,所以这也是一种曲线救国的办法吧。
打开pycharm后,在状态栏中选择File->Settings->progect:[你的项目名字]->project interpreter->页面左上的小齿轮->Add 之后,选择SSH Interpreter(如果没这个选项说明你pycharm的是社区版),然后按照图中的设置,注意port中要填入你,刚才映射到宿主机中端口号(上一步中我们将docker容器中的22端口映射到了10001端口,因此这里填写10001),127.0.0.1的意思是本地环回,不太理解的朋友们照着填就好了。 地址获得可以输入如下命令:
docker inspect --format='{
{.NetworkSettings.IPAddress}}' ID/NAMES
我的电脑输入:
docker inspect --format='{
{.NetworkSettings.IPAddress}}' fervent_matsumoto
输入密码,刚才设置的密码是csdn。 下面这一步比较复杂,大家可以结合实践多试试,在Interpreter中设置你的Python环境安装路径,不确定的话就去docker容器中找一找。
Sync folders中填写本地要和docker容器中哪个文件夹建立联系,因为pycharm远程的原理是将远程的Py文件下载到本地修改,然后在运行和调试时发送到远程去执行。注意,这里的远程和本地分别置docker镜像和宿主机。(仔细看路径,还记得我们将本地的文件夹映射到了/data路径么,所以这里其实处理的是本地的程序) 之后,远程环境就已经配置好了,我们在状态栏中选择Tools->Deployment->Browse Remote Host
就可以看到我们docker容器的里的文件系统了,如下图所示,我们找到刚才设置的远程映射路径,如果你的路径找对的话,文件夹会显示为绿色,如下图所示。
我们右键绿色的文件夹,选择Sync with local,他会扫描本地与远程的差异,见下图 因为只需要同步py文件,因此在Filter中输入*.py,之后点回车,在点击绿色的快进号(两个三角形),本地的py文件就下载好了。如下图所示。 现在,我们就可以像编辑本地文件一样,通过docker里的Python环境来处理本地数据了(其实/data路径映射的是本地的文件夹)。当然这块有点复杂,希望大家可以动手实际操作下。