簡介:
或許我也應該遷移到linux環境去開發。
最近寫的一些小東西,在wnidows上開發,在windows上調試,都很正常。可是一旦放進linux服務器,就歇菜了。
那么我們有什么辦法處理這個windows和linux的兼容問題呢?在linux開發,或者在linux環境下開發。看着差不多,但是意思真不一樣。
在linux開發,那就是用linux操作系統進行開發。
在linux環境下開發,那就不限於在linux操作系統進行開發,我們可以在windows下寫代碼,放在linux環境中執行。
不去換操作系統了,直接在windows下寫代碼,用linux環境執行吧。
查着開放了docker的2375,2376,使用了SSL證書,結果發現只是用pycharm管理docker服務,還沒我用daocloud管理方便,廢棄了。
一:創建linux環境鏡像
雖然我有個NUC跑着fedora(linux),但是我喜歡部署到alpine-docker里面去,而且也不希望任何開發環境再把我的nuc搞亂,那么還是用docker創建一個可以用來執行python解析的環境吧。
1.docerfile
from alpine:3.8
MAINTAINER jackadam<jackadam@sina.com>
#變更源
# 安裝包源切到中科大, 國內訪問加速
RUN { \
echo 'http://mirrors.ustc.edu.cn/alpine/v3.8/main'; \
echo 'http://mirrors.ustc.edu.cn/alpine/v3.8/community'; \
echo 'http://mirrors.ustc.edu.cn/alpine/edge/main'; \
echo 'http://mirrors.ustc.edu.cn/alpine/edge/community'; \
echo 'http://mirrors.ustc.edu.cn/alpine/edge/testing'; \
} > /etc/apk/repositories
# 設置默認時區為亞洲/上海 (沒有北京可選)
RUN apk upgrade && \
apk add --no-cache apk-tools tzdata openssh && \
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
apk del tzdata && \
#修改root密碼
echo root:123456 | chpasswd && \
#生成KEY
ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -P '' -N '' && \
#允許遠程登錄
sed -i "s/#PermitRootLogin.*/PermitRootLogin yes/g" /etc/ssh/sshd_config
#開放22端口
EXPOSE 22
CMD /usr/sbin/sshd -D
使用這個dockerfile創建一個docker鏡像。
2019-10-24更新,添加 apk upgrade,解決部分庫版本不兼容的問題。
2.build.sh
#使用docker
echo 停止容器 docker stop ssh echo 刪除容器 docker rm ssh echo 臨時禁用selinux setenforce 0 echo 重建鏡像 docker build -t ssh . echo 恢復啟用selinux setenforce 1 echo 啟動容器 docker run -d -t --restart=always --privileged --name ssh -p 2222:22 ssh #下面使用docker-compose #!/bin/bash echo 暫停selinux setenforce 0 echo 停止容器 docker-compose -f ssh.yaml down echo 重建鏡像 docker-compose -f ssh.yaml build echo 啟動容器 docker-compose -f ssh.yaml up -d echo 重新打開selinux setenforce 1
使用這個腳本來創建鏡像,並啟動容器。因為我老忘記selinux,重啟,刪除……
反正用着方便。
更新使用docker-compose
3.嘗試遠程登錄,並安裝python
Winscp,putty,都可以正常登錄這個2222端口的容器即可。
安裝python的命令是:apk add python3
二:安裝python3
1.修改dockerfile
from alpine:3.8 MAINTAINER jackadam<jackadam@sina.com> #變更源 # 安裝包源切到中科大, 國內訪問加速 RUN { \ echo 'http://mirrors.ustc.edu.cn/alpine/v3.8/main'; \ echo 'http://mirrors.ustc.edu.cn/alpine/v3.8/community'; \ echo 'http://mirrors.ustc.edu.cn/alpine/edge/main'; \ echo 'http://mirrors.ustc.edu.cn/alpine/edge/community'; \ echo 'http://mirrors.ustc.edu.cn/alpine/edge/testing'; \ } > /etc/apk/repositories # 設置默認時區為亞洲/上海 (沒有北京可選) RUN apk upgrade && \ apk add --no-cache apk-tools tzdata openssh && \ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ apk del tzdata && \ #修改root密碼 echo root:123456 | chpasswd && \ #生成KEY ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -P '' -N '' && \ #允許遠程登錄 sed -i "s/#PermitRootLogin.*/PermitRootLogin yes/g" /etc/ssh/sshd_config #這里增加python3 RUN apk add python3 sudo &&\ pip3 install -i http://pypi.douban.com/simple --upgrade --trusted-host pypi.douban.com pip setuptools
#開放22端口 EXPOSE 22 CMD /usr/sbin/sshd -D
更新使用豆瓣源安裝python庫
2.重新生成鏡像
還用上一節的rebuild
3.測試遠程登錄
就用winscp或putty測試
三:配置pycharm部署
1.配置Deployment-Connection
和WINSCP的一樣,就是SFTP的ssh配置。Test SFTP connecton,測試通過就可以了。
2.配置Deployment-Mappings
這個是映射關系。Loacl path,就是項目的本地路徑。Deployment path,就是在服務器上的路徑。不過要加上第一個圖中connection中的Root path。
如果
Root path : /PythonPorject
Deployment path: /test01
那么在服務器上的路徑為:/PythonPorject/test01
四:配置pycharm解釋器
使用 deployment configuration,選擇剛才命名的部署配置名,設置python解釋器地址,因為我用的python3,默認的沒有python,所以改一下解釋器路徑,選擇到python3就可以了。
五:hello world
1.編寫代碼
print('hello world.')
2.部署
pycharm中 Tools--Deployment--Upload to test,
上傳完成,一個文件傳輸完成,那個test是我的部署配置名,你的可能會不一樣。
Automatic Upload(always)自動上傳,我勾選了。
改代碼,不用再手動上傳
3.run一下,跑起來
好了,可以看到輸出框是遠程執行的,在ssh連接的192.168.1.3上執行的。
六:python包管理
1.python包管理
嘗試使用pycharm對這個遠程環境安裝python包,結果報錯。
其實也簡單,因為這個alpine linux docker鏡像沒有sudo。
2.安裝sudo
編輯dockerfile
from alpine:3.7 MAINTAINER jackadam<jackadam@sina.com> #變更源 # 安裝包源切到中科大, 國內訪問加速 RUN { \ echo 'http://mirrors.ustc.edu.cn/alpine/v3.7/main'; \ echo 'http://mirrors.ustc.edu.cn/alpine/v3.7/community'; \ echo 'http://mirrors.ustc.edu.cn/alpine/edge/main'; \ echo 'http://mirrors.ustc.edu.cn/alpine/edge/community'; \ echo 'http://mirrors.ustc.edu.cn/alpine/edge/testing'; \ } > /etc/apk/repositories && \ # 設置默認時區為亞洲/上海 (沒有北京可選) apk add --no-cache --upgrade apk-tools openssh tzdata&& \ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ echo "Asia/Shanghai" > /etc/timezone && \ apk del tzdata #修改root密碼 RUN echo root:123456 | chpasswd #生成KEY RUN ssh-keygen -q -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key -P '' -N '' #允許遠程登錄 RUN sed -i "s/#PermitRootLogin.*/PermitRootLogin yes/g" /etc/ssh/sshd_config #開放22端口 EXPOSE 22 #這里增加python3 RUN apk add python3 && \ pip3 install --upgrade pip && \ pip3 install --upgrade setuptools &&\ apk add sudo #sudo新增加 CMD /usr/sbin/sshd -D
3.測試
rebuild一下
再試試。現在應該可以在pycharm中管理遠程docker中的python環境,並安裝python包了。
4.另一種解決方法
不更新dockerfiler也可以解決,因為開放了ssh連接,你也可以直接ssh登錄,然后安裝sudo。效果一樣的。
七:注意事項
1.部署路徑是合並的,如果上傳失敗,可能是遠程沒有這個目錄,手動去創建一下,或dockerfile 中 mkdir一下。
2.pycharm可以通過sudo來給遠程環境安裝pythan包,但是不能安裝linux系統軟件,系統軟件要在dockerfile中安裝,如安裝sudo。
八:總結
從家里淘到NUC以后,就一直想着怎么最大化利用它,自己寫的一些軟件,在windows下運行良好,轉去linux,還要重新調整。直接使用pycharm的遠程解釋器,遠程部署功能,我可以在windows上寫代碼,跑在linux下,環境也在linux下。方便以后開發linux下的python程序。
而且家里的NUC也就是作為家庭服務器來用的。開發一些24小時在線的,或者未來面向服務器部署的軟件。還不影響我的windows筆記本。
也就有了這篇文章。
不過也走了一些彎路,因為pycharm支持管理docker,為了docker的安全,整那幾個證書密鑰,整了好幾天,發現pycharm管理docker還真不如daocloud方便。