tiangolo/uvicorn-gunicorn:python3.8 fastapi docker部署
运行命令和生成镜像命令
[redis V2.0] 使用官方镜像直接运行 docker run -itd -e TZ="Asia/Shanghai" --restart=always --name V2-redis -p 6379:6379 --privileged=true -v /yunhuoV2/redis/redis.conf:/etc/redis/redis.conf -v /yunhuoV2/redis/data:/data redis:6.0 redis-server /etc/redis/redis.conf --requirepass "123456" [fastapi V2.0] docker build -f fastapi_dockerfile_v2 -t xy-fastapi:2.0 . docker run -itd -e TZ="Asia/Shanghai" --restart=always --name V2-fastapi -p 9001:9001 -v /yunhuoV2/fastapi/code:/code -v /yunsuoV2/fastapi/code/logs:/code/logs xy-fastapi:2.0 /bin/bash docker run -itd -e TZ="Asia/Shanghai" --restart=always --name V2-fastapi -p 9001:9001 -v /yunhuoV2/fastapi/code:/code -v /yunsuoV2/fastapi/code/logs:/code/logs xy-fastapi:2.0 /bin/bash -c "gunicorn main:app -k uvicorn.workers.UvicornWorker -c gunicorn.conf.py"
docker部署全过程:
一、生成requirements.txt文件
1、使用虚拟环境venv,项目能在pycharm中正常运行,全部依赖包正常;
2、命令:pip freeze > requirements.txt
作用范围:pip的freeze命令保存了保存当前Python环境下所有类库包,包括那些你没有在当前项目中使用的类库。
二、dockfile文件如下:
FROM tiangolo/uvicorn-gunicorn:python3.8 WORKDIR /code COPY ./fastapi/code/requirements.txt /code/requirements.txt RUN python -m pip install --upgrade pip -i http://pypi.douban.com/simple/ --trusted-host=pypi.douban.com/simple/ RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt -i http://pypi.douban.com/simple/ --trusted-host=pypi.douban.com/simple/ COPY ./fastapi/code /code CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "9001"]
三、生成镜像命令: (docker build -f fastapi_dockerfile_v2 -t xy-fastapi:2.0 .)
四、运行容器命令:
docker run -itd -e TZ="Asia/Shanghai" --restart=always --name V2-fastapi -p 9001:9001
-v /yunhuoV2/fastapi/code:/code -v /yunsuoV2/fastapi/code/logs:/code/logs
xy-fastapi:2.0 /bin/bash
五、进入容器命令:docker exec -it e1cd43c4f0a5 /bin/bash
六、在容器中运行:gunicorn main:app -k uvicorn.workers.UvicornWorker -c gunicorn.conf.py
七、查看运行错误log文件:(如果启动不成功会有error提示)
gunicorn_error.log 目录/code/logs
八、查看正常运行log文件:
gunicorn_accesslog.log、uvicorn_2022-08-31.log 目录/code/logs
最大教训:
1、尽量使用虚拟环境venv,保证一个项目单独的包文件;
2、在项目目录下运行下列命令生成包需求文件,只能用这个方法,生成的包文件准确,其他方法不行的。
方法一:整个环境下的安装包都保存到requirements.txt中
pip freeze > requirements.txt
作用范围:pip的freeze命令保存了保存当前Python环境下所有类库包,包括那些你没有在当前项目中使用的类库。
(如果你没有的virtualenv)
常用docker命令
进入容器:docker exec -it a6fe8d12febc /bin/bash 查看容器:docker ps -a 查看日志:docker logs c7ffe3c212c2 查看镜像:docker images 删除容器:docker rm 60a643861c76 删除镜像:docker rmi 60a643861c76 运行容器:docker run -itd -e TZ="Asia/Shanghai" --restart=always --name V2-fastapi -p 9001:9001 -v /yunhuoV2/fastapi/code:/app xy-fastapi:2.0 /bin/bash 运行容器:docker run -itd -e TZ="Asia/Shanghai" --restart=always --name V2-fastapi -p 9001:9001 -v /yunhuoV2/fastapi/code:/app xy-fastapi:2.0 /bin/bash -c "gunicorn main:app -k uvicorn.workers.UvicornWorker -c gunicorn.conf.py" 拷贝文件:docker cp dos.sh e1cd43c4f0a5:/code 生成镜像:docker build -f fastapi_dockerfile_v1 -t xy-fastapi:2.0 .
经验教训:
1、gunicorn log文件固定放置在容器中目录:/code/logs ,所以这个目录必需映射出来;
2、按照fastapi官方建议,uvicorn运行目录:/app ,所以这个目录要映射到代码目录;
3、通过查找目录(/code/logs )中gunicorn错误信息和(/app/logs)中uvicorn的logger错误信息,就可以定位docker部署的问题所在。
4、通过命令(docker exec -it a6fe8d12febc /bin/bash),进入容器中查看目录/code/logs下错误信息,在容器不能正常启动时,错误信息会无法同步出来主机中。
5、完全版run命令会无法启动docker:
>>>>>docker run -itd -e TZ="Asia/Shanghai" --restart=always --name V2-fastapi -p 9001:9001 -v /yunhuoV2/fastapi/code:/app xy-fastapi:2.0 /bin/bash -c "gunicorn main:app -k uvicorn.workers.UvicornWorker -c gunicorn.conf.py"
先运行简化版启动docker,就可以进入容器:
>>>>>docker run -itd -e TZ="Asia/Shanghai" --restart=always --name V2-fastapi -p 9001:9001 -v /yunhuoV2/fastapi/code:/app xy-fastapi:2.0 /bin/bash
进入容器后进行命令,然后进去logs目录查看错误信息:
>>>>>gunicorn main:app -k uvicorn.workers.UvicornWorker -c gunicorn.conf.py
6、常用命令:
进入容器:docker exec -it a6fe8d12febc /bin/bash 查看容器:docker ps -a 查看日志:docker logs c7ffe3c212c2 查看镜像:docker images 删除容器:docker rm 60a643861c76 删除镜像:docker rmi 60a643861c76 运行容器:docker run -itd -e TZ="Asia/Shanghai" --restart=always --name V2-fastapi -p 9001:9001 -v /yunhuoV2/fastapi/code:/app xy-fastapi:2.0 /bin/bash 运行容器:docker run -itd -e TZ="Asia/Shanghai" --restart=always --name V2-fastapi -p 9001:9001 -v /yunhuoV2/fastapi/code:/app xy-fastapi:2.0 /bin/bash -c "gunicorn main:app -k uvicorn.workers.UvicornWorker -c gunicorn.conf.py"