6.零基础快速入门Python Web开发——docker+uwsgi部署

单容器部署+uwsgi

2.1 案例

1)把UWSGI加入Django容器中的准备工作

在前面例子中我们使用了Django了自带的runserver命令启动了测试服务器,但实际生成环境中你应该需要使用支持高并发的uwsgi服务器来启动Django服务。尽管本节标题是把uwsgi加入到Django容器中,但本身这句话就是错的,因为我们Django的容器是根据django_docker_img:v1这个镜像生成的,我们的镜像里并没有包含uwsgi相关内容,只是把uwsgi.ini配置文件拷入到Django容器是不会工作的。

所以这里我们需要构建新的Dockerfile并构建新的镜像和容器。为了方便演示,我们创建了一个名为mysite2的项目,项目结构如下所示:

 firstweb
 ├── db.sqlite3
 ├── Dockerfile # 构建docker镜像所用到的文件
 ├── manage.py
 ├── mysite2
 │   ├── asgi.py
 │   ├── __init__.py
 │   ├── settings.py
 │   ├── urls.py
 │   └── wsgi.py
 ├── pip.conf
 ├── requirements.txt # 两个依赖:django==3.0.5 uwsgi==2.0.18
 ├── start.sh # 进入容器后需要执行的命令,后面会用到
 └── uwsgi.ini # uwsgi配置文件

2f9d44155cb64af7be1cf291160049e8.png

编写dockerfile

FROM python:3.7

MAINTAINER bnq

ENV PYTHONUNBUFFERED 1

COPY pip.conf /root/.pip/pip.conf

RUN mkdir -p /var/www/html/firstweb

RUN apt-get update && apt-get install net-tools
RUN apt-get update && apt-get install vim -y

WORKDIR /var/www/html/firstweb

ADD . /var/www/html/firstweb

RUN pip3 install -r requirements.txt

RUN chmod +x ./start.sh

编写pip.conf

[global]
 index-url = https://mirrors.aliyun.com/pypi/simple/
[install]
 trusted-host=mirrors.aliyun.com

编写uwsgi.ini

[uwsgi]
http=0.0.0.0:8000     #端口号
chdir=/var/www/html/firstweb/     #uwsgi.ini所在位置
wsgi-file=/var/www/html/firstweb/firstweb/wsgi.py        #uwsgi.py文件所在位置
master=true
processes=1
#static-map=/static=/home/bu/market/static            #项目静态文件所在位置
vacuum=true
buffer-size=65535

 #设置一个请求的超时时间(秒),如果一个请求超过了这个时间,则请求被丢弃
harakiri=60
 #当一个请求被harakiri杀掉会,会输出一条日志
harakiri-verbose=true

编写start.sh

#!/bin/bash
#1.生成数据库迁移文件
python3 manage.py makemigrations&& \r
#2.根据数据库迁移文件来修改数据库
python3 manage.py migrate&&  \r
#3.用uwsgi启动django服务,不再使用python3 manage.py runserver  \r
uwsgi --ini /var/www/html/firstweb/uwsgi.ini

这边需要注意(出现inux下执行Shell脚本出现$‘\r‘: command not found解决方法)

vim start.sh
:set ff=unix
:wq

2)单容器部署 Django + UWSGI

第一步:生成名为django_uwsgi_img:v1的镜像

sudo docker build -t django_uwsgi_img:v1 .

第二步:启动并运行mysite2的容器

# 启动并运行mysite2的容器 
sudo docker run -it -d --name mysite2 -p 84:8000 django_uwsgi_img:v1

第三步:进入mysite2的容器内部,并运行脚本命令start.sh

# 进入容器,如果复制命令的话,结尾千万不能有空格。 
sudo docker exec -it mysite2 /bin/bash
# 执行脚本命令 
sh start.sh

以上两句命令也可以合并成一条命令

sudo docker exec -it mysite2 /bin/bash start.sh

执行后效果如下所示。当你看到最后一句[uWSGI]时,说明uwsgi配置并启动完成。

测试:虚拟机登陆网站查看 0.0.0.0:84

主机登录虚拟机ip:80查看(192.168.33.136:84)

b51492ce497b493f85b10043d7c07778.png

2.2 练习

1.将market项目放到/home/zhu文件夹下

8a0d817d918d477db51b2a6dec247450.png

将requirements.txt文件夹内所有组件的版本号全部删除,修改如下

asgiref
click
colorama
cycler
Django
django-simpleui
django-tinymce
django-utils-six
et-xmlfile
Flask
fonttools
itsdangerous
Jinja2
kiwisolver
MarkupSafe
matplotlib
numpy
openpyxl
packaging
pandas
Pillow
pyparsing
python-dateutil
pytz
six
sqlparse
terminaltables
tzdata
Werkzeug

添加如下文件:

pip.conf

[global]
 index-url = https://mirrors.aliyun.com/pypi/simple/
[install]
 trusted-host=mirrors.aliyun.com
  1. 编写Dockerfile
    FROM python:3.7
    
    MAINTAINER bnq
    
    ENV PYTHONUNBUFFERED 1
    
    COPY pip.conf /root/.pip/pip.conf
    
    RUN mkdir -p /var/www/html/market
    
    RUN apt-get update && apt-get install net-tools
    RUN apt-get update && apt-get install vim -y
    
    WORKDIR /var/www/html/market
    
    ADD . /var/www/html/market
    
    RUN pip3 install -r requirements.txt
    
    RUN chmod +x ./start.sh

     

  2. 编写uwsgi.ini.文件

    [uwsgi]
    #端口号
    http=0.0.0.0:8001    
    #uwsgi.ini所在位置
    chdir=/var/www/html/market/  
    #uwsgi.py文件所在位置  
    wsgi-file=/var/www/html/market/market/wsgi.py        
    master=true
    processes=1
    #项目静态文件所在位置
    static-map=/static=/var/www/html/market/static            
    vacuum=true
    buffer-size=65535
    
    #设置一个请求的超时时间(秒),如果一个请求超过了这个时间,则请求被丢弃
    harakiri=60
    #当一个请求被harakiri杀掉会,会输出一条日志
    harakiri-verbose=true
    

     

  3. 编写start.sh

    #!/bin/bash
    #1.生成数据库迁移文件
    python3 manage.py makemigrations&& 
    #2.根据数据库迁移文件来修改数据库
    python3 manage.py migrate&&  
    #3.用uwsgi启动django服务,不再使用python3 manage.py runserver  
    uwsgi --ini /var/www/html/market/uwsgi.ini
    

     

  4. 利用Dockerfile创建镜像

    # 创建名为django_docker_img的镜像,版本为v1
    sudo docker build -t market_docker_img:v1 .
    
    # 查看创建的镜像
    [root@192 market]# docker ps
    CONTAINER ID   IMAGE                 COMMAND     CREATED          STATUS             PORTS                                                                                   NAMES
    62b496670228   market_uwsgi_img:v1   "python3"   29 minutes ago   Up 29 minutes      0.0.0.0  :85->8001/tcp, :::85->8001/tcp   mysite4
    
    
    [root@192 market]# docker images
    REPOSITORY          TAG       IMAGE ID       CREATED          SIZE
    market_uwsgi_img    v1        340c3575df4d   32 minutes ago   1.43GB
    

     

  5. 利用镜像生成容器并后台运行,容器名为mysite4

    
     docker run -it -d --name mysite4 -p 85:8001 market_uwsgi_img:v1
    
    # 查看所有容器状态
    [root@hdp01 firstweb]# docker ps
    [root@192 market]# docker ps
    CONTAINER ID   IMAGE                 COMMAND     CREATED          STATUS             PORTS                                                                                   NAMES
    62b496670228   market_uwsgi_img:v1   "python3"   29 minutes ago   Up 29 minutes      0.0.0.0  :85->8001/tcp, :::85->8001/tcp   mysite4                                                                      Up About an hour   0.0.0.0:8080->8000/tcp, :::8080->8000/tcp   firstweb
    

     

  6. 进入容器

    sudo docker exec -it mysite4 /bin/bash
    
    root@62b496670228:/var/www/html/market# sh start.sh
    No changes detected
    Operations to perform:
      Apply all migrations: admin, auth, contenttypes, df_cart, df_goods, df_order, df_user, sessions
    Running migrations:
      No migrations to apply.
    [uWSGI] getting INI configuration from /var/www/html/market/uwsgi.ini
    [uwsgi-static] added mapping for /static => /var/www/html/market/static
    *** Starting uWSGI 2.0.23 (64bit) on [Thu Jan 11 06:20:19 2024] ***
    .....

    测试:虚拟机登陆网站查看 0.0.0.0:85

    主机登录虚拟机ip:80查看(192.168.33.136:85)

    c54933c7942e48a0adb7a142f59f42ce.png

 

  • 16
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值