利用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 djangodocker
构建一个项目
确认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