简介:
或许我也应该迁移到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方便。