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

这篇具有很好参考价值的文章主要介绍了Python web实战 | Docker+Nginx部署python Django Web项目详细步骤【干货】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

 


概要

在这篇文章中,我将介绍如何使用 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,本文可能会有点晦涩。但是,当你熟悉了这些工具和框架,你会发现使用它们来构建和部署应用程序是非常方便和高效的。

今天的分享就到这里,欢迎点赞收藏转发,感谢。文章来源地址https://www.toymoban.com/news/detail-618320.html

到了这里,关于Python web实战 | Docker+Nginx部署python Django Web项目详细步骤【干货】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python web实战之细说 Django 的单元测试

      : Python Web 开发、Django、单元测试、测试驱动开发、TDD、测试框架、持续集成、自动化测试 大家好,今天,我将带领大家进入 Python Web 开发的新世界,深入探讨 Django 的单元测试。通过本文的实战案例和详细讲解,你将学会如何使用单元测试来保证代码质量,提高开

    2024年02月12日
    浏览(27)
  • Python web实战之Django URL路由详解

      技术栈:Python、Django、Web开发、URL路由 Django是一种流行的Web应用程序框架,它采用了与其他主流框架类似的URL路由机制。URL路由是指将传入的URL请求映射到相应的视图函数或处理程序的过程。 URL路由是Web开发中非常重要的概念,它将URL映射到特定的视图函数。在Django中,

    2024年02月14日
    浏览(35)
  • Python web实战之Django 的缓存机制详解

    :Python、Web 开发、Django、缓存 在 Web 开发中,缓存是一种用于存储数据的临时存储区域。它可以提高应用程序的性能和响应速度,减轻服务器的负载。 当用户访问网页时,服务器会执行一系列操作来生成动态内容,这些操作可能包括数据库查询、复杂的计算等。 如果

    2024年02月13日
    浏览(27)
  • Python web实战之细说Django的集成测试

    今天给大家分享一下Python Web开发——Django的集成测试,如何利用集成测试来提高代码质量、减少bug。 在开始介绍Django的集成测试之前,我们先来了解一下什么是集成测试。 集成测试 是软件开发中的一种测试方法,旨在验证不同组件或模块之间的交互是否正常。 对于Web开发

    2024年02月12日
    浏览(24)
  • Python web实战之 Django 的模板语言详解

    Python、web开发、Django、模板语言     作为 Python Web 开发的框架之一,Django 提供了一套完整的 MVC 模式,其中的模板语言为开发者提供了强大的渲染和控制前端的能力。本文介绍 Django 的模板语言。   Django 的模板语言是一种基于 HTML 的模板语言,它提供了丰富的标签和过滤器

    2024年02月14日
    浏览(35)
  • Python web实战之Django性能优化最佳实践详解

    大家好!今天分享如何优化使用Django应用的性能,使其在高并发、大数据量的情况下能够保持良好的性能。 数据库查询是Web应用中常见的性能瓶颈之一。 1.1 使用select_related和prefetch_related 在Django中,可以使用 select_related 和 prefetch_related 方法来优化数据库查询。这两个方法可

    2024年02月11日
    浏览(36)
  • Python web实战之Django 的 WebSocket 支持详解

     :Python, Django, WebSocket, Web   如何使用 Django 实现 WebSocket 功能?本文将详细介绍 WebSocket 的概念、Django 的 WebSocket 支持以及如何利用它来创建动态、响应式的 Web 应用。   1.1 什么是 WebSocket? 在 Web 开发中,当我们需要实现实时交互、即时通信或实时更新数据的功能时

    2024年02月12日
    浏览(29)
  • Python web实战之Django的AJAX支持详解

      :Web开发、Django、AJAX、前端交互、动态网页 今天和大家分享Django的AJAX支持。AJAX可实现在网页上动态加载内容、无刷新更新数据的需求。 AJAX(Asynchronous JavaScript and XML)是一种在网页上实现异步通信的技术。通过AJAX,我们可以在不刷新整个网页的情况下,与服务器

    2024年02月13日
    浏览(29)
  • Python web实战之细说Django的中间件

                      🔑 :Python Web 开发、Django、中间件 今天分享Python Web开发中的一个重要成员:Django的中间件。介绍中间件的概念、作用及其在实战中的应用。 在Python Web开发中,中间件(Middleware)是指位于Web应用程序和Web服务器之间的一层软件组件。它能够拦截请

    2024年02月13日
    浏览(26)
  • Python web实战之Django的文件上传和处理详解

      :Python Web开发、Django、文件上传、文件处理 今天分享一下Django的文件上传和处理。 在开始深入讲解Django的文件上传和处理之前,先了解一下文件上传的基本原理。当用户选择要上传的文件后,该文件会被发送到服务器端,并存储在服务器的某个位置上。我们需要在

    2024年02月13日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包