目錄
前言
一、准備工作
二、為docker鏡像配置ssh-server
三、將本地目錄映射到docker容器中
四、將pycharm於docker容器相鏈接
前言
本文中,將詳細講述如何使用pycharm調用docker中的python環境,並處理宿主機(本地)中的文件。
一、准備工作
本文所需要的工具如下
1.pycharm(專業版),只有專業版才支持ssh鏈接進行調試,而本文中pycharm與docker容器之間的鏈接就是通過ssh來完成的(注意,不是鏡像),沒有專業版的小伙伴可以去官網使用edu郵箱申請一下。
2.docker社區版,這個直接上官網下載就好了,安裝教程見https://blog.csdn.net/ambm29/article/details/96151358
3.配置好python環境的docker鏡像,可以直接從docker hub上下載,也可以參照如下教程進行配置:https://blog.csdn.net/ambm29/article/details/96278696
二、為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:/# systemctl restart sshd
出現如下結果,即為安裝成功
接下來,設置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://blog.csdn.net/ambm29/article/details/96151358
三、將本地目錄映射到docker容器中
筆者認為,我們之所以配置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於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 --privileged=true -d ubuntu:ssh /usr/sbin/init
可以看到,我們的容器不僅運行成功,而且端口也映射好了,現在我們對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路徑映射的是本地的文件夾)。當然這塊有點復雜,希望大家可以動手實際操作下。
參考:https://blog.csdn.net/ambm29/article/details/96483086