Docker部署Django+MySQL+Redis+Nginx+uWSGI+Celery(超详细)

news2024/11/13 22:25:50

一、知识储备

经过我们之前学习的Docker相关知识,现在我们来进行实战,以下介绍如何通过Docker Compose部署Django项目:

先前知识:

Docker学习笔记(一)概念理解-CSDN博客

Docker学习笔记(二)镜像、容器、仓库相关命令操作-CSDN博客

Docker学习笔记(三)Dockerfile-CSDN博客

Docker Compose | 菜鸟教程 (runoob.com)

二、项目目录结构说明

DjangoTest               ## 项目根路径
│  docker-compose.yml            # docker-compose文件
│  Dockerfile                    # 部署django项目的dockerfile
│  requirements.txt              # 项目必须要安装的文件 pip freeze > requirements.txt
│
├─nginx                      ## nginx容器配置文件
│  │  nginx.conf                 # /etc/nginx/nginx.conf配置文件
│  │
│  └─conf                        # /etc/nginx/conf.d配置nginx文件夹
│          default.conf
│
└─djangoProject2                        ## 部署django项目的web容器
    │  manage.py
    │  uwsgi.ini                 # django项目的uwsgi配置文件 
    │
    ├─app01
    │  │  admin.py
    │  │  apps.py
    │  │  models.py
    │  │  tasks.py               # 配置celery任务文件
    │  │  tests.py
    │  │  urls.py
    │  │  views.py
    │  │  __init__.py
    │  │
    │  ├─migrations
    │  │      __init__.py       
    │  
    │
    └─djangoProject2
            celery.py           # celery配置文件
            settings.py
            urls.py
            wsgi.py
            __init__.py

三、项目文件说明

1.docker-compose.yml文件

version: '3'

services:
  mysql:
    image: mysql:8.0
    volumes:
      - ./mysql:/var/lib/mysql
    expose:
      - "3306"
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=543720aini    #mqsql服务器root密码
      - MYSQL_DATABASE=test   #数据库名
      - MYSQL_USER=test    #用户
      - MYSQL_PASSWORD=543720aini  #数据库密码

  nginx:
    image: nginx:alpine
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/conf:/etc/nginx/conf.d
    ports:
      - "80:80"
    depends_on:
      - web

  redis:
    image: redis:alpine
    expose:
      - "6379"
    restart: always

  web:
    build: .
    ports:
       - "8000:8000"   #主机端口和容器端口映射,要和下面的uwsgi.ini文件中的socket保持一致
    command: ./start.sh
    working_dir: /code/djangoProject2
    volumes:
      - .:/code
    expose:
      - "8000"
    depends_on:
      - mysql
      - redis

  celery:
    build: .
    command: celery -A djangoProject2 worker -l info
    working_dir: /code/djangoProject2
    volumes:
      - .:/code
    depends_on:
      - mysql
      - redis

  celery-beat:
    build: .
    command: celery -A djangoProject2 beat -l info  # 新增的服务,用于启动Celery Beat
    working_dir: /code/djangoProject2
    volumes:
      - .:/code
    depends_on:
      - mysql
      - redis

DjangoTest\djangoProject2\start.sh

#!/bin/bash
python manage.py makemigrations
python manage.py migrate
python manage.py runserver 0.0.0.0:8000  #端口要和上面的web中的配置一样
uwsgi --ini uwsgi.ini

2.web向配置文件

Dockerfile

FROM python:3.7
ENV PYTHONUNBUFFERED=1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple && apt-get update && apt-get install -y uwsgi uwsgi-plugin-python3

DjangoTest\djangoProject2\uwsgi.ini

[uwsgi]
socket=:8000   #和docker-compose.yml文件中的web下暴露的端口一样
chdir=/code/djangoProject2
module=djangoProject2.wsgi:application
pidfile=/tmp/web-master.pid
master=True
vacuum=True
processes=1
max-requests=5000
post-buffering=8192

3.nginx容器相关配置文件

DjangoTest\nginx\nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
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;
}

DjangoTest\nginx\conf\default.conf

server {
    listen                  8080;
    server_name             xxxx;  #换成自己服务器的ip或域名(我用的是阿里云服务器,我这里配置的是阿里云的公网ip
    charset                 utf-8;
    client_max_body_size    10M;

    location /static/ {
        alias   /django_static/;
    }

    location / {
        include     uwsgi_params;
	proxy_pass  http://web:8000; # 代理的端口
        proxy_pass_header Server;
        proxy_set_header  Host $host;
        proxy_set_header  X-Real-IP $remote_addr;
        proxy_set_header  X-Scheme $scheme;
    }
}

4.celery配置文件

DjangoTest\djangoProject2\djangoProject2\celery.py

import os
from celery import Celery
from django.conf import settings

# 只要是想在自己的脚本中访问Django的数据库等文件就必须配置Django的环境变量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djangoProject2.settings')

# app名字
app = Celery('djnagoProject2')
app.conf.timezone = 'Asia/Shanghai'
app.conf.enable_utc = False

# 配置celery
class Config:
    BROKER_URL = 'redis://redis:6379/1'
    CELERY_RESULT_BACKEND = 'redis://redis:6379/2'



app.config_from_object(Config)
# 到各个APP里自动发现tasks.py文件
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

DjangoTest\djangoProject2\djangoProject2\__init__.py

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from djangoProject2.celery import app as celery_app

__all__ = ['celery_app']

DjangoTest\djangoProject2\app01\tasks.py

# Create your tasks here
import datetime

from celery.schedules import crontab
from celery.task import periodic_task
from django.db import transaction
from djangoProject2.celery import app

from .models import Worker


@periodic_task(run_every=crontab(minute="0",hour="0",day_of_week="1"))
def create_worker():
    now_time = datetime.datetime.now()
    with transaction.atomic():
        Worker.objects.create(name=str(now_time.strftime("%H:%M:%S")), age=int(now_time.second))


@app.task
def update_worker():
    now_time = datetime.datetime.now()
    with transaction.atomic():
        Worker.objects.update(age=int(now_time.second))

5.settings配置文件

修改配置文件相关信息

ALLOWED_HOSTS = ["*"]

#如果涉及跨域,则需要进行其他的配置,在这里不阐述
...


INSTALLED_APPS = [
    ...
    'django_celery_results',   
    'django_celery_beat',
    'app01'
]


#Celery相关配置
CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers.DatabaseScheduler'  # 使用数据库调度器



#下面的配置和docker-compose.yml中的mysql下的environment配置一致
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': "test",
        "USER": "root",
        "PASSWORD": "543720aini",
        "HOST": "localhost",
        "PORT": "3306",
    }
}

6.初始化一个Django项目

DjangoTest\djangoProject2\djangoProject2\urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('app01/', include(('app01.urls', 'app01'), namespace='app01'))
]

DjangoTest\djangoProject2\app01\urls.py

from django.urls import path
from app01 import views
urlpatterns = [
    path('index', views.index, name='index')
]

DjangoTest\djangoProject2\app01\views.py

from django.http import HttpResponse
from django.shortcuts import render, redirect
from django.urls import resolve, reverse

from app01.tasks import update_worker


# Create your views here.
def index(request):
    update_worker.delay()
    return HttpResponse("Hello Docker")

DjangoTest\djangoProject2\app01\models.py

from django.db import models


# Create your models here.
class Worker(models.Model):
    name = models.CharField("名字", max_length=64, default="")
    age = models.IntegerField("年龄")

    class Meta:
        verbose_name = "劳动者"

四、使用 Compose 命令构建和运行您的应用

在DjangoTest目录下运行docker-compose up命令,看到如下图所示,则说明部署成功:

五、访问刚刚部署的应用

路由是你在DjangoTest\nginx\conf\default.conf中配置的service_name,端口是docker-compose.yml文件中web的port,如http://xxxx:8000/app01/index

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1906856.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

20240708 Transformer

如何从浅入深理解transformer? - 知乎 1.出现了一些基于自监督的方法,这包括基于对比学习的方法如MoCo和SimCLR,和基于图像掩码的方法如MAE和BeiT 2、Transformer结构及其应用详解--GPT、BERT、MT-DNN、GPT-2 - 知乎 3. "Decoder-o…

教育相关知识

教育的含义 教育的基本要素 教育的属性 教育的功能 教育的起源 教育的发展

redis-cli 连接Redis

Redis-cli介绍 redis-cli 是原生 Redis 自带的命令行工具&#xff0c;您可以在云主机或本地设备上通过 redis-cli 连接 Redis 数据库&#xff0c;进行数据管理。 redis-cli 客户端的使用方法&#xff0c;请参考官方文档。 连接命令 redis-cli -h <redis_instance_address…

DNF手游攻略:云手机辅助刷副本!内置辅助工具!

DNF手游是一款备受玩家喜爱的角色扮演类游戏&#xff0c;以其独特的地下城探险和多样化的装备系统而闻名。玩家需要通过不断的挑战和升级&#xff0c;逐步增强自己的角色实力&#xff0c;最终完成各种高难度的副本任务。游戏的核心玩法包括打怪、刷装备、升级技能等。 游戏辅助…

这款拖拽式大屏设计神器,太惊艳了!收藏吧!

概念​ 可视化大屏是当今信息时代的一种重要技术工具&#xff0c;它以大屏幕为显示终端&#xff0c;通过图形、图表、地图等形式将大量数据和信息直观地呈现出来&#xff0c;帮助用户更好地理解和分析数据。 JVS智能BI的可视化大屏从界面布局、色彩搭配&#xff0c;到图表类型…

Vue CoreVideoPlayer 一款基于 vue.js 的轻量级、优秀的视频播放器组件

大家好,我是程序视点的小二哥!今天小二哥给大家推荐一款非常优秀的视频播放组件 效果欣赏 介绍 Vue-CoreVideoPlayer 一款基于vue.js的轻量级的视频播放器插件。 采用Adobd XD进行UI设计&#xff0c;支持移动端适配,不仅功能强大&#xff0c;颜值也是超一流&#xff01; Vue-…

奇异值分解(SVD)关键概念以及物理意义

本文主要用来讨论奇异值分解&#xff08;SVD)的一些核心概念以及它的物理意义和实际意义&#xff0c;说到底就是&#xff1a; 这东西有什么用&#xff1f;是怎么起作用的&#xff1f; 我们按顺序一步步来拆解这些问题并且分析。 引言 之前也只是模棱两可地了解过SVD的功能&…

计算机网络知识汇总

目录 前言 概述 1、互联网的组成 2、端系统之间的两种通信方式 1、客户-服务器方式 2、对等连接方式&#xff08;P2P&#xff09; 3、交换技术 4、时延 5、利用率 6、协议 7、计算机网络体系结构 8、ISP 物理层 链路层 网络层 传输层 应用层 前言 最近准备找工作…

ARL联动AWVS实现自动化漏洞扫描

0x01 前言 很多场景下需要大范围的扫描漏洞和快速排查互联网暴露面的漏洞&#xff0c;需要使用这种自动化的手段&#xff0c;常规渗透测试的找互联网暴露面是&#xff0c;域名>子域名>IP>C段>端口&#xff0c;可以手动收集&#xff0c;也可以借助一些网络搜索引擎…

AI直播手机APP震撼发布!3大场景直播,60秒一键开播!

无需繁琐准备&#xff0c;无需复杂操作&#xff0c;60 秒在抖音及其他平台一键开播&#xff0c;青否数字人AI直播APP正式发布&#xff01; 3大AI直播类型&#xff0c;6大核心 AIGC 技术&#xff0c;让新手小白也能轻松搞定数字人在全平台直播&#xff0c;并且有效规避违规风险&…

Pytorch模型的推理如何编写-以猫狗分类为例

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️如遇文章付费&#xff0c;可先看…

苹果电脑压缩软件哪个好用一些? mac电脑用什么压缩软件 mac电脑压缩文件怎么设置密码

压缩软件是Mac电脑必不可少的工具&#xff0c;虽然Mac系统自带了一款“归档实用工具”&#xff0c;但是其功能实在匮乏&#xff0c;若你需要加密压缩文件或者把文件压缩成指定格式&#xff0c;那么该工具无法满足你的需求。Mac用户应该怎么选择压缩软件呢&#xff1f;本文就来告…

医疗器械网络安全| 常见安全漏洞与防护措施

医疗器械网络安全顾问​https://link.zhihu.com/?targethttps%3A//www.wanyun.cn/Support%3Fshare%3D24315_ea8a0e47-b38d-4cd6-8ed1-9e7711a8ad5e 一、常见安全漏洞 医疗器械软件在现代医疗体系中扮演着至关重要的角色&#xff0c;然而&#xff0c;随着技术的不断发展&…

江门数字化mes系统定制哪家好 珠海盈致mes系统服务商

对于江门数字化MES系统的定制服务&#xff0c;选择珠海盈致科技是一个不错的选择。珠海盈致科技是一家专业的智能制造解决方案提供商&#xff0c;具有丰富的数字化制造和MES系统定制经验。以下是选择珠海盈致科技的一些优势&#xff1a; 专业团队&#xff1a;珠海盈致科技拥有一…

springboot整合微信公众号实现模版消息推送

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 &#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 springboot整合微信公众号实现模版消息推送 前言前提工作整合springboot配置实现逻辑基础1、要获…

【C++】———— 继承

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;C 创作时间 &#xff1a;2024年7月5日 一、什么是继承&#xff1f; 继承的概念 定义&#xff1a; 继承机制就是面向对象设计中使代码可以复用的重要手段&#xff0c;它允许在程序员保持原有类特性的基础上进行扩展…

[工具教程]-31-解决mac扣盖后电池耗电快(谁在偷偷的用电池)

查看耗电模式 $ pmset -g查看 hibernatemode 这一行&#xff0c;如果 hibernatemode 后面的数字是 0 &#xff0c;那这种休眠模式下&#xff0c;掉电程度就是非常严重&#xff0c;如果 hibernatemode 后面的数字是 3 &#xff08;大部分人的电脑应该是这个休眠模式&#xff09…

STM32智能电网监控系统教程

目录 引言环境准备智能电网监控系统基础代码实现&#xff1a;实现智能电网监控系统 4.1 数据采集模块 4.2 数据处理与分析 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;电网监控与优化问题解决方案与优化收尾与总结 1. 引言 智能电网监控系统通过S…

3款自己电脑就可以运行AI LLM的项目

AnythingLLM、LocalGPT和PrivateGPT都是与大语言模型&#xff08;LLM&#xff09;相关的项目&#xff0c;它们允许用户在本地环境中与文档进行交互&#xff0c;但它们在实现方式和特点上存在一些差异。AnythingLLM使用Pinecone和ChromaDB来处理矢量嵌入&#xff0c;并使用OpenA…

供应RTL8366SC-CG瑞昱芯片

标17566722766题 长期供应各品牌原装芯片&#xff1a; RTL8366SC-CG RTL8382L-VB-CG RTL8218D-CG RTL8192EU-VP-CG RTL8821CU-CG RTL8811CU-CG RTL8723DU-CG RTL8723DS-CG RTL8711AM-VB1-CG RTL8111H-VB-CG RTL8111H-CG RTL8211F-CG RTL8211E-VB-CG RTL8733BS…