单容器部署+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配置文件
编写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)
2.2 练习
1.将market项目放到/home/zhu文件夹下
将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
- 编写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
-
编写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
-
编写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
-
利用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
-
利用镜像生成容器并后台运行,容器名为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
-
进入容器
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)