使用Docker容器化部署实践之Django应用部署(一)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 使用Docker容器化部署实践之Django应用部署(一)

周末,在一个技术群里面有同学在问Django开发部署,所以今天给大家分享一下基于Docker下Python Django框架的部署。

首先我们要知道Django常见的两种部署方式:

  1. Django + Nginx + uWSGI
  2. Django+ Nginx + Gunicorn

限于篇幅情况,今天我们主要聊第一种 uWSGI 配合 Nginx的部署方式。


首先我们要知道我们发布上线的步骤,这里面我们以Docker容器化为例子:

1.通过自动化脚本,把代码同步到线上服务器(通过fabric或者ansible等)

2.重启supervisord(进程管理工具,通过uWSGI 控制Django服务启动)

3.通过docker-compose 更新docker镜像(如果有镜像有变更,比如装了包到容器里面)

4.做数据表migrate,比如数据表进行了变更(如果是关系型数据库)

5.通过docker-compose重启docker容器


这上面5个步骤,只要配置好了对应的配置文件(nginx,uWSGI,supervisor等),我们就能通过一个发布脚本进行一键进行代码发布上线。

下面分别简单阐述一下,Nginx,Supervisor,uWSGI,Docker-compose等配置文件及用法。


Nginx

Nginx是一个高性能的HTTP和反向代理服务器。

我们要进行服务部署,首先我们Nginx需要进行配置好对应的配置文件。

把配置文件放在/etc/nginx/sites-enabled/ 目录下面,这儿你也可以放在项目里面通过ln 进行链接过去。

之所以这样配置是因为我们主配置文件/etc/nginx/nginx.conf是include /etc/nginx/sites-enabled/ 目录的原因。

这里我们配置文件命名为 api.yourdomain.com.conf 配置文件如下

# api.yourdomain.com.conf
server {
    listen 80;
    charset utf-8;
    server_name api.yourdomain.com;  # DNS解析到当前nginx服务器
    location / {
        proxy_pass  http://127.0.0.1:9527; # 代理的端口
        proxy_pass_header Server;
        proxy_set_header  Host $host;
        proxy_set_header  X-Real-IP $remote_addr;
        proxy_set_header  X-Scheme $scheme;
    }
    access_log /test/log/nginx.access.log;
    error_log /test/log/nginx.error.log;
}


uWSGI

配置好了nginx,接下来就是uWSGI配置了。uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。

后面我们会说uWSGI 和 Gunicorn 他们都是实现了WSGI server协议的服务器。

通过uWSGI我们可以获得更好的服务性能,详细日志,多应用管理等多种定制功能。下面我们简单来看下配置文件。


# /yourdir/uwsgi.ini 
[uwsgi]
chdir     = /yourdir/  # 执行目录
module    = yourproject.wsgi # wsgi文件
master    = true
processes = 1  # 一般越多进程处理能力越强,由于这里是测试设为1
vacuum    = true
http      = 0.0.0.0:9527
# virtualenv = /home/test/project/python/yourproject/venv
这里我们用了docker就不用考虑virtualenv情况
env = DJANGO_SETTINGS_MODULE=yourproject.settings
harakiri  = 30 # 当进程被卡住的时间超过特定的秒数后就销毁这个进程
no-orphans  # 在没有主进程的情况下自动结束工作进程。


为了方便展示以及解读,这里面我删除精简了一些配置,具体线上配置更为复杂一些,具体情况请具体进行配置。


另外这里面我们需要知道uWSGI 是一个语言无关的服务器,这里面我们可以部署Django,也可以部署Flask,Web2py等等。你这儿可以把他等同 Python manage.py runserver 这条命令,区别在一个在测试环境和线上环境。


Supervisor

supervisor我在Linux系列文章第一篇Linux系列开坑记(一)-常用的3个命令,就分享过了,这里直接列一个配置文件出来。


[supervisord]
nodaemon=true
logfile=/data/log/supervisord.log
pidfile=/var/run/supervisord.pid
[program:your_app_name]
process_name=app%(process_num)s
command=uwsgi -i /yourdir/uwsgi.ini --touch-reload=/yourdir/uwsgi.ini
directory=/yourdir ;执行命令时切换工作目录
user=sitin                 ; 使用sitin来启动进程
stopsignal=HUP
autostart = true
autorestart=true  ;自动重启
redirect_stderr = true  ;重定向日志
stdout_logfile = /data/log/stdout-%(program_name)s.log
logfile_maxbytes=300MB
logfile_backups=5
numprocs=3  ;启动3个 9527,9528,9529
numprocs_start=9527 ; 从9527开始


这里面supervisor控制服务uWSGI进行服务启动,我们可以进行start,restart,stop等操作。


Docker-compose


Docker-compose是进行容器编排,方便我们进行容器管理。我们配置好了上面的文件,再来看下docker-compose的配置文件,这里同样我在之前docker文章进行分享过了,参考 Docker容器化部署实践Docker Compose

version: "3"  # 注意版本号
services:  # 一个应用的容器,可以包括多个相同镜像容器实例
  dev:
    image: hub.yourdomain.com/test:1.0 # 镜像地址
    command: supervisord -c /yourdir/supervisord.conf # 容器执行命令
    container_name: test  # 容器名
    restart: always  
    volumes:
      - ./docker:/data  # 挂载地址
    ports:
      - "9527:9527" #端口
    environment:
      - PYTHONPATH=/data
      - XXX_API_SETTINGS=XXX.config.dev
      - DJANGO_SETTINGS_MODULE=yourproject.settings
    network_mode: bridge
    extra_hosts: # 配置额外的host名称
      - "test.yourdomain.com:127.0.0.1"
    external_links: # 链接到外部容器
      - redis:redis 
      - mysql:mysql

看到这儿想必有同学已经有些晕了,我们再来理一下这里的逻辑。

  1. 我们通过docker-compose配置文件,进行控制supervisor启动
  2. Supervisor控制uWSGI端口服务启动
  3. uWSGI把整个Django应用拉动起来(这里类似python manage.py runserver)
  4. 而我们浏览器请求到达Nginx之后被反向代理到uWSGI端口服务上面,从而访问到我们Django应用。
  5. 至此就是整个应用的部署配置(除了没有自动化发布脚本以外)


最后

通过上面的配置文件,我们介绍了整个Django应用发布过程的涉及到的主要步骤,实际情况会稍微复杂点儿。更多详细优化参数大家可以去进行了解。今天我们uWSGI的部署就先到这儿,下一期我们再进行分享Gunicorn部署方式。

容器化部署实践,我打算从基础操作到实战应用以一个系列进行分享,今天是第四篇docker部署Django应用,后期我将持续分享更多相关内容,从容器化入门使用到部署实践编排技术,欢迎大家持续进行关注。

相关文章
|
6天前
|
弹性计算 运维 持续交付
探索Docker容器化技术及其在生产环境中的应用
探索Docker容器化技术及其在生产环境中的应用
38 5
|
1天前
|
负载均衡 网络协议 开发者
掌握 Docker 网络:构建复杂的容器通信
在 Docker 容器化环境中,容器间的通信至关重要。本文详细介绍了 Docker 网络的基本概念和类型,包括桥接网络、宿主网络、覆盖网络和 Macvlan 网络等,并提供了创建、管理和配置自定义网络的实用命令。通过掌握这些知识,开发者可以构建更健壮和灵活的容器化应用,提高应用的可扩展性和安全性。
|
2天前
|
运维 Ubuntu Linux
深入理解并实践Docker容器化技术
深入理解并实践Docker容器化技术
21 6
|
7天前
|
运维 Docker 微服务
掌握 Docker Compose:简化你的多容器应用部署
在微服务架构和容器化技术普及的今天,管理多容器部署变得颇具挑战。Docker Compose 通过一个 YAML 文件定义和运行多容器应用,简化了部署和运维。本文介绍其基本概念、使用方法及优势,包括服务、项目、卷和网络等核心概念,并提供从安装到管理服务的详细步骤,助你轻松掌握 Docker Compose,提高开发效率和应用运维质量。
|
6天前
|
Devops jenkins 持续交付
DevOps实践:构建和部署一个Docker化的应用
【9月更文挑战第14天】在当今快节奏的软件开发领域,DevOps已经成为提升效率、加速交付的关键。本文将引导你理解DevOps的核心概念,并通过一个实际的示例—构建和部署一个Docker化的应用—来深入探讨其实践方法。我们将从简单的应用出发,逐步实现Docker容器化,并最终通过CI/CD流水线自动化部署过程。这不仅是对DevOps流程的一次实操演练,也是对现代软件开发理念的一次深刻体验。
|
5天前
|
Prometheus 监控 Cloud Native
docker安装prometheus+Granfan并监控容器
【9月更文挑战第14天】本文介绍了在Docker中安装Prometheus与Grafana并监控容器的步骤,包括创建配置文件、运行Prometheus与Grafana容器,以及在Grafana中配置数据源和创建监控仪表盘,展示了如何通过Prometheus抓取数据并利用Grafana展示容器的CPU使用率等关键指标。
|
6天前
|
Cloud Native 持续交付 Docker
探索容器化技术Docker的奥秘
探索容器化技术Docker的奥秘
23 3
|
23天前
|
Cloud Native 持续交付 Docker
云原生之旅:Docker容器化实战指南
【8月更文挑战第29天】本文将引领你进入云原生技术的世界,以Docker容器化为切入点,深入浅出地介绍如何利用Docker进行应用的打包、部署及管理。我们将通过实际代码示例,一步步展示Docker镜像的构建过程,以及如何运行和管理这些容器。无论你是初学者还是有一定经验的开发者,都能从中获得宝贵的知识和实操经验。
|
18天前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
18天前
|
应用服务中间件 nginx Docker
Docker同一台宿主机容器通信-通过容器名称互联
本文详细介绍了如何通过容器名称实现同一宿主机上容器间的互联,并提供了实战案例。首先,文章解释了容器间通过自定义名称访问的原理,随后演示了创建并连接Tomcat与Nginx容器的具体步骤。此外,还讨论了配置中可能出现的问题及解决方案,包括避免硬编码IP地址和使用自定义容器别名来增强系统的灵活性与可维护性。通过这些实践,展示了如何高效地配置容器间通信,确保服务稳定可靠。
23 1
Docker同一台宿主机容器通信-通过容器名称互联

相关产品

  • 容器服务Kubernetes版