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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容