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.py
和docker-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 应用程序的主要内容,如果未能解决你的问题,请参考以下文章