我有一个使用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上可用的解决方案,但是没有运气。任何帮助将不胜感激。
答案 0 :(得分:1)
任何帮助将不胜感激。
关于MySql和Django App关系,您有三种可能的情况:
从您的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,每个都有自己的容器。