使用docker-compose部署nginx+gunicorn+mariadb的django应用

本文介绍了如何使用docker-compose来部署一个基于django的博客应用,涉及组件包括gunicorn、mariadb和nginx。在部署过程中,详细说明了配置mysql容器、django-blog容器和nginx容器的步骤,以及docker-compose.yaml文件的编写和启动服务组的命令。
摘要由CSDN通过智能技术生成

我们来使用 docker-compose 并基于 gunicorn + mariadb + nginx 部署一个简单的 django 博客应用;

1. docker-compose 项目的组织目录

.                                              
├── django-blog                                
│   ├── blogproject                            
│   │   ├── __init__.py                        
│   │   ├── settings.py                        
│   │   ├── urls.py                            
│   │   └── wsgi.py                            
│   ├── Dockerfile                             
│   ├── manage.py                              
│   ├── requirements.txt                       
│   └── static                                 
├── docker-compose.yaml                        
├── mysql                                      
│   ├── conf                                   
│   │   └── django-blog.cnf                    
│   └── data                                   
└── nginx                                      
    ├── conf                                   
    │   └── mysite.template                    
    ├── log                                    
    └── ssl     

2. 构建 mysql 容器

mysql/
├── conf
│   └── django-blog.cnf
└── data
  • 配置数据库使用utf8mb4编码:

    # mysql/conf/django-blog.cnf
    
    [client]
    default-character-set = utf8mb4
    
    [mysql]
    default-character-set = utf8mb4
    
    [mysqld]
    character-set-client-handshake = FALSE
    character-set-server = utf8mb4
    collation-server = utf8mb4_unicode_ci
    init_connect='SET NAMES utf8mb4'
    
  • docker-compose.yaml 中 mysql service 的配置:

    db:
        image: mariadb:10.4
        container_name: django-blog-db
        restart: always
        environment:
            MYSQL_ROOT_PASSWORD: <root 用户的密码>
            MYSQL_DATABASE: <容器启动时,自动创建的数据库名>
            MYSQL_USER: <容器启动时,自动创建的数据库用户,其对上述数据库拥有全部的权限>
            MYSQL_PASSWORD: <上述数据库用户的密码>       
        volumes:
            - ./mysql/conf:/etc/mysql/conf.d  # 挂载自定义配置目录,即上述的 mysql/conf/django-blog.cnf 中的配置
            - ./mysql/data:/var/lib/mysql  # 挂载数据目录
            - ./mysql/log:/var/log  # 挂载日志目录
    
  • 为什么不用 mysql,而是使用 mariadb ?

    mysql:latest 默认的认证方式变为caching_sha2_password,直接使用会报错:Authentication plugin 'caching_sha2_password' cannot be loaded

    使用 mariadb:latest 或者使用 mysql:5.7 是没有问题的;

    关于这个问题的讨论可以参考如下链接,里面提到一些规避的方法:

3. 构建 django-blog 容器

django-blog/
├── blogproject
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── Dockerfile
├── manage.py
├── requirements.txt  # 包依赖
└── static  # python manage.py collectstatic 命令收集到的静态文件的目录
  • 编写 Dockerfile:

    FROM python:3.7-alpine  # 使用 alpine 版本,精简 image 体积;
    RUN echo "https://mirrors.ustc.edu.cn/alpine/latest-stable/main" > /etc/apk/repositories \
        && apk update \
        # alpine 中 mariadb 代替了 mysql: <https://alpinelinux.org/posts/Alpine-3.2.0-released.html>
        && apk add mariadb-dev build-base
    RUN mkdir /code
    WORKDIR /code
    COPY requirements.txt ./
    RUN pip install --no-cache-dir -r requirements.txt
    

    其中, requirements.txt 内容为:

    -i https://mirrors.aliyun.com/pypi/simple
    Django==2.2.5
    django-haystack==2.8.1
    gunicorn==19.9.0
    jieba==0.39
    Markdown==3.1.1
    mysqlclient==1.4.4
    Whoosh==2.7.4
    
  • docker-compose.yaml 中 web service 的配置:

    web:
        build: django-blog/
        image: django-blog:2.2.5  # 构建后,image 的名字,2.2.5是目前使用的 django 版本
        container_name: django-blog-web
        restart: always
        depends_on:
            - db
        volumes:
             - ./django-
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值