Python web实战 | Docker+Nginx部署python Django Web项目详细步骤【干货】

 


概要

在这篇文章中,我将介绍如何使用 Docker 和 Nginx 部署 Django Web 项目。一步步讲解如何构建 Docker 镜像、如何编写 Docker Compose 文件和如何配置 Nginx。


1. Docker 构建 Django Web 项目

1.1 配置 Django 项目

在开始之前,我们需要有一个 Django 项目。如果你还没有 Django 项目,可以按照 Django 官方文档的指导创建一个。我们将 Django 项目放在一个名为 myproject 的目录中。

1.2 编写 Dockerfile

接下来,我们需要编写 Dockerfile。Dockerfile 是用来构建 Docker 镜像的脚本。在 myproject 目录下创建一个名为 Dockerfile 的文件,并在其中添加以下内容:

# 基础镜像
FROM python:3.9# 在容器中创建项目目录
RUN mkdir /code# 设置工作目录
WORKDIR /code# 将当前目录下的所有文件复制到容器中的 /code 目录
COPY . /code/# 安装项目依赖
RUN pip install -r requirements.txt

在上面的 Dockerfile 中,我们首先指定 Python 3.9 作为基础镜像。然后在容器中创建一个名为 /code 的目录,并将当前目录下的所有文件复制到容器中的 /code 目录中。最后,我们安装项目所需的依赖。

1.3 构建 Docker 镜像

现在我们可以使用 Dockerfile 来构建 Docker 镜像了。在 myproject 目录下打开终端,运行以下命令:

docker build -t myproject .

上面的命令将使用 myproject 目录下的 Dockerfile 构建一个名为 myproject 的 Docker 镜像。

1.4 运行 Docker 镜像

现在我们可以运行 Docker 镜像了。在终端中运行以下命令:

docker run -it --rm -p 8000:8000 myproject

上面的命令将运行一个名为 myproject 的 Docker 镜像,并将容器的端口 8000 映射到主机的端口 8000。现在你可以在浏览器中访问 http://localhost:8000 来查看你的 Django 项目是否正常工作了。

2. 使用 Docker Compose 编排 Django Web 项目

虽然上面的方法可以用来构建和运行 Docker 镜像,但是它并没有考虑到一些重要的问题,例如如何处理数据库、如何设置环境变量等等。为了解决这些问题,我们可以使用 Docker Compose。

2.1 编写 Docker Compose 文件

在 myproject 目录下创建一个名为 docker-compose.yml 的文件,并在其中添加以下内容:

version: '3'services:web:build: .command: python manage.py runserver 0.0.0.0:8000volumes:- .:/codeports:- "8000:8000"environment:- DJANGO_SETTINGS_MODULE=myproject.settings- DATABASE_URL=postgres://postgres:postgres@db:5432/postgresdb:image: postgresenvironment:- POSTGRES_DB=postgres- POSTGRES_USER=postgres- POSTGRES_PASSWORD=postgres

在上面的 Docker Compose 文件中,我们定义了两个服务:一个是 web 服务,另一个是 db 服务。web 服务是我们刚才构建的 Django Web 项目,db 服务是一个 PostgreSQL 数据库。

在 web 服务中,我们使用了 build 关键字来指定 Dockerfile 的路径。command 关键字用来指定容器启动时要运行的命令,这里我们运行 Django 的开发服务器。volumes 关键字用来将本地目录与容器内的目录进行映射,这样我们可以在本地编辑文件并在容器内运行它们。ports 关键字用来将容器内的端口映射到主机上的端口。environment 关键字用来设置环境变量,这里我们设置了 Django 的配置和数据库连接的 URL。

在 db 服务中,我们使用了 image 关键字来指定使用 PostgreSQL 官方镜像。environment 关键字用来设置 PostgreSQL 的用户名、密码和数据库名称。

2.2 运行 Docker Compose

现在我们可以使用 Docker Compose 来构建和运行 Docker 镜像了。在终端中运行以下命令:

docker-compose up

上面的命令将使用 docker-compose.yml 文件来构建和运行 Docker 镜像。在容器启动后,你可以在浏览器中访问 http://localhost:8000 来查看你的 Django 项目是否正常工作了。

3. 配置 Nginx 反向代理

尽管我们已经成功地将 Django Web 项目部署到了 Docker 中,但是我们还没有解决如何使用 Nginx 配置反向代理的问题。在这一节中,我们将讲解如何使用 Nginx 配置反向代理。

3.1 编写 Nginx 配置文件

在 myproject 目录下创建一个名为 nginx.conf 的文件,并在其中添加以下内容:

upstream web {server web:8000;
}server {listen 80;location / {proxy_pass http://web;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
}

在上面的配置文件中,我们定义了一个名为 web 的 upstream,将其指向 Docker Compose 中的 web 服务。然后我们定义了一个 Nginx 服务器监听 80 端口。在 location 中,我们将请求代理到 upstream 中的 web 服务,并设置了 Host 和 X-Real-IP 头。

以上配置为访问ip打开项目。如果你想绑定域名,可以改成:

upstream web {server web:8000;
}server {listen 80;server_name example.com;location / {proxy_pass http://web;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
}

把example.com解析到你的ip后,即可实现访问域名打开项目。

3.2 编写 Dockerfile

为了让 Nginx 能够使用我们编写的配置文件,我们需要编写一个 Dockerfile。

在 myproject 目录下创建一个名为 Dockerfile.nginx 的文件,并在其中添加以下内容:

# 基础镜像
FROM nginx:latest# 删除默认配置文件
RUN rm /etc/nginx/conf.d/default.conf# 将自定义配置文件复制到容器中的 /etc/nginx/conf.d/ 目录下
COPY nginx.conf /etc/nginx/conf.d/

在上面的 Dockerfile 中,我们首先指定 Nginx 最新版本作为基础镜像。然后我们删除默认的配置文件,并将我们编写的配置文件复制到容器中的 /etc/nginx/conf.d/ 目录下。

3.3 构建 Docker 镜像并运行

现在我们可以使用 Dockerfile.nginx 来构建 Docker 镜像了。在终端中运行以下命令:

docker build -t myproject-nginx -f Dockerfile.nginx .

上面的命令将使用 Dockerfile.nginx 构建一个名为 myproject-nginx 的 Docker 镜像。

接下来,我们需要使用 Docker Compose 来启动 Nginx 服务。在 docker-compose.yml 中添加以下内容:

version: '3'services:web:build: .command: python manage.py runserver 0.0.0.0:8000volumes:- .ports:- "8000:8000"environment:- DJANGO_SETTINGS_MODULE=myproject.settings- DATABASE_URL=postgres://postgres:postgres@db:5432/postgresdb:image: postgresenvironment:- POSTGRES_DB=postgres- POSTGRES_USER=postgres- POSTGRES_PASSWORD=postgresnginx:build: .ports:- "80:80"depends_on:- web

在上面的 Docker Compose 文件中,我们定义了一个名为 nginx 的服务,使用之前编写的 Dockerfile.nginx 来构建 Docker 镜像。我们将容器的端口 80 映射到主机的端口 80,并且在 depends_on 中指定了 web 服务,这样 Nginx 就可以将请求代理到 web 服务中。

现在我们可以使用 Docker Compose 来构建和运行 Docker 镜像。在终端中运行以下命令:

docker-compose up

上面的命令将使用 docker-compose.yml 文件来构建和运行 Docker 镜像。在容器启动后,你可以在浏览器中访问 http://localhost 来查看你的 Django 项目是否正常工作了,这时请求会被 Nginx 代理到 web 服务中。

4. 配置静态文件服务和 HTTPS 支持

如果你的 Django 项目中包含静态文件,你需要将它们配置为独立的静态文件服务。此外,你可能还需要为你的 Web 应用程序配置 HTTPS 支持。在这一节中,我们将讲解如何配置静态文件服务和 HTTPS 支持。

4.1 配置静态文件服务

为了让 Nginx 作为静态文件服务,我们需要在 nginx.conf 文件中添加以下内容:

upstream web {server web:8000;
}server {listen 80;location /static/ {alias /code/static/;}location / {proxy_pass http://web;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
}

在上面的配置文件中,我们添加了一个名为 /static/ 的 location,并设置其别名为 /code/static/,这样 Nginx 就可以将静态文件服务到客户端了。

4.2 配置 HTTPS 支持

为了配置 HTTPS 支持,我们需要使用 SSL 证书。你可以购买 SSL 证书,也可以使用免费的 Let's Encrypt 证书。

4.2.1 使用 Let's Encrypt 证书

如果你想使用 Let's Encrypt 证书,可以按照以下步骤进行配置。

首先,安装 Certbot 工具。你可以在 Certbot 的官方网站上找到详细的安装说明。

接下来,使用 Certbot 工具来申请证书。在终端中运行以下命令:

sudo certbot certonly --webroot --webroot-path=/code/static -d example.com

上面的命令将使用 webroot 插件来申请证书。--webroot-path 选项将 Certbot 配置为在指定目录下查找验证文件。-d 选项指定了你的域名。

最后,将以下内容添加到 nginx.conf 文件中:

upstream web {server web:8000;
}server {listen 80;server_name example.com;return 301 https://$host$request_uri;
}server {listen 443 ssl;server_name example.com;ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;location /static/ {alias /code/static/;}location / {proxy_pass http://web;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
}

在上面的配置文件中,我们定义了两个服务器:第一个服务器监听 80 端口,并将请求重定向到 443 端口;第二个服务器监听 443 端口,并使用 SSL 证书来启用 HTTPS 支持。ssl_certificate 和 ssl_certificate_key 分别指定了 SSL 证书和私钥的路径。

4.3 Docker Compose 文件更新

最后,我们需要更新 Docker Compose 文件来包含新的 Nginx 配置和静态文件服务。以下是更新后的 Docker Compose 文件:

version: "3"services:web:build:context: .dockerfile: Dockerfileports:- "8000:8000"environment:- DJANGO_SETTINGS_MODULE=myproject.settings- DATABASE_URL=postgres://postgres:postgres@db:5432/postgresdb:image: postgresenvironment:- POSTGRES_DB=postgres- POSTGRES_USER=postgres- POSTGRES_PASSWORD=postgresnginx:build:context: .dockerfile: Dockerfile.nginxports:- "80:80"- "443:443"depends_on:- webvolumes:- ./nginx.conf:/etc/nginx/nginx.conf- ./certbot:/etc/letsencrypt

在上面的 Docker Compose 文件中,我们添加了一个名为 nginx 的服务,并将其端口 443 映射到主机的端口 443,以支持 HTTPS。此外,我们将 /etc/nginx/nginx.conf 和 /etc/letsencrypt 目录挂载到主机上,以便在容器外部进行配置和证书的管理。

现在,你可以使用 Docker Compose 来构建和运行 Docker 镜像,并在浏览器中访问 https://example.com 来查看你的 Django 项目是否正常工作了。

5. 技术总结

如果你以前没有使用过 Docker,本文可能会有点晦涩。但是,当你熟悉了这些工具和框架,你会发现使用它们来构建和部署应用程序是非常方便和高效的。

今天的分享就到这里,欢迎点赞收藏转发,感谢。

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

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

相关文章

QT自定义控件实现并导入

QT自定义控件 介绍 QT Creator自定义控件和designer控件导入 1.安装QT5.7.1 2.将QT编译器目录、lib目录、include目录导入path 使用说明 使用说明按照 1.创建QtDesigner自定义控件工程,打开Qt Creator,创建一个Qt 设计师自定义控件,如下图所示&#xf…

CK_03靶机详解

CK_03靶机详解 靶场下载地址:https://download.vulnhub.com/ck/MyFileServer_3.zip 这个靶机开放的端口特别多,所以给我们的误导也很多,我直接按照正确的思路来。 因为开着445所以就枚举了一下靶机上共享的东西,发现两个share的…

elment-ui的侧边栏 开关及窗口联动

<template><div class"asders"><el-aside width"200px"><div class"boxbody"><div>源码外卖</div><el-switch v-model"isCollapse" :active-value"true" :inactive-value"fals…

通过Filebeat进行日志监控

对系统的日志监控&#xff0c;通用做法是使用ELK&#xff08;Elasticsearch、Logstash、Kibana&#xff09;进行监控和搜索日志&#xff0c;这里给出另一种方案&#xff1a;通过Filebeat接收日志到Kafka&#xff0c;监控平台接收Kafka&#xff0c;并通过WebSocket实时展示。 这…

CAD Voronoi3D V1.0.1 版本更新说明

更新说明 CAD Voronoi3D V1.0.1版本对泰森多边形晶格进行进一步的优化。 采用新算法大幅度减少形体边界出现小晶格的可能性&#xff0c;使区块更均匀&#xff1a; 优化曲边边界晶格曲率问题&#xff0c;消除曲边形体晶格边界曲率过大现象&#xff1a; 优化生成算法&#xff…

Bash编程

目录&#xff1a; bash编程语法bash脚本编写 1.bash编程语法 Bash 编程基础 变量引号数组控制语句函数 Bash 变量 语法&#xff1a; Variable_namevalue Bash 变量定义的规则 变量名区分大小写&#xff0c;a和A为两个不同的变量。变量名可以使用大小写字母混编的形式进行…

iOS - 解压ipa包中的Assert.car文件

项目在 Archive 打包后&#xff0c;生成ipa包 将 xxx.ipa文件修改为zip后缀即 xxx.zip &#xff0c;然后再双击解压&#xff0c;会生成一个 Payload 文件夹&#xff0c;里面一个文件 如下图&#xff1a; 然后显示改文件的包内容&#xff1a; 解压 Assets.car 文件的方式&…

Linux操作系统1-命令篇

不同领域的主流操作系统 桌面操作系统 Windos Mac os Linux服务器操作系统 Unix Linux(免费、稳定、占有率高) Windows Server移动设备操作系统 Android(基于Linux,开源) ios嵌入式操作系统 Linux(机顶盒、路由器、交换机) Linux 特点&#xff1a;免费、开源、多用户、多任务…

flutter:BottomNavigationBar和TabBar

区别 BottomNavigationBarr和TabBar都是用于创建导航栏的组件&#xff0c;但它们有一些区别。 位置不同&#xff1a;BottomNavigationBar通常位于屏幕底部&#xff0c;用于主要导航&#xff1b;而TabBar通常位于屏幕顶部或底部&#xff0c;用于切换不同的视图或页面。 样式不…

java设计模式-观察者模式

什么是观察者模式 观察者模式&#xff08;Observer&#xff09;是软件设计中的一种行为模式。 它定义了对象之间的一对多关系&#xff0c;其中如果一个对象改变了状态&#xff0c;所有依赖它的对象都会自动被通知并更新。 这种模式包含了两种主要的角色&#xff0c;即被观察…

AI 绘画Stable Diffusion 研究(二)sd模型ControlNet1.1 介绍与安装

部署包作者:秋葉aaaki 免责声明: 本安装包及启动器免费提供 无任何盈利目的 大家好&#xff0c;我是风雨无阻。 众所周知&#xff0c;StableDiffusion 是非常强大的AI绘图工具&#xff0c;需要详细了解StableDiffusion的朋友&#xff0c;可查看我之前的这篇文章&#xff1a; …

springboot框架下,请使用@ConfigurationProperties替代@Value加载配置

一、背景 程序启动时&#xff0c;详细报错见下&#xff1a; 10:40:31.965 [main] ERROR org.springframework.boot.SpringApplication - Application run failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘redisDi…

Tribon二次开发- tbbatchjob

在Tribon安装目录下C:\Tribon\M3\Bin里面有许多未知用途的exe,有的双击后时一个DOS终端,有的一闪而过,有的需要按照提示输入信息,有的需要提前在指定的目录配置文件,该如何使用呢? 这些exe大多可以在Tribon以外通过.NET来使用,有的可以通过添加.NET项目引用来使用,有的…

Spring Cloud Alibaba - Nacos源码分析(三)

目录 一、Nacos客户端服务订阅的事件机制 1、监听事件的注册 2、ServiceInfo处理 serviceInfoHolder.processServiceInfo 一、Nacos客户端服务订阅的事件机制 Nacos客户端订阅的核心流程&#xff1a;Nacos客户端通过一个定时任务&#xff0c;每6秒从注册中心获取实例列表&…

filebeat介绍

1、filebeat概述 Filebeat是用于转发和集中日志数据的轻量级传送工具。Filebeat监视您指定的日志文件或位置&#xff0c;收集日志事件&#xff0c;并将它们转发到Elasticsearch或 Logstash或kafka进行索引 1.1 Filebeat两个主要组件 prospector 和 harvester。 prospector&a…

Flink CEP(二) 运行源码解析

通过DemoApp学习一下&#xff0c;CEP的源码执行逻辑。为下一篇实现CEP动态Pattern奠定理论基础。 1. Pattern的定义 Pattern<Tuple3<String, Long, String>,?> pattern Pattern.<Tuple3<String, Long, String>>begin("begin").where(new…

数据分析-关于指标和指标体系

一、电商指标体系 二、指标体系的作用 三、统计学中基本的分析手段

移远通信推出新一代高算力智能模组SG885G-WF,为工业和消费级IoT应用带来全新性能标杆

2023年7月24日&#xff0c;全球领先的物联网整体解决方案供应商移远通信宣布&#xff0c;正式推出其新一代旗舰级安卓智能模组SG885G-WF。该智能模组具有高达48 TOPS 的AI综合算力、强大性能及丰富的多媒体功能&#xff0c;非常适用于需要高处理能力和多媒体功能的工业和消费者…

如何在win10环境下配置强化学习gym库(使用vscode)

我是通过anacondavscode完成的gym库的使用&#xff0c;只是把案例跑起来了&#xff0c;具体步骤如下&#xff1a; 1、安装anaconda,参考链接&#xff1a;https://www.jianshu.com/p/2f3be7781451 我其实就是生安装的&#xff0c;也没有去配置环境啥的&#xff0c;就是下载安…

FANUC机器人SRVO-217故障报警原因分析及参考解决办法

FANUC机器人SRVO-217故障报警原因分析及参考解决办法 如下图所示,示教器提示:SRVO-217紧急停止电路板未找到, 查阅手册可以看到以下的报警说明: 故障原因: 通电时未能识别紧急停止电路板或者增设的安全I/O装置。连接有多个安全I/O装置的系统中,在报警信息的最后,会显示发…