首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Docker化Django应用程序

Docker化Django应用程序
EN

Stack Overflow用户
提问于 2018-07-23 17:44:28
回答 1查看 804关注 0票数 1

我有一个Django应用程序,它使用Python2.7.10和Django 1.10.3。我的Dockerfile包含以下内容:

代码语言:javascript
复制
   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包含以下内容:

代码语言:javascript
复制
   Django>=1.10,<2.0
   Mysql-python

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

代码语言:javascript
复制
   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包含数据库的以下内容:

代码语言:javascript
复制
DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'test',
    'USER': 'test',
    'PASSWORD': 'password',
    'HOST': 'localhost',
    'PORT': '3306',
}

我首先执行"% docker-组合构建“,然后执行"% docker-组合”,并得到以下错误:

web_1 / django.db.utils.OperationalError:(2002年,“无法通过socket‘/var/run/mysqld/mysqld.sock”连接到本地MySQL服务器)

我在没有运气的情况下查看并尝试了Stackoverflow上可用的解决方案。任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-23 21:29:18

任何帮助都将不胜感激。

关于MySql和Django应用程序关系,有三种可能的情况:

  • MySql与Django (localhost)位于同一个容器上。
  • MySql驻留在与Django不同的容器上(主机名不同,可以在不同的拓扑上处理--相同的子网或不同的子网,等等)
  • MySql住在码头生态系统之外(裸金属,云,不管.)

从您的settings.pydocker-compose.yml判断,您正在混合前两种方法。现在,由于您可以从MySql中引用外部settings.py服务器,所以我将考虑这种情况,接下来,将MySql塞在与Django应用程序相同的容器上通常是个坏主意(如果您想单独扩展它们的话),所以这个答案将集中在第二种情况(在单独的容器中的MySql)上,并且为了简单起见,将它们放在同一个坞-组合文件上(您也可以将它们分开)。

docker-compose.yml的重要摘录如下:

代码语言:javascript
复制
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:

通过这样的setting.py配置,您将拥有如下的HOST配置(注意,对于数据库容器,端口是容器的内部值,而不是停靠主机外部的端口):

代码语言:javascript
复制
DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'test_db',
    'USER': 'test_user',
    'PASSWORD': 'some_password',
    'HOST': 'database',
    'PORT': '3306',
}

作为一个sidenote,我们通常在Django应用程序文件中使用单独的docker-compose.yml运行数据库,因为在通常的开发周期中,在Django App容器上调整/重新启动/崩溃某些东西要比在数据库容器上频繁得多,而且我们可以用这种方式分别处理它,另外,这样一个单独定义的数据库可以处理几个不同的DjangoApps,每个数据库都有自己的容器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51484521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档