一套使用 Docker 部署 Django 应用的方案中的几个问题求解


这几天研究了一下 Docker 文档和参考了一些使用 Docker 部署 Django 项目的文章,综合各种方法后我给出了如下的一套方案,大家看看是否合理。以及其中的几个关键问题该如何解决?

第一步:服务器安装 Docker

这没什么说的,参考 官方安装指南

第二步:将 Dockerfile,docker-compose.yml 和代码仓库拉取到服务器

因为不想推送到 docker 云,直接本地 build,我的项目目录结构如下:

我有两个 Dockerfile,一个是运行 Django 镜像,一个是 Nginx 的镜像,在配置中把代码打包到了 Django 镜像里。

第三步:build 和启动容器

接下使用 docker-compose build 和 up 构建和运行容器,然后在 django 容器中要做的事情有:

  1. 收集静态文件,会收集到 /static 文件夹下
  2. 迁移数据库,会创建一个 db.sqlite3 文件在容器中代码的根目录

这里有两个问题:

  1. 如何让 nginx 容器访问到 django 容器中的 /static 文件夹,这样 nginx 才能处理静态文件请求
  2. 如何把容器中的 db.sqlite3 文件挂到主机下,这样即使容器挂了数据库文件还在

我目前的 docker-compose.yml 文件如下,无法解决如上问题

version: '2'

services:
  django:
    build:
      context: .
      dockerfile: ./compose/django/Dockerfile
    command: /gunicorn.sh
    volumes:
      - .:/app

  nginx:
    build: ./compose/nginx
    depends_on:
      - django
    volumes_from:
      - django
    ports:
      - "0.0.0.0:80:80"

如果上述问题能够解决,那么部署过程就变得简单了,扔给一台新的服务器,只要 1. 安装 docker 2. 从 github 仓库拉取代码到服务器 3. docker-compose build 和 up 运行容器,部署完成

希望有经验的朋友能给一些指点和思路,感激不尽!

  • 8 条回复 | 2 人参与
  • mihello # 1

    先说第二点,db文件。这里可以有两个方案: 1. 将容器的某个目录挂载到宿主机。

    docker run -d -v /home/test:/home/django-project/db --name django-server
    

    意思是将容器的/home/django-project/db 目录挂载到宿主机的/home/test

    1. 就是创建数据卷容器 所谓数据卷容器,就是纯粹用来当存储的容器,容器建立后,无论启动或者停止,都可以提供存储功能,其实就是一个通过docker隔离后的系统目录,所以无需数据卷容器启动就可以通过服务。
    docker run -d  -v /home/docker-container-volume --name datacontainer test/centos7   echo Just a data container
    

    然后创建django容器的时候就可以,指定数据卷容器

    docker run -d --volumes-from datacontainer --name django-server xxxx/django
    

    这样django-server这个容器启动后,就自动挂载数据卷容器的目录到本地。

    上面两者区别在于,你是否需要在容器之间提供共享数据,需要则可以用数据卷容器。否则,挂载宿主目录足矣。

    其实追梦第一点问题,也是同样的道理。

  • mihello # 2

    下面的 1. 应该是 --> 2.

  • mihello # 3

    具体可以参考: https://yeasy.gitbooks.io/docker_practice/content/data_management/container.html

    这里都是很多基础详细的用法。

  • @mihello 嗯,这本书非常棒,我也看了。能否在 Dockerfile 中做配置呢?因为我是直接通过 docker-compose up 启动的容器。

  • mihello # 5

    可以在dockerfile里面设置VOLUME 命令。不过有个缺点,就是最后映射到宿主机的目录是类似: /var/lib/docker/volumes/ff318e056772876901ef74f5b8841e0b3cb106a49c0a5e52505e88776c5da55e 这样一窜东西。没法指定具体的宿主机路径。

  • mihello # 6

    可以通过 docker inspect container_id 命令查看最终挂载的路径

  • @mihello 嗯,目前基本解决了。

  • mihello # 8

    @追梦人物 great!

添加一条新回复
登录 或者 注册 后发表回复