本文中,将详细讲述如何使用pycharm调用docker中的python环境,并处理宿主机(本地)中的文件。
本文所需要的工具如下
1.pycharm(专业版),只有专业版才支持ssh链接进行调试,而本文中pycharm与docker容器之间的链接就是通过ssh来完成的(注意,不是镜像),没有专业版的小伙伴可以去官网使用edu邮箱申请一下。
2.docker社区版,这个直接上官网下载就好了,安装教程见https://www.cdsy.xyz/computer/cloud_technology/docker/230722/cd44827.html
3.配置好python环境的docker镜像,可以直接从docker hub上下载,也可以参照如下教程进行配置:https://www.cdsy.xyz/computer/cloud_technology/docker/230722/cd44828.html
首先启动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
如果没有安装vim,使用如下命令安装
apt-get install vim
echo ':set term=builtin_ansi' >> /usr/share/vim/vimrc
# 第二行如果不加的话会出现在vim中方向键使用失灵的情况
到这里,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
不熟悉有关镜像和容器相关操作的朋友可以看这篇教程https://www.cdsy.xyz/computer/cloud_technology/docker/230722/cd44827.html
笔者认为,我们之所以配置docker,是因为docker可以被当作一种可移植的开发环境,通过组建自己的docker,可以在很方便的将开发环境中的程序部署到生产环境中。
但是在实际应用时,如果将需要处理的数据和代码都放入docker镜像或者容器中,docker镜像会变得越来越庞大,因此我们使用映射本地文件夹到docker容器中的方法,就可以通过docker中的环境来处理本地文件了。
docker映射本地文件夹的命令如下:
docker run -v [本地文件夹的路径]:[docker容器中映射的目标文件夹路径] [IMAGE]:[TAG]
如上所示,我们将本地的‘C:\opencv’文件夹,映射到docker容器中的‘/data’文件夹中。
docker run -it -v C:\opencv:/data ubuntu:ssh
我们来试试效果:
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可以通过ssh链接到docker容器,我们需要为docker容器分配端口,分配端口的命令如下:
docker run -p [宿主机端口号]:[要映射的docker容器端口号] [IMAGE]:[TAG]
如上,我们使用以下命令开启开启映射端口并且映射目录的容器,在这里,我们将docker容器中的22端口(ssh默认端口)映射到宿主机的10001(随便写的)端口中。不同的是,我们这次不启动docker的命令行,而是使用守护进程的方式让docker容器在后台运行,这时,只需要把'-it'改成'-id‘就行,‘d’在这里的意思即为让该容器以守护进程的方式运行。
docker run -id -p 10001:22 -v C:\Users\ChenJH\Documents\DataSet:/data ubuntu:ssh
可以看到,我们的容器不仅运行成功,而且端口也映射好了,现在我们对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的意思是本地环回,不太理解的朋友们照着填就好了。
输入密码,刚才设置的密码是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路径映射的是本地的文件夹)。当然这块有点复杂,希望大家可以动手实际操作下。