从0开始梳理django项目_3.打回原形,构建docker基础环境(day3)

基础包

构建基础包

构建过程下载python模块比较费劲,先构建出来基础镜像,上传到docker仓库!

[root@ansible django_uwsgi]# docker login -u xiaorenwudashuju
[root@ansible django_uwsgi]# docker build -t django_uwsgi:v1 .
[root@ansible django_uwsgi]# docker images
[root@ansible django_uwsgi]# docker tag 9a185c352ef8 xiaorenwudashuju/django_uwsgi:v1
[root@ansible django_uwsgi]# docker images
[root@ansible django_uwsgi]# docker push xiaorenwudashuju/django_uwsgi:v1

[root@ansible django_uwsgi]# docker pull xiaorenwudashuju/django_uwsgi:v1
[root@ansible DYTMS_1]# docker run -it -d --name test01 9a185c352ef8
[root@ansible DYTMS_1]# docker exec -it test01 /bin/bash

 

基础包文件

4个文件一并拷入到了基础包中

 
[root@ansible ~]# cat Dockerfile

FROM ubuntu:20.04
MAINTAINER WG

ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

RUN apt-get update -y && \
apt-get install -y inetutils-ping netcat vim language-pack-zh-hans \
python3.8 python3-pip python3.8-dev

RUN pip3 install --upgrade pip

ENV PYTHONUNBUFFERED 1
# 相当于设置 python 命令行的 -u 选项;不缓冲stdin、stdout和stderr,默认是缓冲的
# 示例: python -u stderr_stdout.py 等同于PYTHONUNBUFFERED=1 python stderr_stdout.py

ENV PYTHONDONTWRITEBYTECODE 1
# 禁用字节码文件 .pyc

# 设置工作目录;不熟悉乌班图,centos是{logs,tmp},乌班图应该是\{logs,tmp\},不想试了
RUN mkdir -p /data/django /data/logs /data/tmp /data/buildfile
WORKDIR /data/buildfile
ADD . /data/buildfile

# 安装依赖
RUN pip3 install -r requirements.txt

# 设置start.sh文件可执行
RUN chmod +x ./start.sh
# ENTRYPOINT /bin/bash ./start.sh

 
[root@ansible ~]# cat uwsgi.ini

[uwsgi]

# 项目名称
project=DYTMS_1

# ubuntu中默认用户名和组
uid=www-data
gid=www-data

# 项目根目录
base=/data/django

# 项目工作目录
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=:8000
# socket=0.0.0.0:8000
# chown-socket=%(uid):www-data
# chmod-socket=664

# 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

#开启内存使用情况报告
memory-report = true

#设置平滑的重启(直到处理完接收到的请求)的长等待时间(秒)
reload-mercy = 10

#设置工作进程使用虚拟内存超过N MB就回收重启
reload-on-as= 1024

 
[root@ansible ~]# cat requirements.txt

Django==3.2.10
uwsgi==2.0.21
PyMySQL==1.0.2
PyYAML==6.0
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

 
[root@ansible ~]# cat start.sh

#!/bin/bash
# 用 uwsgi启动 django 服务, 不再使用python manage.py runserver
# 同步数据库这个事,放后边再说

# python manage.py makemigrations &&
# python manage.py migrate &&

python3 manage.py collectstatic --noinput &&
uwsgi --ini /data/django/test01/uwsgi.ini &&
tail -f /dev/null

 

Nginx

构建过程不写了,大同小异,主要是把几个文件都做出来。

 

Dockerfile

# 习惯这个版本了,平滑升级啥的回头再说吧。
FROM nginx:1.20.2

MAINTAINER WG

ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 删除原有配置文件,创建静态资源文件夹
RUN rm /etc/nginx/conf.d/default.conf \
&& mkdir -p /usr/share/nginx/html/static \
&& mkdir -p /usr/share/nginx/html/media \
&& mkdir -p /data/nginx/buildfile

# 构建文件一并放进来,以后也好找
ADD . /data/nginx/buildfile/

# 添加配置文件?用添加么?直接挂载?
ADD ./nginx.conf /etc/nginx/conf.d/

# 关闭守护模式
CMD ["nginx", "-g", "daemon off;"]

 

nginx.conf

这个nginx配置抄别人的,跟我以前配置的好像不太像...先这么着...

upstream dytms {
    ip_hash;

    # Django+uwsgi容器所在IP地址及开放端口,没指定的话需要自己查一下
    server 172.168.3.140:8000;
}

server {
    # 监听80端口;
    listen 80;

    # 可以是nginx容器ip,或者127.0.0.1,不能写宿主机ip
    server_name localhost;

    charset utf-8;

    # 限制用户上传文件大小
    client_max_body_size 50M;

    access_log /var/log/nginx/access.log main;
    error_log /var/log/nginx/error.log warn;

    # 静态资源路径
    location /static {
        alias /usr/share/nginx/html/static;
    }

    # 媒体资源,用户上传文件路径
    location /media {
        alias /usr/share/nginx/html/media;
    }

    location / {
        include /etc/nginx/uwsgi_params;
        uwsgi_pass dytms;
        uwsgi_read_timeout 600;
        uwsgi_connect_timeout 600;
        uwsgi_send_timeout 600;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;

        # 使用uwsgi通信,而不是http,所以不使用proxy_pass。
        # proxy_pass http://django;
    }
}

 

基础包升级

基础包升级就是该把django项目打包进来了

 

执行步骤

[root@ansible DYTMS_1]# ls
Dockerfile  DYTMS_1  manage.py  requirements.txt  start.sh  test01  uwsgi.ini

[root@ansible DYTMS_1]# cat Dockerfile
==============================================
FROM xiaorenwudashuju/django_uwsgi:v1

MAINTAINER WG

# 我寻思着,这里不用再做一遍了吧?做出来看看
# ENV TZ=Asia/Shanghai
# RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

RUN echo 'export LANG="zh_CN.UTF-8"' >> /etc/profile

# 设置工作目录
RUN mkdir -p /data/django/DYTMS_1
WORKDIR /data/django/DYTMS_1
ADD . /data/django/DYTMS_1

# 设置start.sh文件可执行
# 做着做着就晕了,基础包之前不用打包start和ini,这又重来一次
# 执行文件先不执行,进去再说。感觉问题多多,还没做网络
RUN chmod +x ./start.sh
# ENTRYPOINT /bin/bash ./start.sh
==============================================

[root@ansible DYTMS_1]# docker build -t dytms1:v1 .
[root@ansible DYTMS_1]# docker network create --driver bridge --subnet 172.168.3.0/24 --gateway 172.168.3.1 DYTMS_net
[root@ansible DYTMS_1]# docker run -it -d --name test01 -p 8080:8080 --net DYTMS_net --ip 172.168.3.140 dytms:v1
[root@ansible DYTMS_1]# docker exec -it test01 /bin/bash

root@92d6a96f2326:/data/django/DYTMS_1# source /etc/profile

# 顺序错了,nginx里设置了这个ip,那就只能用这个了

------------------------------------------------------------------------------------------------------------

# 临时的,我在思考一个问题,看别人写的挂载静态文件和动态文件路径,难道他们不知道,挂载是要覆盖掉容器内内容的吗?
docker run -it -d --name dytms -p 8080:8080 \
-v /data/logs/uwsgi/DYTMS_1:/data/logs \
-v /data/django/DYTMS_1/static:/data/django/DYTMS_1/static \
-v /data/django/DYTMS_1/media:/data/django/DYTMS_1/media \
-v /data/scanning:/data/scanning \
dytms:v1

docker exec -it dytms1_v1 /bin/bash

# 进入容器后,执行 source /etc/profile   
# 执行 start.sh 生成static;启动nginx是在django后,可以这样,nginx启动后,在宿主机执行 python3 manage.py collectstatic --noinput

docker build -t dytms1_nginx .

docker run -it -p 80:80 --name nginx1 \
-v /data/django/DYTMS_1/static:/usr/share/nginx/html/static \
-v /data/django/DYTMS_1/media:/usr/share/nginx/html/media \
-v /data/logs/nginx/DYTMS_1:/var/log/nginx \
-d dytms1_nginx:latest

docker exec -it nginx1 /bin/bash
------------------------------------------------------------------------------------------------------------------
posted @   梵高de画笔  阅读(52)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示