Dockerizing Django应用

时间:2018-07-23 17:44:28

标签: python mysql django docker docker-compose

我有一个使用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服务器

我已经看过并尝试了Stackoverflow上可用的解决方案,但是没有运气。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分: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,每个都有自己的容器。