使用 Docker 让部署 Django 项目更加轻松( 三 )
接下来定义了 2 个 services,一个是应用服务 hellodjango_blog_tutorial,一个是 nginx 服务 。
build: context: . dockerfile: compose/production/django/Dockerfile告诉 docker-compose,构建容器是基于当前目录(yml 文件所在的目录),且使用的镜像是 dockerfile 指定路径下的镜像文件 。
image 和 container_name 分别给构建的镜像和容器取个名字 。
working_dir 指定工作目录 。
volumes: - database:/app/database - static:/app/static
- 同时这里要注意,数据卷只能映射文件夹而不能映射单一的文件,所以对我们应用的数据库来说,db.sqlite3 文件我们把它挪到了 database 目录下 。因此我们要改一下 django 的配置文件中数据库的配置,让它正确地将数据库文件生成在项目根目录下的 database 文件夹下:
- 容器启动时读取 .envs/.production文件中的内容,将其注入环境变量 。
- 我们创建一下这个文件,把 secret_key 写进去 。
- 注意将这些包含敏感信息的文件加入版本控制工具的忽略列表里,防止一不小心推送到公开仓库供大众观光 。
- 暴露容器内的 8000 端口并且和宿主机的 8000 端口绑定,于是我们就可以通过宿主机的 8000 端口访问容器 。
nginx 服务容器也类似,只是注意它从数据卷 static 中取静态文件并映射到 nginx 容器内的 /apps/hellodjango_blog_tutorial/static,所以我们在 nginx 的配置中:
location /static { alias /apps/hellodjango_blog_tutorial/static;}这样可以正确代理静态文件 。
万事具备,在本地执行一下下面的两条命令来构建容器和启动容器 。
docker-compose -f production.yml builddocker-compose -f production.yml up此时我们可以通过域名来访问容器内的应用,当然,由于 Nginx 在本地环境的容器内运行,需要修改一下 本地 hosts 文件,让域名解析为本地 ip 即可 。
如果本地访问没有问题了,那么就可以直接在服务器上执行上面两条命令以同样的方式启动容器,django 应用就顺利地在服务上部署了 。
开发环境
既然线上环境都使用 Docker 了,不妨开发环境也一并使用 Docker 进行开发 。开发环境的镜像和 docker-compose 文件比线上环境简单一点,因为不用使用 nginx 。
开发环境的镜像文件,放到 composelocal 下:
FROM python:3.6-alpineENV PYTHONUNBUFFERED 1RUN apk update# Pillow dependencies && apk add jpeg-dev zlib-dev freetype-dev lcms2-dev openjpeg-dev tiff-dev tk-dev tcl-devWORKDIR /appRUN pip install pipenv -i https://pypi.douban.com/simpleCOPY Pipfile /app/PipfileCOPY Pipfile.lock /app/Pipfile.lockRUN pipenv install --system --deploy --ignore-pipfileCOPY ./compose/local/start.sh /start.shRUN sed -i 's/r//' /start.shRUN chmod +x /start.sh要注意和线上环境不同的是,我们没有把整个代码 copy 到容器里 。线上环境代码一般比较稳定,而对于开发环境,由于需要频繁修改和调试代码,如果我们把代码 copy 到容器,那么容器外做的代码修改,容器内部是无法感知的,这样容器内运行的应用就没法同步我们的修改了 。所以我们会把代码通过 Docker 的数据卷来管理 。
start.sh 不再启动 gunicorn,而是使用 runserver 启动开发服务器 。
/bin/shpython manage.py migratepython manage.py runserver 0.0.0.0:8000然后创建一个 docker-compose 文件 local.yml(和 production.yml 同级),用于管理开发容器 。
version: '3'services: djang_blog_tutorial_v2_local: build: context: . dockerfile: ./compose/local/Dockerfile image: django_blog_tutorial_v2_local container_name: django_blog_tutorial_v2_local working_dir: /app volumes: - .:/app ports: - "8000:8000" command: /start.sh注意我们将整个项目根目录下的文件挂载到了 /app 目录下,这样就能容器内就能实时反映代码的修改了 。
线上部署
如果容器在本地运行没有问题了,线上环境的容器运行也没有问题,因为理论上,我们在线上服务器也会构建和本地测试用的容器一模一样的环境,所以几乎可以肯定,只要我们服务器有 Docker,那么我们的应用就可以成功运行 。
首先在服务安装 Docker,安装方式因系统而异,方式非常简单,我们以 centos 7 为例,其它系统请参考 Docker 的官方文档[2] 。
推荐阅读
- 三明治机使用方法及注意事项 三明治机用完需要清洗吗
- 动力|是什么让我经历了几次大跳槽
- 粗鲁不能让茶叶盘点春节前后有趣的茶叶习俗
- 好电视的意义:谁能让720P电影看出4K味儿
- 本命年红绳可以让对象买吗,本命年红绳要异性送吗
- 泡沫轴的使用 泡沫轴可以用其他代替吗
- 梦见有人要进门我不让进 梦到有人想强行破门而入但没能进入
- 中国古代最早使用茶叶可能始于四川西南部的
- Word中实用的一些快捷键使用
- 十大名茶的传说让你的茶更美味