那年那日那朵花

".......(o´ω`o)......"

用docker部署django

2016-12-07 20:39 docker

实验下使用docker跑django应用。我一般部署都是按照nginx + gunicorn + django的方式部署。现在尝试下使用将gunicorn和django做成docker镜像,然后将代码通过卷挂载载入容器中来部署django应用。

首先django是有官方镜像的。https://hub.docker.com/_/django/可以先看下说明,说明还是蛮详细的。

先把django应用打个包考到一个目录下解包。然后cd到django的主目录下(就是有manage.py的目录),创建requirements.txt。可以通过在真实环境中** pip freeze > requirements.txt **将所需要的python模块罗列出来。这里其实我就需要gunicorn就可以了。

然后执行下面的命令就可以创建一个基本的django应用了。

** docker run --name testdjango-app -v "$PWD":/usr/src/app -w /usr/src/app -p 8000:8000 -d django:python2 bash -c "pip install -r requirements.txt && gunicorn -b0.0.0.0:8000 mydj.wsgi:application" **

这里有前提,首先是用的官方的django镜像tag是python2

具体的Dockerfile是这样的:

FROM python:2.7-slim

RUN apt-get update && apt-get install -y \
        gcc \
        gettext \
        mysql-client libmysqlclient-dev \
        postgresql-client libpq-dev \
        sqlite3 \
    --no-install-recommends && rm -rf /var/lib/apt/lists/*

ENV DJANGO_VERSION 1.10.4

RUN pip install mysqlclient psycopg2 django=="$DJANGO_VERSION"
  • 这个docker镜像是以python:2.7-slim为基础创建的
  • 这个docker镜像里面已经包含了django应用所要用的数据库依赖包了,但只包含mysql、postgresql、sqlite。
  • 上面的docker run命令只有映射本机和容器间8000端口的映射而没有数据库网络连接的映射,那是因为我这个django应用是用的sqlite。。。只是一个文件包含在程序打包里面了。
  • 这个默认的django镜像用的版本是1.10.4,而实际情况可能用到的是低版本的可能存在不兼容。
  • 所有django应用所需要的python模块要写在requirements.txt中,我这测试用的就gunicorn==19.4.5一项。
  • 启动完毕后,就会启动docker容器,只要访问主机的8000端口就能访问这个django应用了。

所以针对有些问题,最好是自己写Dockerfile,可以包含一些定制化的配置。

比如说通过自建Dockerfile,先将django版本设置为开发用的低版本,然后在dockerfile中安装好gunicorn而不需要在** pip install -r requirements.txt **

我先贴下我修改过的Dockerfile。

FROM python:2.7-slim

RUN apt-get update && apt-get install -y \
        gcc \
        gettext \
        mysql-client libmysqlclient-dev \
        postgresql-client libpq-dev \
        sqlite3 \
    --no-install-recommends && rm -rf /var/lib/apt/lists/*

ENV DJANGO_VERSION 1.8.14
ENV GUNICORN_VERSION 19.4.5

WORKDIR /usr/src/app
EXPOSE 8000

RUN pip install mysqlclient psycopg2 django=="$DJANGO_VERSION" gunicorn=="$GUNICORN_VERSION"

CMD ["gunicorn", "-b0.0.0.0:8000", "mydj.wsgi:application"]

创建好Dockerfile文件后在Dockerfile文件的当前目录下通过执行** docker build -t mydjimage . ** 注意这里有个点,就可以创建一个叫mydjimage 的docker镜像。

然后一样的cd到django应用的主目录下。启动

** docker run --name mybuilddj -v "$PWD":/usr/src/app -p 8001:8000 -d mydjimage **

这样就将本机8001端口映射到容器的8000端口即django应用上了。

通过卷来将django程序在外部挂载的方式载入容器中比较灵活。代码可以通过版本控制来管理,每次更新后重启容器就可以了。当然也可以将代码打到docker镜像中,只是这样对应经常变更的程序来说不太好。

然后前端的nginx也可以用docker容器来跑。可以将nginx用到的配置文件和静态页面也用卷来从外部读取,然后做好容器间的通信就可以了。注意配置文件中的include /etc/nginx/conf.d/mime.types;也要用卷挂载出来。不然不会解析css,js等静态页面。

Cloudhu 个人随笔|built by django|

沪ICP备16019452号-1