从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
------------------------------------------------------------------------------------------------------------------
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步