利用python+django+docker快速搭建一个项目
环境配置
- python:- version-3.6.3- # 检查python版本 
 $ python --version
 Python 2.7.10 # 系统已经装了,但是更新版本敲麻烦的,我们用brew重装吧
 # brew install python会安装2.7的版本,我们用下面的命令
 $ brew install python3 # 这样之后命令行就要用'python3'才行了- 如果遇到 - brew的更新,就像这样→- Updating Homebrew...,可以- Ctrl+c跳过
- django:- version-2.0.6- # python3 >= 3.4 已经包含了pip,可以直接使用 
 $ pip install django
- docker
构建一个项目
确认django版本
在你的终端打开python
| $ python3 # 重要!之后所有的 python3 指令,会使用 python 代替,如有必要,自行替换 | 
然后在python命令行界面输入
| import django | 
新建一个项目
在你的终端输入下面的命令
| $ django-admin startproject mysite # 项目名自取,只允许数字、字母和'_' | 
新建的项目的结构看起来像这样:
| mysite/ | 
现在,你可以尝试启动这个项目了,不需要任何页面和接口或者是模型。
执行下面的命令:
| $ python manage.py runserver | 
你会看到:
| June 15, 2018 - 15:50:53 | 
点击 http://127.0.0.1:8000/ 打开,看到一个小火箭起飞的页面,就说明应用已经启动。
新建一个模块
django建议一个项目按照功能划分模块
让我们开始新建一个模块
| $ python manage.py startapp polls # 负责 投票'poll' 功能的模块 | 
新的模块看起像这样:
| polls/ | 
如果要开始写你的第一个接口,请先在polls/下新建一个urls.py文件
| polls/ | 
在 views.py 中添加 index 方法
| # polls/views.py | 
在urls.py中加入下面的代码
| # polls/urls.py | 
这样polls项目的视图还依然不在mysite的管理中,需要在mysite目录(里面的那个)下的urls.py中添加
| # mysite/urls.py | 
现在,再次启动项目
| $ python manage.py runserver | 
如果出现
| You have 14 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions. | 
这样的警告,可以暂时无视掉。
打开 http://127.0.0.1:8000/polls/ 验证我们的第一个接口是否返回了正确的信息。
django数据库 API
本篇只讨论
django与mysql的集成
连接数据库
dejango自带了sqlite3数据库引擎
| DATABASES = { | 
要改成我们使用的mysql数据库
需要在mysite/settings.py中修改为
| DATABASES = { | 
安装mysql的引擎
| $ pip install pymysql | 
在mysite/__init__.py中添加
| # mysite/__init__.py | 
备注:因为出现了
| django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module. | 
这样的错误信息而去安装mysqlclient的肯定不止我一个……
至于为什么不这么做,参见一下这篇文章:centos下安装python3.x+django的mysql驱动
里面提到,mysql-python也是没用的
确保数据库连接没问题后,先把django自带的在settings.py中包含的一堆模块跑起来
| INSTALLED_APPS = [ | 
执行
| $ python manager.py migrate | 
这会在你的数据库中创建若干数量的表,用于用户、组以及权限的管理
这时运行项目,就不会再报警了
| $ python manage.py runserver | 
这时打开 http://127.0.0.1:8000/admin/ ,会有一个Django administration的管理员登录界面

我们来创建一个用户
| $ python manage.py createsuperuser | 
然后依次填入
| Username (leave blank to use '系统用户名'): admin # 就叫 admin 吧 | 
现在可以登录了,不过只能管理用户和权限而已,暂且不管。
创建模型
在models.py中创建模型
| # polls/models.py | 
详细的Model Fields可以参见文档:Model field reference
激活模型
首先需要将我们的polls纳入管理,在settings.py中添加
| # mysite/settings.py | 
这样migrate会将我们的polls中的模型也纳入管理对象中
在终端执行
| $ python3 manage.py makemigrations polls # polls 指定模块,可不加,对应全部模块 | 
我们看一下,生成的文件
| # polls/migrations/0001_initial.py | 
可以理解为使用migration的CreateModel()创建模型
怎么创建的呢?
接下来执行
| $ python manage.py sqlmigrate polls 0001 # 0001 是上面生成的文件的代号 | 
输出
| BEGIN; | 
实质上就是生成了一堆sql用于创建我们的模型对应的表结构
上面的内容是预览,要想让sql生效
执行
| $ python manage.py migrate # 正式执行,这个命令会操作数据库 | 
这时,数据库会多出两个表Question和Choice,django模型和数据库模型的映射就正式建立了
后面对models.py的修改,可以通过
| $ python3 manage.py makemigrations | 
来更新数据库模型
管理模型
将模型纳入
admin模块进行界面化管理
首先,在polls/admin.py中添加
| # polls/admin.py | 
重启服务,登录Django administration

就可以管理Question了,很棒吧!
Docker部署项目
Dockerfile
在项目根目录下新建一个Dockerfile:
| # 以`python`为基础镜像 | 
这时,你的项目结构应该是这样的:
| mysite/ | 
以下内容参考: Dockerfile 指令详解
简单解释一下上面的命令:
| FROM python:3 | 
FROM用来指定基础镜像,也就是我们这个docker image运行的基础环境。
在 Docker Store 上有非常多的高质量的官方镜像,有可以直接拿来使用的服务类的镜像,如 nginx、redis、mongo、mysql、httpd、php、tomcat 等;也有一些方便开发、构建、运行各种语言应用的镜像,如 node、openjdk、python、ruby、golang 等。可以在其中寻找一个最符合我们最终目标的镜像为基础镜像进行定制。
如果没有合适的,需要自己搭环境的,可以选择一些更为基础的基础镜像,如 ubuntu、debian、centos、fedora、alpine 等,这些操作系统的软件库为我们提供了更广阔的扩展空间。
| EXPOSE 8000 | 
EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P时,会自动随机映射 EXPOSE 的端口。
| RUN mkdir /app | 
RUN指令会在镜像中执行后面的命令,这里是创建了一个目录
WORKDIR 指令指定工作目录,这很重要,在Docker镜像构建过程中,每一行DOCKER指令都会构建一层镜像,所以每个指令的工作目录之间是不同步的,如:
| RUN cd /app | 
这两行命令式是无法在/app下创建world.txt文件的。
使用 WORKDIR 指令指定工作目录后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会帮你建立目录。
| COPY . /app | 
COPY的目的就是单纯的复制文件,从宿主机[源路径]到镜像容器指定的[目标路径]。具体参见:COPY 复制文件
| CMD python /app/manage.py runserver 0.0.0.0:8000 | 
CMD是容器启动命令,相当于在执行docker run时容器内执行的命令,这和RUN不同,RUN是基于镜像执行的构建,对镜像本身有影响,而CMD是给容器留了个启动脚本,作为docker run命令的执行脚本。
此外,CMD必须确保程序前台运行,不能以后台程序运行,具体参见:CMD 容器启动命令
构建镜像
首先,确保你的机器已经安装了Docker并已成功运行。
在终端输入
| $ docker --help | 
然后继续输入
| $ docker build --help | 
简单构建一个镜像
| $ docker build -t mysite:v1 . | 
这里一共是6行构建语句,所以一共需要构建6步:
| Sending build context to Docker daemon 99.33kB | 
注意,如果出现下面的提示,说明Docker未启动
| ERRO[0000] failed to dial gRPC: cannot connect to the Docker daemon. Is 'docker daemon' running on this host?: dial unix /var/run/docker.sock: connect: no such file or directory | 
构建成功后,查看镜像
| $ docker images | 
部署
镜像的构建是很快的,所以比较便捷的一种部署方法是:将源码推到服务器上,直接在服务器上构建Docker镜像来启动。
通过git将代码clone到服务器,执行上一步 构建镜像 ,然后查看docker run 的文档
| $ docker run --help | 
现在用刚才构建的镜像来运行一个docker容器
| $ docker run -it -d --name mysite --rm mysite:v1 | 
稍等一会儿,试试服务有没有启动成功:http://你的服务器ip:8000