一、背景
前面的文章讲解了如何购买云服务器,如何使用现成的项目为自己所用。现在进入下一个阶段,如何打包自己的项目代码,然后各个地方部署,我们实现一个简单的web项目。
二、前期准备
少量的Dockerfile编写知识,少量的Docker使用知识,少量的Python知识。今天需要编写少量的代码,所有的操作都可以跟着操作即可,练习的多了就会了。
然后还需要用到镜像仓库,我们的环境打包成镜像后,保存到镜像仓库,在其他地方运行时,从仓库里取出对应的镜像就可以保持所有的环境一致性,解决不同环境不同配置导致的问题。
有两种方式的镜像仓库,第一种搭建自己的镜像仓库,根据前面的学习经验自行尝试。第二种使用现成的镜像仓库,下面提供地址,进入地址后,先自行注册登录,配置仓库,可以得到仓库的用户名(username),后续都是使用这个用户名进行镜像操作。
三、项目实践
1、项目目录设置
static:用于存放前端传过来的数据,目录下为空
templates:用于存放前端页面代码,目录下只有index.html,html和js均写在index.html里面
app.py:后端代码,接受http数据,并进行处理
Dockerfile:编写docker可识别的打包和运行程序
requirements.txt:记录所有需要的python三方库,也是为了镜像打包时使用
项目功能:很简单,在text文本框内输入内容,然后保存到后端的data目录下。
主要目的:打通前后端链路以及如何使用docker实现一次打包,到处部署。
2、代码内容
1)index.html内容如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
<p>Hello Python</p>
<input type="text" id="inputText">
<button id="submitButton">Submit</button>
<script>
$(document).ready(function(){
$('#submitButton').click(function(){
var inputText = $("#inputText").val();
$.ajax({
url: '/button_clicked',
type: 'POST',
data: {inputText: inputText},
success: function(response){
alert("Response from server: " + response);
},
error: function (xhr, status, error){
console.log(xhr.responseText)
}
});
});
});
</script>
</body>
</html>
2)app.py的内容如下:
import os
from flask import Flask, request
from jinja2 import FileSystemLoader, Environment
app = Flask(__name__)
env = Environment(loader=FileSystemLoader('templates'))
@app.route('/')
def hello_world():
template = env.get_template('index.html')
return template.render()
@app.route('/button_clicked', methods=['POST'])
def button_clicked():
# 获取内容,保存到文件中
input_text = request.form.get("inputText")
file = os.path.join(os.getcwd(), 'static', 'save_data.txt')
with open(file, mode='a', encoding='utf-8') as f:
f.write(input_text)
return "Saved successfully"
if __name__ == '__main__':
app.run(host="0.0.0.0", debug=True, port=2333)
3)requeirements.txt内容如下:
blinker==1.7.0
cffi==1.16.0
click==8.1.7
colorama==0.4.6
Flask==3.0.2
gevent==24.2.1
greenlet==3.0.3
itsdangerous==2.1.2
Jinja2==3.1.3
MarkupSafe==2.1.5
pycparser==2.21
setuptools==69.1.1
Werkzeug==3.0.1
zope.event==5.0
zope.interface==6.2
可以直接在项目根目录下使用命令导出三方库到requirements.txt中
pip freeze > requirements.txt
4)Dockerfile中的内容如下:
FROM python:3.12.1
WORKDIR ./web_doupo
ADD . .
RUN pip install -r requirements.txt
CMD ["python", "./app.py"]
3、打包项目,上传镜像仓库
1)进入项目根目录,即Dockerfile同级目录,登录docker
docker login
输入注册docker时的用户名和密码
2)执行打包命令
docker build -t web_doupo:v1 .
3)等待打包完成后,添加tag,格式如下:
docker tag web_doupo:v1 username/web_doupo:v1
username:用户名获取方式见文章上方创建账号时获取。下面提到的username均这样操作。
4)推送镜像文件到镜像仓库
docker push username/web_doupo:v1
5)查看是否推送成功,进入仓库地址,有自己的镜像说明推送成功。
4、下载镜像
1)进入腾讯云服务器,登录docker
docker login
输入注册docker时的用户名和密码
2)拉取上传好的镜像
docker pull username/web_doupo:v1
3)开放腾讯云服务器端口
4)运行镜像程序
docker run -v ./data:/web_doupo/static -p 0.0.0.0:2333:2333 username/web_doupo:v1
-v:挂载项目的目录/web_doupo/static到当前目录的data下,用于保存数据不丢失
-p:映射端口2333,用于web访问
5、效果验证
1)打开浏览器访问:
http://公网IP:2333/
2)输入内容后,点击Submit,查看网页提示和本地数据是否保存下来
四、经验总结
腾讯云免费试用到期了,暂时这类实用分享结束。通过这些分享,发现当前工具利用docker打包运行的太多了,而且通过使用发现确实能够提高效率,解决了大量的环境问题,节省了很多时间,从事互联网行业,要好好了解一下这个工具,协助自己的日常工作。
五、问题解决
1、访问不了docker网站,提示登录超时,或者下载,上传超时。
解决办法:由于禁制的问题,国内访问docker网站时好时坏,如果遇到上传,下载超时,两种解决办法。
第一种:等待腾讯云访问docker地址突然好了,一般情况下等待一下就可以了。
第二种:更换镜像地址为国内镜像地址
2、所有的环境都需要安装docker engine
ubuntu安装docker engine见前面的文章
windows安装直接安装Docker Desktop软件,会自动安装docker engine
好好学习,天天向上。