用Docker部署前端静态文件和Python后端框架

1,570 阅读4分钟

记录下自己部署过程,先从前端简单的开始。 使用最简单的方式部署,前提是要了解Docker是干嘛的,并安装了Docker。

部署前端项目:

从掘金看一个合成大西瓜的游戏源码: juejin.cn/post/692380… image.png

拿过来稍稍魔改一下玩玩: 用cocosDashbord替换素材重新构建一下 image.png 直接打开index.html,效果如下图

image.png 原项目地址:github.com/tangxiangmi…,我改了下素材 接下来在这个index.html文件夹目录下创建Dockerfile文件,并输入以下内容

FROM nginx 
#指定基础镜像,必须为第一个命令
 
COPY . /usr/share/nginx/html/  
#本地Dockerfile文件目录所有内容添加到容器/usr/share/nginx/html/目录中

在index.html文件下打开命令行工具输入镜像打包命令:

docker build -t testimage . 

 -t后面的testimage是镜像的名字及标签,‘.’这个符号为当前目录查找DockerFile文件。执行DockerFile文件内容,生成一个名为testimage的镜像。后面将会把这个镜像run一个容器出来,或者上传到镜像仓库image.png 接下来在命令行输入 docker images 可以看到这个testimage镜像 image.png 接下来在命令行输入docker命令:

docker run --name testcontainer -d -p 8090:80 testimage

--name后面 testcontainer 指定容器名称。 -p后面把容器80端口映射到宿主机8090端口,宿主机就是运行命令的电脑,Dockerfile里面FROM nginx,这个容器就直接有nginx环境并把目录在/usr/share/nginx/html/  里的代码暴露在80端口,访问index.html就直接看到这个前端项目了,访问宿主机8090端口就等于访问容器80端口。 -d指后台运行容器并返回容器ID, 最后面testimage是镜像名字 现在就直接可以用docker ps 看到现在运行的容器: image.png访问127.0.0.1:8090/index.html 试试: image.png 可以看到直接打开了。可以把镜像直接运行到有公网ip的机器上直接公网ip访问:公网ip:8090/index.html, 还可以在公网ip的机器上安装nginx,用域名解析上去,项目就上线了。 我自己稍微部署了一下: xg.tuwei.space

部署后端项目:

后端项目比前端要复杂一点点,需要安装一些依赖包: 我们来用下最近特别火的基于Python的Web框架FastAPI,性能非常高,代码也很少的异步框架,跟Flask差不多,很简单 我们从本地把它跑起来吧,写一个接口 需要先本地安装两个包

pip install uvicorn
pip install fastapi

uvicorn:我的看法是类似于nginx的一种服务器软件, 百度是说: Uvicorn 是基于 uvloop 和 httptools 构建的非常快速的 ASGI 服务器 什么是ASGI: 异步网关协议接口,一个介于网络协议服务和 Python 应用之间的标准接口,能够处理多种通用的协议类型,包括 HTTP,HTTP2 和 WebSocket

新建一个main.py输入一下框架最简代码:

from fastapi import FastAPI

app = FastAPI()


@app.get("/index")
async def index():
    return {'code': 200, 'msg': 'FastAPI niubi'}

启动命令:

uvicorn main:app  --reload

image.png 修改代码会自动更新,框架默认暴露的端口为8000,来试试: image.png

接下来在main.py文件夹下新建Dockerfile文件输入以下内容

FROM wynemo/python38 
# 我想在python38环境下运行这个容器需要docker search搜索一下相关镜像,不能直接FROM python38。
ADD . /code
# ADD命令是将宿主机Dockerfile目录下所有的代码复制到wynemo/python38这个虚拟机镜像里/code目录下
WORKDIR /code
# WORKDIR是指以后的命令在该文件夹下执行,等同于cd命令 
RUN python3 -m pip install --upgrade pip -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com \
&& pip3 install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com fastapi \
&& pip3 install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com uvicorn

# RUN命令 这里主要做升级包管理工具,安装依赖包两个功能,后面-i是直接指定依赖包的源地址,加快构建速度。还可以做其他的跟多的功能,比如数据库迁移,清除缓存什么的。

CMD uvicorn main:app --host '0.0.0.0' --port 8080 --reload
#CMD 是指镜像运行时执行的命令,让容器里面的服务运行起来。--host能指定FastAPI的运行ip,不能指定为127.0.0.1,不然只能容器内访问啦。--port指框架运行的端口,后面运行容器会用到

在项目根目录下执行打包镜像命令,这里直接说命令了,不仔细截图了

docker build -t docker-fastapi:latest .

运行容器

docker run --name docker-fastapi -d -p 8100:8080 docker-fastapi

最后访问127.0.0.1:8100/index 试一下 image.png 部署成功,因为后端项目很简单就不上线了,就到此为止啦。

补充

最后补充一下,在线上运行时需要让docker开机自动启动,还需要在docker服务重启后容器也自动重启 加上--restart=always命令

docker run --restart=always

已经容器已经启动了,使用docker update命令

docker update --restart=always <CONTAINER ID>