从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
posted @ 2022-11-03 13:53  梵高de画笔  阅读(77)  评论(0编辑  收藏  举报