你好,我是小焦。好久没发布文章了,最近也是一直搞小程序。昨天刚尝试用docker部署了小程序的后台。今天也是把部署的过程分享一下吧,当然这里是我测试环境下的教程,方法还是一模一样的。因环境不同修改一下就行了。废话不说,上教程。
1.提前下载好自己需要的python版本镜像,这是我写代码时用的python版本,大家更具自己的决定哦
docker pull python:3.8.10
2.提前导出自己的python所需安装包,自己在开发机器上导出txt文件。
pip freeze > requirements.txt
3.在服务器端创建自己的项目目录结构,这里以小焦本次部署为例。在服务器下面创建weitao目录,然后将开发机器上面的requirements.txt文件传到该目录下面.
项目文件目录如下结构
/weitao # 服务器下面主目录,下面皆是其子文件
- /weitao # django所在目录文件夹
- uwsgi.ini # 该文件我们放到weitao目录下,
- docker-compose.yml # 容器编排文件
- Dockerfile # django镜像制作文件
- nginx.conf # nginx配置文件
- requirements.txt # python依赖包文件
- uwsgi.ini # 该文件我们放到weitao目录下,这里只是列举
4.编写Dockerfile文件,制作django容器镜像,在文件中写入如下配置,配置根据个人情况,这里以我本人为例。最后那个安装依赖包我们使用清华源,之前使用阿里源个别包安装不上报错哦。
# 建立python3.8环境
FROM python:3.8.10
# 作者
MAINTAINER JIAOKANGYANG
# 在容器内创建weitao文件夹
RUN mkdir -p /var/www/html/weitao
# 复制当前目录python包文件到容器中
COPY ./requirements.txt /var/www/html/weitao
# 设置容器内工作目录
WORKDIR /var/www/html/weitao
# 安装依赖包
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/
5.制作docker镜像,名字根据自己情况写,这里我以weitao_django为名,标签为v3,由于我们dockerfile文件里面有复制操作,所以后面要加上”.” 表示当前目录,该命令要在dockerfile所在目录执行哦。
docker build -t weitao_django:v3 .
6.docker镜像制作已经完成了,这里我们进行docker-compose.yml编排文件以及nginx的配置文件,nginx镜像自己下载.在项目目录下创建docker-compose.yml名字的文件,加入下面内容。由于nginx要做静态文件的代理,所以要和django镜像有公用的文件,来获取项目下的静态文件。配置如下
version: '3'
services:
weitao:
image: weitao_django:v3
volumes:
- /weitao/weitao:/var/www/html/weitao
ports:
- 8080:8080
command: /bin/bash -c "uwsgi --ini uwsgi.ini"
nginx:
image: nginx:latest
ports:
- 80:80
volumes:
- /weitao/nginx.conf:/etc/nginx/nginx.conf
- /weitao/weitao:/urs/share/nginx/html/weitao
7.由于容器中连vi命令都没,所以我们nginx.conf配置在外面编写,挂载到容器中就行。由于我们还没进行https,暂时以下面配置为例,主要部分是添加upstream和server部分。配置如下。
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
# include /etc/nginx/conf.d/*.conf;
# ip写自己服务器上面的,端口是django中uwsgi中相同,根据自己情况
upstream django {
server 192.168.31.110:8080;
}
server {
listen 80;
server_name localhost;
location / {
uwsgi_pass django;
include uwsgi_params;
}
# 静态文件反向代理,路径以上面编排文件中nginx挂载的相同,后面多加了静态文件的收集路径
location /static {
alias /urs/share/nginx/html/weitao/weitao_static;
}
}
}
8.uwsgi.ini文件配置如下,该文件是放到django项目文件中的。容器启动后执行uwsgi命令所需要的。记住这里socket后面ip千万不要写127.0.0.1,不然nginx访问不到。主要是容器的原因,如果正常服务器写127没问题。
[uwsgi]
socket = 0.0.0.0:8080
chdir = /var/www/html/weitao/
wsgi-file = weitaoapp/wsgi.py
processes = 1
threads = 4
master = true
9.经过上面我们需要的东西以及全部搞完,现在只需将我们的项目文件上传到weitao下面的子文件夹weitao中,名字由自己定,到时记得改相应的配置文件就行。所有东西准备完毕,就可以启动编排程序了.用第一个启动命令就行了
# 进入到服务器weitao目录下执行,则会创建容器并启动
docker-compose up
# 停止项目容器
docker-compose stop
# 启动项目容器
docker-compose start
# 停止并删除项目所有容器,一般除非不要该项目才执行此操作
docker-compose down
10.经过上面的部署没有意外的话,已经可以完全正常运行项目了,但是还有几个小细节。静态文件代理,如果我们上传项目文件前没有进行static文件收集,则会导致nginx找不到文件。
提前要在项目下setting文件中设置好STATIC_ROOT的路径,而且该路径必须和django容器中的路径一致,实际真实路径就是weitao项目下的weitao_static文件夹而已。自己根据自己情况命名即可。
STATIC_ROOT = "/var/www/html/weitao/weitao_static"
两种处理方法:
方法一:
上传项目文件到服务器前进行静态文件收集,提前要在setting文件中设置好STATIC_ROOT的路径
python manage.py collectstatic
方法二:
如果项目上传前没有收集,那就进入到容器中进行收集了,命令一样
通过上面的步骤,如果没有出现任何意外的话,我们在80端口就可以正常访问django项目了。
当然实际情况要根据自身项目部署,不要照抄教程中的配置。就拿uwsgi的配置文件上面的socket的端口,网上的教程全是127开头的IP,结果全部502报错,最后小焦查看了nginx的日志才发现它不会自动转换IP,所以要自己调整哦,有啥不懂问题及时私信我哦。
评论2