云原生-部署python应用到docker镜像里
场景: 定时发送邮件到指定邮箱(这里做了个阉割版的,是在docker内部运行服务器主机上的python程序,然后发送邮箱到指定邮箱)。
工具: python
环境: ubuntu 18.04.4 LTS
Docker version 20.10.16, build aa7e414
python3 (使用smtplib发送)
(有些人肯定觉得没必要那么麻烦,直接装在宿主机里就可以了,没必要放到docker里。但是我想的是开发分离。python的环境和其他环境独立开来,后面迁移也方便,而且也不需要再宿主机做虚拟python环境,如果有多个python版本的就直接多个镜像好了)
1、首先先安装smtplib
pip3 install PyEmail #注意不是smtplib
测试发送代码
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
my_sender='1910076XXX@qq.com' # 发件人邮箱账号
my_pass = 'skmficoprl123456111' # qq邮箱的授权码,并不是登录密码(当时申请smtp给的口令)
my_user='1910076XXX@qq.com' # 收件人邮箱账号,我这边发送给自己
def mail():
ret=True
try:
msg=MIMEText('docker 挂载python路径自动发送','plain','utf-8')
msg['From']=formataddr(["发件人昵称",my_sender]) # 括号里的对应发件人邮箱昵称、发件人邮箱账号
msg['To']=formataddr(["收件人昵称",my_user]) # 括号里的对应收件人邮箱昵称、收件人邮箱账号
msg['Subject']="邮件主题-测试" # 邮件的主题,也可以说是标题
server=smtplib.SMTP_SSL("smtp.qq.com", 465) # 发件人邮箱中的SMTP服务器,端口是465
server.login(my_sender, my_pass) # 括号中对应的是发件人邮箱账号、邮箱密码
server.sendmail(my_sender,[my_user,],msg.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
server.quit()# 关闭连接
except smtplib.SMTPException:# 如果 try 中的语句没有执行,则会执行下面的 ret=False
print(smtplib.SMTPException)
ret=False
return ret
if __name__ == "__main__":
ret=mail()
if ret:
print("邮件发送成功")
else:
print("邮件发送失败")
邮件授权码配置
2、安装python 镜像(如果已经有现成的这一步可以省略)
docker image pull python
3、将文件上传到服务器
4、挂载本地python项目路径到docker 内部
docker run -itd -v "/var/www/html/Python/Python Project":"/var/www/html/Python/Python Project" --name python -p 8071:80 -d python
5、进入容器里
docker exec -it python /bin/bash
6、进入docker里映射后的python项目路径
7、运行python程序
在python项目目录下执行以下代码
python sentMail.py
总结:
优势: docker 环境下很好对程序进行了隔离。看下面2张图可以看出来,第一张图是docker镜像python里的目录,只有python的项目,但是宿主机里相同的路径下是有python、ui5、vue、nginx等等应用程序。权限管理起来会比较麻烦。
不足: 劣势也很明显,对开发人员的要求更高,技术栈需要更多,而且随着系统的复杂上升,对架构、负载均衡,端口正向映射/反向映射 等等知识都需要了解。而且随着容器的增多必然也会面临权限分割、容器管理等等问题。
目前来看的话还是使用docker还是比没使用管理起来会更高效和便捷