最新项目需要,同事用streamlit开发了几个网页的应用,部署到服务器的具体过程记录如下:
1、项目文件的结构
源代码全部放到src路径下,.streamlit目录下的config.toml文件为streamlit的配置文件,Dockerfile为docker的构建文件。
2、streamlit配置
也就是config.toml文件需要设置下服务器的路径
[server]
baseUrlPath = "web"
baseUrlPath写一个路径,这样服务器启动后可以通过
http://localhost:8501/web
来访问。这里的8501也可以通过这个文件配置,也可以后边在Dockerfile里配置
3、Dockerfile配置
FROM python:3.10
ADD ./src/ /app/
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
ENV LANG C.UTF-8
# 设置语言为utf-8
WORKDIR /app
# 设置工作目录,也就是下面执行 ENTRYPOINT 后面命令的路径
RUN pip3 install -i https://pypi.mirrors.ustc.edu.cn/simple/ -U pip
RUN pip3 config set global.index-url https://pypi.mirrors.ustc.edu.cn/simple
RUN pip3 install -r requirements.txt
# 根据requirement.txt下载好依赖包
EXPOSE 8501
ENTRYPOINT ["streamlit", "run", "UI_UnivariateSolution.py", "--server.port=8501", "--server. Address=0.0.0.0"]
这里,最后一行为docker容器建立后执行的命令,UI_UnivariateSolution.py为stremlit的入口程序。
4、docker镜像与容器
如果是在windows下,安装的docker desktop是通过wsl2驱动的,那么,一定要在windows 的terminal下打开这个文件夹,wsl2里一直提示找不到dockerfile
docker build -t img_us_240827 .
其中,img_us_240827为生成的镜像名称。这里可能碰到docker提示流量不足的问题,想办法换个节点或者代理才能解决。
生成镜像后,可以通过管理客户端看到。
再通过docker run建立容器,运行
docker run -p 8501:8501 -dit 55fcaa
55fcaa为镜像的ID号前几位
如此,成功启动容器,如下图
再通过浏览器打开
正常来说,这样就可以打开网页了。
5、服务器部署
先从本地导出镜像
docker save -o img_web.tar img_us_240827
img_web.tar为导出镜像文件的名称,img_us_240827为镜像名称
再把镜像上传服务器,在服务器上导入镜像,服务器上的docker安装可以通过bt管理程序安装。
docker load -i /media/dockerimage/img_web.tar
导入镜像后,可以从bt面板上看到
在bt面板或者命令行启动容器,运行镜像就可以,注意放行端口。
6、服务器反向代理配置
/web为最终客户端访问的路径,x.x.x.x为该app部署的ip地址,8501为端口。
7、剩余工作
应该在docker里通过nginx代理8501端口,控制8501端口只有web服务器才能访问。