从0开始梳理django项目_1.始于docker(day1)
基础准备
我的django项目在裸奔,本来就准备弄环境了。看了篇文章,对比了一些构建django项目的docker环境,发觉自己以前了解的不够全面。尝试4个基础镜像,全方面了解,全方位解决问题!
不太记得构建dockerfile文件的书写了,后边还要升级到compose,这里先从手动构建容器开始,进入容器内部安装Python。
[root@ansible ~]# docker run -it -d --name utest1 680e5dfb52c7 /bin/bash
# 怕什么来什么,很多东西都忘了。
* 不加 -d 的话,容器退出后无法保存。
* 单词类的参数前是两个 --
[root@ansible ~]# docker exec -it utest1 /bin/bash # 用/bin/sh也行
root@b631c39330d2:/# apt-get update -y
root@b631c39330d2:/# apt-get install -y python3.9 python3-pip python3.9-dev
# 还需要手动输入时区地址...这个我没想到,得了,下次构建的时候把时区命令加进去。
root@b631c39330d2:/# pip3 install --upgrade pip
# Python3-pip出来就是pip3了?这之前还真不知道...
root@b631c39330d2:/# pip3 install --no-cache-dir numpy matplotlib pandas django
# --no-cache-dir进行无缓存安装
root@b631c39330d2:/# pip3 install --no-cache-dir django==3.2.10
# 慢,直接指定版本安装;其他的也不测试了。
dockerfile
前边基础准备热热身,没有部署django项目的必要。从dockerfile这里开始才是真正开始。忘了dockerfile咋写了....
前戏
centos没安装uwsgi,编译安装没做好的问题;用yum安装又折腾一番,注意和ubuntu里安装的差异
[root@ansible ~]# yum -y install python3-devel
[root@ansible ~]# pip3 install uwsgi
初始版本dockerfile
单独起一个目录放所有文件。创建个Dockerfile文件,这个名字是默认的;起别的名字,在执行的时候需要在命令中写入。
另外创建pip.conf或者pip3.conf文件,我这里有问题,没用;再生成个requirements.txt,要安装的python模块都放进去。
[root@ansible test1]# vi Dockerfile
FROM ubuntu:20.04
MAINTAINER WG
# 写得有点复杂了,python无法下载,老实用简单点的方式吧。
# RUN sed -i s#http://archive.ubuntu.com/#http://mirrors.tuna.tsinghua.edu.cn/# /etc/apt/sources.list \
# RUN apt-get -y update --fix-missing \
# && apt-get install -y tzdata --fix-missing \
# && ln -snf /usr/share/zoneinfo/$TIME_ZONE /etc/localtime && echo $TIME_ZONE > /etc/timezone \
# && dpkg-reconfigure -f noninteractive tzdata \
# && apt-get clean \
# && rm -rf /tmp/* /var/cache/* /usr/share/doc/* /usr/share/man/* /var/lib/apt/lists/*
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# 下载python39,实际下载下来的是python38,改过来吧。不过这种方式下载有点逆天。
RUN apt-get update -y \
&& apt-get install -y python3.8 python3-pip python3.8-dev
# 安装完python,可以设置pip的源,我的方式找不到pip.conf文件,省略掉,注释掉
# COPY pip.conf /root/.pip/pip.conf
############### 自己写得pip.conf文件 ##########################
# [global]
# index-url = https://mirrors.aliyun.com/pypi/simple/
# [install]
# trusted-host=mirrors.aliyun.com
###############################################################
RUN pip3 install --upgrade pip
ENV PYTHONUNBUFFERED 1
# 相当于设置 python 命令行的 -u 选项;不缓冲stdin、stdout和stderr,默认是缓冲的
# 示例: python -u stderr_stdout.py 等同于PYTHONUNBUFFERED=1 python stderr_stdout.py
# 设置工作目录
RUN mkdir -p /data/django/test01
WORKDIR /data/django/test01
ADD . /data/django/test01
# 安装依赖
RUN pip3 install -r requirements.txt
[root@ansible test1]# cat requirements.txt
Django==3.2.10
Automat==22.10.0
PyMySQL==1.0.2
Scrapy==2.7.0
PyYAML==6.0
SQLAlchemy==1.3.24
aiohttp==3.8.1
ansible-run==3.6
ansible-runner==2.2.1
openssl-python==0.1.1
paramiko==2.10.3
pyOpenSSL==22.1.0
requests==2.26.0
xlrd==2.0.1
xlwt==1.3.0
numpy==1.23.4
# 需要的包差很多,回头慢慢补充
挺慢的,主要是下载速度影响;失败了就重来,十几次吧,8个小时。目前还没好,但是我感觉应该好了。
每次都是在上次基础上继续构造,但是我选择每次都删了重做,便于看到更多问题。
开始构建
[root@ansible test1]# docker build -t django_img:v1 .
[root@ansible test1]# docker run -it -d --name test01 -p 8000:8000 django_img:v1
[root@ansible test1]# docker exec -it test01 /bin/bash
root@c78bc8e86fcf:/data/django# django-admin startproject test01
# 这一步干的有点扯,正常是应该在物理机构建django,把Dockerfile和requirements.txt这些放进去。
# django目录作为dockerfile创建容器的目录。我没创建,所以跑进来重新创建。或者应该在window创建好,同步到linux,再..
# 啥都没配置,报错了,见下图,说明项目基本搞定了。项目配置,还有初始化数据库都是后边的事,先不弄了
最终版
加入uwsgi
需要新增两个文件,一个是uwsgi.ini配置文件;另外一个是启动脚本,启动脚本代替manage.py启动
[root@ansible test01]# cat start.sh
#!/bin/bash
# 用 uwsgi启动 django 服务, 不再使用python manage.py runserver
# 同步数据库这个事,放后边再说
# python manage.py makemigrations &&
# python manage.py migrate &&
uwsgi --ini /data/django/test01/uwsgi.ini
[root@ansible test01]# cat uwsgi.ini
[uwsgi]
# 项目名称
project=test01
# ubuntu中默认用户名和组
uid=www-data
gid=www-data
# 项目根目录
base=/data/djano
# 项目工作目录
chdir=%(base)/%(project)
# wsgi文件位置
module=%(project).wsgi:application
# 主进程
master=True
# 同时进行的进程数,默认是2
processes=4
########## uwsgi与nginx通信有三种手段 ###############
# 1.使用unix socket与nginx通信,仅限于uwsgi和nginx在同主机;Nginx配置中uwsgi_pass应指向同一socket文件
# socket=/run/uwsgi/%(project).sock
# 2.使用TCP socket与nginx通信;Nginx配置中uwsgi_pass应指向uWSGI服务器IP和端口
# socket=0.0.0.0:8000 或 socket=:8000
# 3.使用http协议与nginx通信;Nginx配置中proxy_pass应指向uWSGI服务器一IP和端口
# http=0.0.0.0:8000
#####################################################
# 这里直接使用uwsgi做web服务器,使用http。如果使用nginx,需要使用socket
http=0.0.0.0:8000
# uwsgi默认的fuffersize为4096,超过会报错,这里设置64k
buffer-size=65536
# 进程文件
pidfile=/data/tmp/%(project)-master.pid
# 服务停止时,自动移除Unix socket和pid文件
vacuum=True
# 为每个工作进程设置请求数上限;当处理请求超过,进程回收重启
max-requests=5000
# 日志文件;以后台守护进程运行,并将log日志存于logs文件夹
daemonize=/data/logs/%(project)-uwsgi.log
#设置一个请求的超时时间(秒),如果一个请求超过了这个时间,则请求被丢弃
harakiri=60
#当一个请求被harakiri杀掉,会输出一条日志
harakiri-verbose=true
执行步骤
[root@ansible docker_django_test]# django-admin startproject test01
[root@ansible test01]# touch Dockerfile requirements.txt start.sh uwsgi.ini pip.conf
# 意思是把5个文件放进去
[root@ansible test01]# python39 manage.py startapp app01
# 创建app失败,sqlite的问题。先去设置改成mysql
[root@ansible test01]# cat init.py
import pymysql
pymysql.install_as_MySQLdb()
[root@ansible test01]# cat settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test01',
'USER': 'root',
'PASSWORD': '556775#@wg',
'HOST': '172.16.4.40',
'POST': 3330,
'CHARSET': 'utf8mb4'
},
}
[root@ansible test01]# python39 manage.py startapp app01
[root@ansible test01]# docker build -t django_uwsgi_img:v1 .
[root@ansible test01]# docker run -it -d --name test01 -p 8000:8000 --restart=always django_uwsgi_img:v1
[root@ansible test01]# docker exec -it test01 /bin/bash start.sh
查看信息
[root@ansible test1]# docker inspect mytest01 | grep "IPAddress"
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.3",
"IPAddress": "172.17.0.3",
root@c78bc8e86fcf:/data/django# tree -L 3
`-- mytest01
|-- Dockerfile
|-- db.sqlite3
|-- manage.py
|-- mytest01
| |-- __init__.py
| |-- __pycache__
| |-- asgi.py
| |-- settings.py
| |-- urls.py
| `-- wsgi.py
`-- requirements.txt