Docker 化 Django 应用程序

Posted

技术标签:

【中文标题】Docker 化 Django 应用程序【英文标题】:Dockerizing Django App 【发布时间】:2018-12-31 05:51:05 【问题描述】:

我有一个使用 Python 2.7.10 和 Django 1.10.3 的 Django 应用程序。我的 Dockerfile 包含以下内容:

   FROM python:2.7.10
   ENV PYTHONUNBUFFERED 1
   RUN mkdir /code
   WORKDIR /code
   ADD requirements.txt /code/
   RUN pip install -r requirements.txt
   ADD . /code/ 

我的 requirements.txt 包含以下内容:

   Django>=1.10,<2.0
   mysql-python

我的 docker-compose.yml 包含以下内容:

   version: '2'

   services:
     localhost:
       image: mysql
       restart: always
       environment:
         MYSQL_DATABASE: 'test'
         MYSQL_USER: 'test'
         MYSQL_PASSWORD: 'password'
     web:
       build: .
       command: python manage.py runserver 0.0.0.0:8000
       volumes:
         - .:/code
       ports:
         - "8000:8000"
       depends_on:
         - localhost

settings.py 包含数据库的以下内容:

DATABASES = 
'default': 
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'test',
    'USER': 'test',
    'PASSWORD': 'password',
    'HOST': 'localhost',
    'PORT': '3306',

我首先执行“% docker-compose build”,然后执行“% docker-compose up”并得到以下错误:

web_1 | django.db.utils.OperationalError:(2002,“无法连接 通过套接字'/var/run/mysqld/mysqld.sock'到本地MySQL服务器

我已经查看并尝试了 *** 上可用的解决方案,但没有成功。任何帮助将不胜感激。

【问题讨论】:

你的 settings.py 中有什么? 你需要链接mysql容器和django容器:***.com/questions/31035887/… MySQL 并没有在容器中运行。 MySQL 是否也必须 dockerized 才能与 dockerized Django 应用程序一起使用? 我已经从 settings.py 添加了用于数据库设置的 sn-p。 【参考方案1】:

任何帮助将不胜感激。

关于 MySql 和 Django App 的关系,您有三种可能的情况:

MySql 与 Django App (localhost) 驻留在同一容器中 MySql 位于与 Django App 不同的容器上(主机名不同,可以在不同的拓扑上处理 - 相同的子网或不同的等) MySql 位于 docker 生态系统之外(裸机、云等...)

从您的settings.pydocker-compose.yml 来看,您正在混合前两种方法。现在,由于您可以从 settings.py 引用外部 MySql 服务器,因此我认为这种情况微不足道,接下来,将 MySql 塞进与 Django App 相同的容器通常是个坏主意(如果您想单独扩展它们)所以这个答案将集中在第二种情况下(MySql 在单独的容器中),并且为简单起见,在同一个 docker-compose 文件上(您也可以将它们分开)。

docker-compose.yml 的重要摘录是:

version: '2'

services:

  # The Database
  database:
    image: mysql:5.6
    volumes:
      - dbdata:/var/lib/mysql
    environment:
      - "MYSQL_DATABASE=test_db"
      - "MYSQL_USER=test_user"
      - "MYSQL_PASSWORD=some_password"
      - "MYSQL_ROOT_PASSWORD=some_root_password"
    ports:
      - "33061:3306"
  container_name: "mysql_database"

  # Django App (taken from your example, added env vars as hint)
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    environment:
      - "DB_PORT=3306"
      - "DB_HOST=database"
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - database

volumes:
  dbdata:

使用这样的 docker-compose,您将拥有以下 setting.py 配置(请注意,HOST 正在为数据库容器获取 docker-compose service 条目的值,端口在容器内部而不是 docker-host 外部):

DATABASES = 
'default': 
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'test_db',
    'USER': 'test_user',
    'PASSWORD': 'some_password',
    'HOST': 'database',
    'PORT': '3306',

作为旁注,我们通常使用来自 Django App 文件的单独 docker-compose.yml 运行数据库,因为在通常的开发周期中,在 Django App 容器上调整/重新启动/崩溃某些东西的频率要比在数据库一个上要频繁得多,我们可以这样单独处理,加上这样一个单独定义的数据库可以处理几个不同的 DjangoApp,每个都有自己的容器。

【讨论】:

以上是关于Docker 化 Django 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

后端开发之光!Django应用的容器化部署实践~

后端开发之光!Django应用的容器化部署实践~

开源web框架django知识总结(十四)

开源web框架django知识总结(十四)

Docker实践:python应用容器化

Django应用的容器化部署