************************
部署和运维
************************
uwsgi VS Gunicorn
===========================================
两个服务器的区别是: `uwsgi `_ 用C写,Gunicorn是纯Python实现,性能上比uwsgi慢,但安装和使用比uwsgi简单。
因为Docker能解决uwsgi的安装问题,所以选用uwsgi,gunicorn作为第二选择。
.. tip::
重启命令: ``uwsgi --reload /tmp/project-master.pid``
docker + docker-compose + uwsgi + jenkins
=======================================================
使用jenkins自动构建项目, 一个服务部署一个容器, docker-compose编排多个服务
为了减小django项目镜像体积,使用多阶段构建方案
.. literalinclude:: /../../Dockerfile
:language: docker
:linenos:
bullseye是大而全的环境, 不适合发布到生产环境(1G+的体积), 主要是为了成功安装uwsgi。
alpine是最小的环境, 而uwsgi在运行时仍然需要调用一些动态链接文件, alpine是缺失很多这种文件的, 所以最终选定在体积在中间位置的slim-bullseye作为发布到生产环境的基础镜像。
多阶段构建镜像的瘦身效果是从1G+的体积大小减少至500多M。
两个容器用的同一份项目代码,因此使用同一个镜像(pyblog)。
docker + supervisor + fabric + gunicorn
=========================================
https://docs.docker.com/config/containers/multi-service_container/
只需要写一个Dockerfile, git下载代码和supervisor启动都在容器中完成。使用fabric将Dockerfile上传至服务器和自动构建。
在docker容器使用supervisor管理多个服务进程。
一个容器部署一个服务利于项目维护和功能拓展, 但提高部署复杂度。而使用supervisor将所有服务放在一个容器的好处是简单便捷和工作量更少, 如果项目不大或者想省时省力,可以采用这个方案。
.. seealso::
* 我的私人项目myproject
* `core `_ (在容器中使用git下载项目代码)
* Docker实践(第2版) 734页
**Example**
Dockerfile
.. literalinclude:: /_static/deployment/Dockerfile
:language: docker
:linenos:
supervisor
.. literalinclude:: /_static/deployment/Supervisor/supervisord.d/app.ini
:language: guess
:linenos:
:emphasize-lines: 56
托管Redis时需要注意一点: Redis自带daemon功能,跟supervisor产生冲突,因此command命令增加参数 ``--daemonize no`` 。托管Nginx同理。
部署python程序到离线环境下
===================================
比如想在离线环境安装requests库
在线环境执行:
.. code-block:: text
pip download requests
生成出3个whl文件
* requests-2.28.1-py3-none-any.whl
* urllib3-1.26.12-py2.py3-none-any.whl
* certifi-2022.9.24-py3-none-any.whl
* idna-3.4-py3-none-any.whl
* charset_normalizer-2.1.1-py3-none-any.whl
拷贝到离线环境, 执行
.. code-block:: text
pip install requests-2.28.1-py3-none-any.whl urllib3-1.26.12-py2.py3-none-any.whl certifi-2022.9.24-py3-none-any.whl certifi-2022.9.24-py3-none-any.whl idna-3.4-py3-none-any.whl charset_normalizer-2.1.1-py3-none-any.whl
部署docker应用到离线环境下
===================================
在线linux环境制作好镜像, 执行
.. code-block:: text
docker save {image-id} > image.tar
.. warning::
不推荐在win环境导出镜像, 非常慢
拷贝到装有docker的离线环境机器
.. code-block:: text
docker load -i image.tar