WEB开发三步曲之二-Python-django-基于docker的项目开发

前导工作:WEB开发三步曲之一-Ubuntu 18开发环境安装

搭一个起始环境,作后端django开发,目标:
-基于docker的django2环境
-基于docker的mkdocs环境写给前端文档参考
-基于docker的mysql数据庫
假定映射的容器卷路径:myapp,项目名myPrj,应用名myApp

一、创建和初始化项目

1、创建新python虚拟环境

安装django和相关的包,与要制作的docker镜像版本一致,之后因为使用容器内的django,这里只用其创建初始项目再映射到容器中。(在容器中创建会导致在主机中的相关文件夹为docker组权限,不方便后续编辑)

2、创建本地工作目录和第一个项目

mkdir base
cd base
mkdir mysql_data
mkdir docs # mkdocs文件
mkdir .envs # 环境变量文件
mkdir static # static_root
mkdir statics # 存放公用静态文件
mkdir templates # 存放模板文件
django-admin startproject myPrj . #在本地创建,不建立下级目录
django-admin startapp myApp #第一个应用

3、目录及文件配置

当前目录将作为容器映射后的默认工作目录,即容器启动后命令的运行目录。配置文件见下节。
--base #django project本地目录
manage.py #django项目管理文件
--mysql_data #数据库存储外部路径(映射到mysql容器中,加入.gitignore或放在项目目录外)
--docs #mkdocs本地文档目录
--.envs # 系统环境变量配置目录,其中的*.env文件供docker-compose.yml中引用,或python的environ包引用
Dockerfile #镜像生成配置
docker-compose.yml #容器编排配置
requirements.txt # 供Dockerfile使用
mkdocs.yml #mkdocs配置
修改baseApp下的settings.py

import environ
env = environ.Env()
env.read_env('/myapp/.envs/django.env') # 内容见下面
DEBUG = env.bool('DEBUG') # 用环境变量文件控制
ALLOWED_HOSTS = ['*']
DATABASES = {
    'default': env.db('DATABASE_URL') # 用环境变量文件控制
    #也可每个应用单独设置数据庫,再设置数据庫路由
}
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
STATIC_URL = '/static/'
STATIC_ROOT = os.path.normpath(os.path.join(os.path.dirname(BASE_DIR), 'static'))
STATICFILES_DIRS = [os.path.join(BASE_DIR,'statics')]

拷入或编辑docker-compose.yml,Dockerfile,mkdocs.yml,requirements.txt到项目根目录,django.env和mysql.env到.envs目录
配置Pycharm的settings-->Docker,设置TCP socket连接为tcp://localhost:2375 (docker先配置好端口)
配置Pycharm的settings-->Prject:base的Project Interpreter,新增Docker Compose,选择配置文件为./docker-compose.yml,service为django
添加Path mappings:.:myapp
修改调试配置,Host:0.0.0.0,Port:80与docker-compose.yml内一致,Run browser中端口为映射端口为8080与docker-compose.yml一致

二、配置文件内容:Dockerfile和docker-compose.yml

1、mysql镜像,

1)用hub上现成的版本

2)容器编排

配置docker-compose.yml中的services加入mysql将mysql数据目录映射到容器中以持久保存

version: '3'
services:
    mysql:
        image: mysql:5.7.26
        container_name: myapp_mysql_container
        restart: always
        command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
        env_file:
            - .envs/mysql.env
        ports:
            - "3300:3306"
        volumes:
                - ./mysql_data:/var/lib/mysql

2、django和mkdocs镜像

Dockerfile配置,引入python安装requirements.txt中的所有包

FROM python:3.7
ADD requirements.txt /tmp/requirements.txt
RUN pip install -r /tmp/requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
EXPOSE 8000
WORKDIR /myapp
# 开发环境
CMD  python manage.py runserver 0.0.0.0:80
# 生产环境
# Migrates the database, uploads staticfiles, and runs the production server
# CMD python manage.py makamigrations && \
#    python manage.py migrate && \
#    python manage.py collectstatic --noinput && \
#    gunicorn --bind 0.0.0.0:8000 --access-logfile - piedpiper.wsgi:application

参考requirements.txt:

# Core
pytz==2018.9
Django==2.0
gunicorn==19.9.0
django-environ==0.4.5
urllib3==1.25.3
django-cors-headers==3.1.1
transitions==0.7.1
django-rest-framework-rules==1.0.0
drf-access-policy==0.5.1

# Model Tools
django-model-utils==3.1.2
mysqlclient==1.4.2.post1
PyMysql==0.9.3
django-mysql==3.2.0
django-mptt==0.10.0
django-simple-history==2.8.0

# Rest apis
djangorestframework==3.9.1
djangorestframework_simplejwt==4.4.0
Markdown==3.0.1
django-filter==2.1.0
drf-nested-routers==0.91

# Developer Tools
mkdocs==1.0.4

# Static and Media Storage
django-storages==1.7.1
boto3==1.9.93

1)mkdocs容器编排

mkdocs文档服务镜像,用于给前端提供文档说明,使用与django相同的镜像(Dockerfile),如不使用mkdocs服务,有关接口的说明可参考Django RESTful framework中的Browsable属性,让Browsable API通过浏览器访问时显示参考信息(Needs markdown module)。
docker-compose.yml中配置
接上面services:

    documentation:
        restart: always
        build: .
        container_name: myapp_docs
        command: "mkdocs serve"
        volumes:
        - .:/myapp
        ports:
        - "8081:80"

command会覆盖Dockerfile中的CMD

2)django容器编排

docker-compose.yml中配置
接上面services:

    django:
        build: .
        container_name: myapp_container
        env_file:
            - .envs/django.env
            - .envs/mysql.env
        depends_on:
            - mysql
        volumes: 
            - .:/myapp
        ports: 
            - 8080:80
        command: >
            bash -c   "python wait_db_ready.py
                                python manage.py makemigrations
                                python manage.py migrate
                                python manage.py initdata
                                python manage.py collectstatic --noinput
                                python manage.py runserver 0.0.0.0:80"

command会覆盖Dockerfile中的CMD
所引用的envs中环境变量配置:
django.env

# django_secret_key
DJANGO_SECRET_KEY=
# DEBUG
DEBUG=True
# admin with python manage.py createsuperuser
ADMIN_USER=admin
ADMIN_PASSWORD=Admin123456
ADMIN_EMAIL=admin@admin.com
# general
MYSQL_CHECK_TIMEOUT=30
MYSQL_CHECK_INTERVAL=1
# db_url
# DATABASE_URL=mysql://username:password@host:port/database_name?charset=utf8mb4&other=other_config
# DATABASE_URL=mysql://<MYSQL_USER>:<MYSQL_PASSWORD>@mysql/<MYSQL_DATABASE>?charset=utf8mb4
DATABASE_URL=mysql://myapp:Myapp123@myapp_mysql_container/myapp?charset=utf8mb4

mysql.env

# root password
MYSQL_ROOT_PASSWORD=urpwd
# user
MYSQL_USER=myapp
# user password
MYSQL_PASSWORD=urpwd
# db_name
MYSQL_DATABASE=myapp
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容