前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >从零开始 - Docker部署前后端分离项目(三)

从零开始 - Docker部署前后端分离项目(三)

作者头像
梦无矶小仔
发布于 2022-08-22 07:01:03
发布于 2022-08-22 07:01:03
2K00
代码可运行
举报
运行总次数:0
代码可运行

本期专为饭佬四期平台部署,其他vue+django前后端分离项目均可通用。

一、 项目框架图

django项目部署采用的方案nginx+gunicorn

容器环境及需要启动的服务:

  1. python3.8的 (使用的是小型的3.8-alpine)
  2. celery worker (无定时任务可不用)
  3. celery beate server (无定时任务可不用)
  4. gunicorn (用于后端通信)

二、文件最终目录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
AndroidPlatform
  |- nginx_docker
    |-- dist
    |-- static
    |-- default.conf
    |-- Dockerfile
    
  |- XZAndroidPlatform
    |-- logs
    |-- scripts
    |-- xiaozai_app
    |-- XZAndroidPlatform
    |-- Dockerfile
    |-- entrypoint.sh
    |-- gunicorn.conf.py
    |-- manage.py
    |-- requirements.txt
    |-- supervisord.conf
    
  |- docker-compose.yml
  |- start.sh

三、项目文件介绍

1.AndroidPlatform

整个项目文件,里面有两个文件夹,nginx_docker用于存放前后端静态文件,XZAndroidPlatform是整个django项目文件。

包含两个文件,docker-compose.yml、start.sh(可有可无)

2.XZAndroidPlatform后端文件

整个django项目拿过来即可。

需生成的文件为:requirements.txt

需编写的文件为:Dockerfile、entrypoint.sh、gunicorn.conf.py、supervisord.conf

3.nginx_docker静态文件

需生成的文件为:包含前端vue打包的dist文件,django后端的static静态资源文件。

需编写的文件为:default.conf、Dockerfile

四、django后端环境准备

1、django后端项目依赖导出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip freeze > requirements.txt

在requirements文件中增加相关部署依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysqlclient==2.1.0
gunicorn==20.1.0
supervisor==4.2.4

完整requirements.txt文件如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
BeautifulReport==0.1.3
certifi==2021.10.8
charset-normalizer==2.0.12
Django==2.2
django-cors-headers==3.11.0
idna==3.3
lxml==4.8.0
python-docx==0.8.11
pytz==2021.3
requests==2.27.1
sqlparse==0.4.2
urllib3==1.26.9
mysqlclient==2.1.0
gunicorn==20.1.0
supervisor==4.2.4

2、django后端项目配置修改

setting.py 文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DEBUG = False

ALLOWED_HOSTS = ['127.0.0.1', '填你所部署服务所在的IP']  # 运行主机,或域名,可以填['*']代表允许所有

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'corsheaders.middleware.CorsMiddleware', #第三方解决跨域头问题的中间件
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'xiaozai',
        'HOST': 'mariadb',  # 以mariadb的容器名为host
        'USER': 'root',
        'PASSWORD': 'xiaozai123'

    }
}

# 方案一:允许跨域的域名列表
CORS_ALLOWED_ORIGINS = [

    'http://198.162.111.111:8080'  # 修改为你的前端部署的项目地址
]

# 方案二:我采用的
CORS_ORIGIN_ALLOW_ALL = True #加上允许所有跨域

3、收集django项目中的静态文件

在配置文件中配置STATIC_ROOT

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
STATIC_ROOT = BASE_DIR / 'static' #如果运行报错,则用下面的
STATIC_ROOT = = os.path.join(BASE_DIR,'static')

然后运行命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python manage.py collectstatic

会将所有的静态收集到STATIC_ROOT目录中。

这个static文件夹后续需要复制到nginx_docker文件夹中。

4、配置文件

django项目目录下新建logs文件夹,存放后续配置运行的日志。

(1)gunicorn.conf.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bind = '0.0.0.0:8000'                 # 监听主机和端口
pidfile = 'logs/gunicorn.pid'         # pid文件
accesslog = 'logs/gunicorn_access.log'    # 通过的日志
errorlog = 'logs/gunicorn_error.log'      # 错误日志

(2)supervisord.conf

把XZAndroidPlatform.wsgi修改为你django的项目名.wsgi

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[unix_http_server]
file=/tmp/supervisor.sock   ; the path to the socket file

[supervisord]
logfile=logs/supervisord.log ; main log file; default $CWD/supervisord.log
logfile_maxbytes=50MB        ; max main logfile bytes b4 rotation; default 50MB
logfile_backups=10           ; # of main logfile backups; 0 means none, default 10
loglevel=info                ; log level; default info; others: debug,warn,trace
pidfile=logs/supervisord.pid ; supervisord pidfile; default supervisord.pid
nodaemon=true               ; start in foreground if true; default false
silent=false                 ; no logs to stdout if true; default false
minfds=1024                  ; min. avail startup file descriptors; default 1024
minprocs=200                 ; min. avail process descriptors;default 200

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket

[program:gunicorn]
command=gunicorn -c gunicorn.conf.py XZAndroidPlatform.wsgi

(3)entrypoint.sh

小知识

/dev/null 文件

如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ command > /dev/null

/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。

创建的超级用户账号密码,可以自己自行更改。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#! /bin/sh
# 1. 数据库迁移
python manage.py makemigrations
python manage.py migrate
# 因为后使用脚本部署时,可能数据库还没有准备好,这里连接会失败
if [ $? -ne 0 ];then
    echo '数据库连接失败重启'
    exit 1
fi
# 2.创建管理员用户
echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser('xiaozai', '13888888888', 'xiaozai123') " | python manage.py shell &> /dev/null
# 3. 启动supervisor

supervisord -c supervisord.conf

(4)Dockerfile

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FROM python:3.8-alpine
LABEL maintainer='xiaozai'
LABEL description='Django project'

# 创建/app目录并切换进目录下
# 第一个WORKDIR要用绝对路径
WORKDIR /app
# 把dockerfile当前目录下的所有文件拷贝进镜像的/app目录下
COPY . .

# 安装必要的库
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories && \
    apk update && \
    apk upgrade && \
    apk add --no-cache tzdata mariadb-dev gcc libc-dev && \
    cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo "Asia/Shanghai" > /etc/timezone && \
    python -m pip install -i https://pypi.douban.com/simple --upgrade pip && \
    pip install --no-cache-dir -i https://pypi.douban.com/simple -r requirements.txt && \
    chmod 777 ./entrypoint.sh

# 创建一个日志挂载点避免容器越来越大
VOLUME /app/logs/

# 挂载端口,它并不会做端口映射,只是告诉用户,该镜像的挂载端口
EXPOSE 8000

# 容器的默认执行命令
# CMD 'supervisord -c supervisord.conf'
ENTRYPOINT ["./entrypoint.sh"]

五、nginx_docker静态资源准备

讲上文中django打包好的static文件夹复制到nginx_docker文件夹中。

1、前端部署-前端vue项目

前端中所有用到后端的接口,都需要改成对应部署所在的服务器地址,如上文的192.168.111.111

打包前端项目打包的时候一定要修改host,打包完成之后,将dist文件夹拷贝到nginx_docker文件夹中。

打包命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm run build

2、部署静态文件default.conf

nginx_docker文件夹中创建default.conf文件,编写如下内容:

域名记得改成自己的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
upstream app_server {
	server XZAndroidPlatform:8000;    # 配置gunicorn服务器主机和端口
}


server {
   listen       8001;  # 配置后端服务的监听端口
   server_name  192.168.111.111;  # 配置域名
	# http://106.14.168.21:8000/static/rest_framework/css/bootstrap.min.css
	# /usr/share/nginx/html/static/rest_framework/css/bootstrap.min.css
   location /static/ {
      alias /usr/share/nginx/html/static/;  # 配置静态文件路径
   }
   
   location / {
      # 检查静态文件,如果不是代理到应用
      try_files $uri @proxy_to_app;
   }

   location @proxy_to_app {
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header Host $http_host;
      proxy_redirect off;
      proxy_pass http://app_server;
   } 

   
   #error_page  404              /404.html;

     # redirect server error pages to the static page /50x.html
     #
     error_page   500 502 503 504  /50x.html;
     location = /50x.html {
        root   /usr/share/nginx/html;
     }

  }

  server {
	listen 80;  # 配置前端项目服务的监听端口
	server_name   192.168.111.111;  # 配置域名主机
	root /usr/share/nginx/html/dist;       # 配置文件根路径

    location / {
       try_files $uri $uri/ @router; #需要指向下面的@router否则会出现vue的路由在nginx中刷新出现404
       index index.html;
    }

    #对应上面的@router,主要原因是路由的路径资源并不是一个真实的路径,所以无法找到具体的文件
    #因此需要rewrite到index.html中,然后交给路由在处理请求资源
    location @router {
             rewrite ^.*$ /index.html last;
    }

}

3、Dockerfile

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FROM nginx:alpine

COPY ./static/ /usr/share/nginx/html/static/
COPY ./dist/ /usr/share/nginx/html/dist/
COPY ./default.conf /etc/nginx/conf.d/

VOLUME /var/log/
EXPOSE 8001 80

六、docker-compose.yml

下载docker-compose

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install docker-compose

检测是否安装成功

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
docker-compoese --version

不论是`Dockerfile`还是`docker-compose.yml`脚本的编写都依赖上下文,所以需要明确部署文件夹的项目结构。

项目结构在本节开篇已经详细说明了,这里再写一个大致的目录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
AndroidPlatform
  |- nginx_docker
    |-- dist
    |-- static
    |-- default.conf
    |-- Dockerfile
    
  |- XZAndroidPlatform
    |-- 其他项目文件和文件夹
    |-- Dockerfile
    |-- entrypoint.sh
    
  |- docker-compose.yml

1、编写docker-compose.yml文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
version: "3"
services:  # 要启动的 容器服务
    redis:  # 容器名称
        image: redis:alpine   # 指定构建的镜像
        restart: always      # 重启策略
        volumes:             # 指定数据卷
            - redis_data:/data
    mariadb:
        image: mariadb
        restart: always 
        environment:        # 设置环境变量
            MARIADB_ROOT_PASSWORD: xiaozai123
            MARIADB_DATABASE: xiaozai
        volumes:
            - mariadb_data:/var/lib/mysql
    XZAndroidPlatform:
        depends_on:    # 指定依赖服务,等依赖的容器启动后再启动
            - redis
            - mariadb
        build: ./XZAndroidPlatform/   # 指定Dockerfile的路径
        image: mwj_XZAndroidPlatform  # 给镜像取个tag
        volumes:
            - app_logs:/app/logs/
        restart: always
    nginx:
        depends_on:
            - XZAndroidPlatform
        build: ./nginx_docker/
        image: mwj_nginx
        restart: always
        ports:
            - "80:80"
            - "8001:8001"
        volumes:
            - nginx_logs:/var/log/
volumes:  # 定义的数据卷
    redis_data:
    mariadb_data:
    app_logs:
    nginx_logs:

然后再XZAndroidPlatform目录下运行命令docker-compose -p mwj up -d --build,即可以部署项目。

2、部署完成

下篇内容:

1、start.sh一键自动化部署脚本的编写。

2、如何删除已构建的docker项目,再次快速部署。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-07-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 梦无矶的测试开发之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
从零开始 - Docker部署前后端分离项目(四)
一、start.sh的编写 #! /bin/bash project=mwj delete(){ # 删除操作 echo "开始删除项目" echo "删除项目只会删除容器,不会删除卷" echo "要删除数据卷请手动删除" docker-compose -p $project down } deploy(){ # 部署操作 echo "开始部署项目" echo "注意重新部署项目会重新构建镜像!" docker-compos
梦无矶小仔
2022/08/22
5780
从零开始 - Docker部署前后端分离项目(四)
精简Python项目的Dockerfile
之前生成的镜像很大,1个G。因为公司的需求是要将所有的代码,配置文件都放到Docker中,并且程序只保留编译过后的pyc文件。也就是说,给客户的是一个Docker镜像 而且Docker镜像是禁止客户访问的,数据库配置信息咋办?这些全部写在了.env的配置文件里,也方便客户去修改操作,然后用docker-compose中的env-file指定一下文件就ok了,但是就算这样,将项目一股脑的塞到一起,不大才怪咧。经过两天的研究,最终将项目精简到了380MB。应该是可以在减少 但是先这样。。记录一下吧 ---- 从
简单、
2018/07/17
1.4K0
Docker精简项目(Python3.6+Flask1.0+Pipenv)
项目采用最新版本的Flask和现在流行的Pipenv,virtualenv因为配置过程,使用过程都会遇到一些不小的麻烦,所以推荐使用pipenv来管理自己的项目环境。 引入的bigdata镜像里面,我已经封装好了supervisor、gunicorn、nginx,所以配置好nginx.conf和supervisor.conf即可 Dockerfile FROM registry.cn-hangzhou.aliyuncs.com/littleseven/bigdata # 根据我的基础镜像又封装的一个新的镜像
简单、
2018/07/18
1.6K6
supervisor管理进程
Supervisor (http://supervisord.org) 是一个用 Python 写的进程管理工具,可以很方便的用来启动、重启、关闭进程(不仅仅是 Python 进程),只需要简单的配置一下即可,且有web端,状态、日志查看清晰明了。。除了对单个进程的控制,还可以同时启动、关闭多个进程,比如很不幸的服务器出问题导致所有应用程序都被杀死,此时可以用 supervisor 同时启动所有应用程序而不是一个一个地敲命令启动。组成部分:supervisord[服务端,要通过这个来启动它]和supervisorctl[客户端,执行stop等命令]
菲宇
2019/06/13
7620
kvm虚拟化管理平台WebVirtMgr部署-完整记录(1)
公司机房有一台2U的服务器(64G内存,32核),由于近期新增业务比较多,测试机也要新增,服务器资源十分有限。所以打算在这台2U服务器上部署kvm虚拟化,虚出多台VM出来,以应对新的测试需求。 当KVM宿主机越来越多,需要对宿主机的状态进行调控,决定采用WebVirtMgr作为kvm虚拟化的web管理工具,图形化的WEB,让人能更方便的查看kvm 宿主机的情况和操作 WebVirtMgr是近两年来发展较快,比较活跃,非常清新的一个KVM管理平台,提供对宿主机和虚机的统一管理,它有别于kvm自带的图形管理工具
洗尽了浮华
2018/01/22
2.8K0
kvm虚拟化管理平台WebVirtMgr部署-完整记录(1)
在centos7.6上部署前后端分离项目Nginx反向代理vue.js2.6+Tornado5.1.1,使用supervisor统一管理服务
    这一次使用vue.js+tornado的组合来部署前后端分离的web项目,vue.js不用说了,前端当红炸子鸡,泛用性非常广,无论是单页应用,还是混合式开发app,亦或是微信小程序开发,样样得心应手,tornado最近的风头有点被新锐框架sanic抢走了,但是作为老牌的异步非阻塞框架,其内置了支持epoll/kqueue 等高效网络库,而具备了处理高并发的能力并且开发效率也不低,这一次tornado作为承载后端压力的角色。
用户9127725
2022/08/08
3340
在centos7.6上部署前后端分离项目Nginx反向代理vue.js2.6+Tornado5.1.1,使用supervisor统一管理服务
一套基于docker的多实例部署测试脚手架
最近在写下单功能实现,想要压测下。单纯压测本地很难达到效果,最好是像生产部署一样,基于实际情况进行压测。手头没那么机器的情况下,采用docker做实例化部署就可以了。
Ryan-Miao
2022/09/07
5060
四位一体水溶交融,Docker一拖三Tornado6.2 + Nginx + Supervisord非阻塞负载均衡容器式部署实践
    容器,又见容器。Docker容器的最主要优点就在于它们是可移植的。一套服务,其所有的依赖关系可以捆绑到一个独立于Linux内核、平台分布或部署模型的主机版本的单个容器中。此容器可以传输到另一台运行Docker的主机上,并且在没有兼容性问题的情况下执行。而传统的微服务架构会将各个服务单独封装为容器,虽然微服务容器化环境能够在给定数量的基础架构内实现更高的工作负载密度,但是,在整个生产环境中创建、监视和销毁的容器需求总量呈指数级增长,从而显著增加了基于容器管理环境的复杂性。
用户9127725
2022/08/08
4520
四位一体水溶交融,Docker一拖三Tornado6.2 + Nginx + Supervisord非阻塞负载均衡容器式部署实践
使用 Docker 让部署 Django 项目更加轻松
那么我们有没有办法,让本地开发环境和线上环境保持一致?这样我们在部署上线前,就可以在本地进行验证,只要验证没问题,我们就有 99% 的把握保证部署上线后也没有问题(1%保留给程序玄学)。
HelloGitHub
2021/05/14
1.5K0
后端Laravel项目Docker构建
api和后台部署在同一台服务器上,通过nginx区分,nginx文件在nginx文件夹下
无忧366
2022/02/14
1.5K0
海纳百川无所不容,Win10环境下使用Docker容器式部署前后端分离项目Django+Vue.js
    随着现代化产品研发的不断推进,我们会发现,几乎每个产品线都会包含功能各异的服务,而且服务与服务之间存在也会存在着错综复杂的依赖和被依赖关系,这就会带来一个世界性难题,项目部署的时候需要运维来手动配制服务之间通信的协议和地址,稍有不慎就会导致服务异常,同时如果服务器因为坏道或者其他原因导致更换物理机,重新部署新环境的成本也会非常之高。因此,我们就会寄希望于Docker这种的容器技术可以让我们构建产品所需要的所有的服务能够迅速快捷的重新部署,并且可以根据需求做横向扩展,且能够保证稳定的容灾性,在出现问题的时候可以利用守护进程自动重启或者启动容灾备份。
用户9127725
2022/08/08
7270
海纳百川无所不容,Win10环境下使用Docker容器式部署前后端分离项目Django+Vue.js
Docker 部署Django博客项目
我之前部署我的博客项目(Django应用),没用Docker,直接借助的宝塔Linux服务器面板在服务器上部署的,部署起来也是十分的方便,使用了Django+Nginx+Supervisor+Gunicorn部署,可查看我写过的一片博客:Centos安装python3并使用Nginx+Gunicorn+virtualenv+supervisor来部署django项目。
緣來
2020/01/02
1.4K0
Docker 部署Django博客项目
Django容器(上): 自定义基础镜像
某个 Python 项目,基于 Python:3.6 与 Django:1.11 框架开发,希望项目能够容器化,然后可以通过 docker-compose 等工具编排容器/应用,本篇文章的目标是自定义Django基础镜像。
用户1560186
2019/12/19
7600
【前端部署第三篇】通过 docker 学习 nginx 配置,及基于 nginx 部署最简前端项目
大家好,我是山月,这是我最近新开的专栏:「前端部署系列」。包括 Docker、CICD 等内容,大纲图示如下:
山月
2022/05/23
1.2K0
【前端部署第三篇】通过 docker 学习 nginx 配置,及基于 nginx 部署最简前端项目
fabric+supervisor+n
celery+virtualenv+supervisor的情形,其实只要指定celery程序为virtaulenv下面的那个即可,例如/home/xby/venv/mdwiki/bin/celery
py3study
2020/01/06
6260
Docker-compose部署Django项目笔记
Docker 允许通过文本格式的配置文件来构建镜像,默认名称为 Dockerfile
Hsinyan
2022/06/19
1.2K0
Docker-compose部署Django项目笔记
Installing sentry 9.0.0 with postgresql in Centos7
Sentry是一个开源错误跟踪工具,可帮助您实时监控和修复bug。支持 Python、OC、Java、Go、Node、Django、RoR 等主流编程语言和框架,还提供了 GitHub、Slack、Trello 等常见开发工具的集成。
阿dai学长
2019/04/03
1.3K0
Installing sentry 9.0.0 with postgresql in Centos7
docker容器化python服务部署(supervisor-gunicorn-flask)
本文系作者原创,转载请注明出处: https://www.cnblogs.com/further-further-further/p/13223767.html
用户7225427
2020/09/03
2.5K0
docker容器化python服务部署(supervisor-gunicorn-flask)
Jenkins部署并使用supervisor启动
这里可以定义自己的工作目录,例如将supervisor放在/usr/local目录下
dogfei
2020/07/31
1.8K0
项目部署 docker 记录
将连接名改为需要连接的依赖名 (在 docker-compose.yml 中配置);
子润先生
2021/06/11
5430
推荐阅读
相关推荐
从零开始 - Docker部署前后端分离项目(四)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验