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:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    environment:
      - DJANGO_SETTINGS_MODULE=myproject.settings
      - DATABASE_URL=postgres://postgres:postgres@db:5432/postgres

  db:
    image: postgres
    environment:
      - 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:8000
    volumes:
      - .
    ports:
      - "8000:8000"
    environment:
      - DJANGO_SETTINGS_MODULE=myproject.settings
      - DATABASE_URL=postgres://postgres:postgres@db:5432/postgres

  db:
    image: postgres
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres

  nginx:
    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: Dockerfile
    ports:
      - "8000:8000"
    environment:
      - DJANGO_SETTINGS_MODULE=myproject.settings
      - DATABASE_URL=postgres://postgres:postgres@db:5432/postgres

  db:
    image: postgres
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres

  nginx:
    build:
      context: .
      dockerfile: Dockerfile.nginx
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - web
    volumes:
      - ./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,本文可能会有点晦涩。但是,当你熟悉了这些工具和框架,你会发现使用它们来构建和部署应用程序是非常方便和高效的。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

rancher2使用helm部署harbor,搭建私有镜像/helm仓库

接上一篇《rancher2安装nfs-subdir-external-provisioner为PVC/PV动态提供存储空间(动态分配卷)》 本篇开始讲如何在rancher2中部署harbor,来搭建一个私有的镜像/helm仓库。 一、安装harbor服务 1. 在目标集群中添加命名空间 2. 将提供harb…

【Git】git企业开发命令整理,以及注意点

1.git企业开发过程 业务的分支大概有以下几个: master:代码随时可能上线 develop:代码最新 feature/xxx:实际业务开发分支 release/xxx:预发布分支 fix:修复bug分支 过程大概是这样的: 首…

湖北安全员ABC证书电子版哪里下载?安全员证书可以全国通用吗?

湖北安全员ABC目前一个月有一到两批次的考试,需要报考安全员的直接问甘建二就行了,她都可以给您解疑答惑。 湖北安全员ABC证书电子版证书在哪里下载?怎么下载? 湖北安全员ABC证书也都是电子版的证书,直接从网上下载的…

虚拟机 RHEL8 安装 MySQL 8.0.34

目录 安装步骤一、清除所有残留的旧MySQL二、安装MySQL 报错问题1. 提示未找到匹配的参数: mysql-community-server2. 公钥问题 安装步骤 一、清除所有残留的旧MySQL 1. 关闭MySQL [rootlocalhost /]# service mysqld stop Redirecting to /bin/systemctl stop …

matlab编程实践14、15

目录 数独 "四独"游戏 解的存在和唯一性 算法 常微分方程 数独 采用蛮力试凑法来解决数独问题。(采用单选数,以及计算机科学技术中的递推回溯法) 以上的数独是图14-2的两个矩阵的和,左侧的矩阵可以由kron和magic函…

利用sklearn 实现线性回归、非线性回归

代码: import pandas as pd import numpy as np import matplotlib import random from matplotlib import pyplot as plt from sklearn.preprocessing import PolynomialFeatures from sklearn.linear_model import LinearRegression# 创建虚拟数据 x np.array(r…

SQL SERVER使用发布订阅同步数据库遇到的坑

可能遇到的各种坑 1.在执行 xp_cmdshell 的过程中出错。调用 ‘CreateProcess’ 失败,错误代码: ‘5’ 网上有各种解决办法,包括改本地安全策略,将sql server服务的网络权限改为本机系统,改cmd用户的读写权限,退出360…

Android 开发代码规范

一. AndroidStudio开发工具规范 使用最新的稳定版本.统一文件的编码格式为utf-8. 清除每个类里面的无效的import导包.代码样式统一,比如,tab缩进4个空格,或者 tab size等如果没有特殊情况使用默认的配置即可。每行字数每行字符数不得超过 160 字符&…

flask处理文件上传

flask处理文件上传 在Flask框架中,你可以使用request.files对象来处理文件上传。以下是一个简单的文件上传的示例: from flask import Flask, request from werkzeug.utils import secure_filename import osapp Flask(__name__)# 定义文件上传的路径…

Web3将自己写在合约中的代币添加到MetaMask中管理

上文 Web3带着大家根据ERC-20文档编写自己的第一个代币solidity智能合约 带着大家在智能合约中创建了一个自己的代币系统 我们可以在MetaMask中去导入 ganache环境下模拟出来的第一和第二个账号 我们这里 可以看到他们的 ETH 但看不到自己的代币符号 没关系 我们点击这下面的…

cicd实验

系列文章目录 文章目录 系列文章目录一、1.2. 二、安装并使用1.安装gitlab2.//Jenkins安装3. 总结 一、 1. 2. 二、安装并使用 需要三台服务器一台安装gitlab 192.168.169.10 第二台负责 安装jenkins 192.168.169.20 第三台是负责业务 192.168.169.30 1.安装gitlab yum in…

【前端知识】React 基础巩固(三十九)——React-Router的基本使用

React 基础巩固(三十九)——React-Router的基本使用 一、Router的基本使用 Router中包含了对路径改变的监听,并且会将相应的路径传递给子组件。 Router包括两个API: BrowserRouter使用history模式 HashRouter使用hash模式(路径后面带有#号…

Linux进程概念(一)

文章目录 Linux进程概念查看进程杀死进程进程标识符 手动创建进程的方式fork函数创建进程 进程状态运行态阻塞态和挂起 Linux进程概念 前文我们了解了,进程的基本概念,在课本上被描述为,正在执行的程序,在linux内核上&#xff0c…

第一百一十六天学习记录:C++提高:STL-string(黑马教学视频)

string基本概念 string是C风格的字符串,而string本质上是一个类 string和char区别 1、char是一个指针 2、string是一个类,类内部封装了char*,管理这个字符串,是一个char型的容器。 特点: string类内部封装了很多成员方…

C++——STL容器之list链表的讲解

目录 一.list的介绍 二.list类成员函数的讲解 2.2迭代器 三.添加删除数据: 3.1添加: 3.2删除数据 四.排序及去重函数: 错误案例如下: 方法如下: 一.list的介绍 list列表是序列容器,允许在序列内的任何…

Git学习

一、Git工作流程 二、Git学习 1.获取本地仓库 要使用Git对我们的代码进行版本控制,首先需要获得本地仓库 在电脑的任意位置创建一个空目录(例如test)作为我们的本地Git仓库进入这个目录中,点击右键打开Git bash窗口执行命令git init如果创建成功后可在…

点云处理——terrasolid教程

加载terrasolid软件模块 3、通过microstation的utilities->mdl applications加载terrasolid四个模块,加载成功后将显示tscan和tphoto的主窗口,以及四个模块的主工具箱。 浏览点云 4、显示点云坐标信息(类, 航带号,GPS信息,东…

文心一言 VS 讯飞星火 VS chatgpt (67)-- 算法导论6.5 6题

文心一言 VS 讯飞星火 VS chatgpt (67)-- 算法导论6.5 6题 六、在 HEAP-INCREASE-KEY 的第 5 行的交换操作中,一般需要通过三次赋值来完成。想一想如何利用INSERTION-SORT 内循环部分的思想,只用一次赋值就完成这一交换操作? 文…

【Django+Vue】英文成绩管理平台--20230727

能够满足大部分核心需求(标绿):报表部分应该比较难。 项目地址 前端编译 https://gitlab.com/m7840/toeic_vue_dist Vue源码 https://gitlab.com/m7840/toeic_vue Django源码 https://gitlab.com/m7840/toeic_python 项目架构 流程 …

嵌入式面试常见题目收藏(超总结)

​ 这篇文章来自很多博客主和其他网站的作者,如有侵权,联系必删 文章出处标注: https://blog.csdn.net/qq_44330858/article/details/128947083 ***如需PDF或者原稿可私信 *** ***如需PDF或者原稿可私信 *** ***如需PDF或者原稿可私信 *** 1.…