dockerizing django应用程序

wswtfjt7  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(310)

我有一个django应用程序,它使用python2.7.10和django1.10.3。我的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/

my requirements.txt包含以下内容:

Django>=1.10,<2.0
   Mysql-python

mydocker-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| django.db.utils.operationalerror:(2002,“无法通过socket连接到本地mysql服务器'/var/run/mysqld/mysqld.sock'
我查看并尝试了stackoverflow上可用的解决方案,但没有成功。任何帮助都将不胜感激。

4xrmg8kj

4xrmg8kj1#

任何帮助都将不胜感激。
关于mysql和django应用程序的关系,您有三种可能的情况:
mysql和django app(localhost)驻留在同一个容器中
mysql与django应用程序位于不同的容器中(主机名不同,可以在不同的拓扑上处理-相同的子网或不同的子网等)
mysql位于docker生态系统之外(裸机、云等等……)
从你的 settings.py 以及 docker-compose.yml 你在混合前两种方法。现在,由于您可以从 settings.py 我会认为这种情况微不足道,下一步,把mysql塞进django应用程序的同一个容器通常是个坏主意(如果你想单独扩展它们),所以这个答案将集中在第二种情况(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 ,你会有以下的人 setting.py 配置(注意 HOST 是 Docker 的价值 service 数据库容器的条目,端口是容器的内部端口,而不是docker主机的外部端口):

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

作为旁注,我们通常使用单独的docker-compose.yml从django应用程序文件运行数据库,因为在通常的开发周期中,django应用程序容器上的调整/重新启动/崩溃要比数据库1上的频繁得多,我们可以这样单独处理,另外,这样一个单独定义的数据库可以处理几个不同的应用程序,每个应用程序都有自己的容器。

相关问题