使用 docker-compose 链接 django 和 mysql 容器

Posted

技术标签:

【中文标题】使用 docker-compose 链接 django 和 mysql 容器【英文标题】:Linking django and mysql containers using docker-compose 【发布时间】:2015-09-11 04:57:12 【问题描述】:

我一直在关注 docker-compose 教程here(链接 django 和 postgres 容器)。尽管我能够完成本教程,但我无法继续重复相同的教程 使用 mysql 容器。 以下是我的 dockerfile 和 docker-compose.yml `

db:
  image: mysql
web:
  build: .
  command: python manage.py runserver 0.0.0.0:8000
  volumes:
    - .:/code
  ports:
    - "8000:8000"
  links:
    - db:db

` dockerfile

FROM python:2.7
RUN mkdir /code
WORKDIR /code
RUN pip install mysql-python
RUN pip install django

当我执行 docker-compose up 时,它们都构建得很好,但似乎 db 环境变量没有传递给 django 容器,因为当我在我的一个 django 视图中运行 os.environ.keys() 时,我看不到任何预期的 DB_ * 环境变量。 mysql 是否需要不同的设置,或者我错过了什么。 谢谢。

[编辑] Docker 编写版本

docker-compose version: 1.3.0
CPython version: 2.7.9
OpenSSL version: OpenSSL 1.0.1e 11 Feb 2013

Docker 版本

Docker version 1.6.2, build 7c8fca2

【问题讨论】:

您使用的是什么版本的 Docker 和 docker-compose?你能分享docker-compose up的输出吗?您也可以按照@dnozay 的建议分享docker-compose run web env 的输出 hub.docker.com/_/mysql/#environment-variables github.com/pahaz/docker-compose-django-postgresql-radis-example - django + redis + postgres + nginx 组合示例 【参考方案1】:

Django settings.py 文件中确保您有类似的内容:

DATABASES = 
'default': 
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'django1',
    'USER': 'django',
    'PASSWORD': 'password', 
    'HOST': 'db',
    'PORT': 3306,
    

然后在您的 docker-compose.yml 文件中确保您有以下内容:

db:
  image: mysql
  environment:
    MYSQL_ROOT_PASSWORD: docker
    MYSQL_DATABASE: docker
    MYSQL_USER: docker
    MYSQL_PASSWORD: docker

然后按照您正在遵循的 docker/django 教程再次运行以下命令来重建所有内容,一切都应该开始工作了

docker-compose run web django-admin.py startproject composeexample .

针对另一个问题,docker 在创建新数据库时需要 mysql root 密码变量。

编辑:将run 添加到上面的docker-compose;见编辑评论

【讨论】:

太棒了,它终于帮助了我。仍然不确定HOST: 'db' 是如何工作的? 嗨,Sam,HOST 是完全限定的域名,或远程数据库主机的 IP 地址。如果将该值留空,则意味着使用本地主机上的数据库。我也成功地将 localhost 指定为 'HOST': '127.0.0.1' 但您应该可以将其留空。 为什么我们需要MYSQL_ROOT_PASSWORD ?应用程序应该不需要root密码吧? 感谢您让我意识到 docker-compose.yml 中的明显错误。这个配置确实有效,尽管对于 docker 新手来说,上面提到的 docker-compose 配置仅适用于数据库。您仍然需要服务“web:”,如下所示docs.docker.com/compose/django,它将支持 Web 服务配置。【参考方案2】:

您无需担心环境变量。将容器链接在一起时,您只需使用链接定义的容器别名,就好像它是主机名一样。

例如,如果您的 docker-compose.yml 文件是:

db:
  image: postgres
web:
  build: .
  command: python manage.py runserver 0.0.0.0:8000
  volumes:
    - .:/code
  ports:
    - "8000:8000"
  links:
    - db:mydb

在您的 django 设置中,您必须将数据库主机设置为 mydb

【讨论】:

感谢您的回答,请检查我的编辑。我犯了在问题中使用 postgres 而不是 docker-compose.yml 中的 mysql 的错误。这是一个复制粘贴错误。但是我尝试了你的方法,我得到 Unknown mysql server host 'mydb' 现在你甚至不需要使用links。每 docs.docker.com/compose/compose-file/#links :“启用服务进行通信不需要链接 - 默认情况下,任何服务都可以使用该服务的名称访问任何其他服务。” .:/code 的语法是什么意思?这里我不明白 .和:是否将当前目录挂载到/code?​​span> . 用于 当前目录,即 docker-compose.yml 文件所在的目录。: 只是一个分隔符。 /code 是容器内的路径,本地当前目录的内容将被挂载到该路径【参考方案3】:

首先你需要修改设置文件...

DATABASES = 
    'default': 
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'postgres',
        'USER': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
     

那么如果你正确使用了docker-compose命令,容器应该是链接的,它应该根据docker-compose.yml文件中的links正确解析主机名db

不过,如果你想检查环境...

~/django-example: docker-compose run web env
Starting djangoexample_db_1...
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=66ff09ed8632
TERM=xterm
DJANGOEXAMPLE_DB_1_PORT=tcp://172.17.0.35:5432
DJANGOEXAMPLE_DB_1_PORT_5432_TCP=tcp://172.17.0.35:5432
DJANGOEXAMPLE_DB_1_PORT_5432_TCP_ADDR=172.17.0.35
DJANGOEXAMPLE_DB_1_PORT_5432_TCP_PORT=5432
DJANGOEXAMPLE_DB_1_PORT_5432_TCP_PROTO=tcp
DJANGOEXAMPLE_DB_1_NAME=/djangoexample_web_run_2/djangoexample_db_1
DJANGOEXAMPLE_DB_1_ENV_affinity:container==52c78c810792b0e7b9a231eab7ab7a3d50c95b76faf0abb8ec38a7d1ff0c7e5f
DJANGOEXAMPLE_DB_1_ENV_LANG=en_US.utf8
DJANGOEXAMPLE_DB_1_ENV_PG_MAJOR=9.4
DJANGOEXAMPLE_DB_1_ENV_PG_VERSION=9.4.4-1.pgdg70+1
DJANGOEXAMPLE_DB_1_ENV_PGDATA=/var/lib/postgresql/data
DB_PORT=tcp://172.17.0.35:5432
DB_PORT_5432_TCP=tcp://172.17.0.35:5432
DB_PORT_5432_TCP_ADDR=172.17.0.35
DB_PORT_5432_TCP_PORT=5432
DB_PORT_5432_TCP_PROTO=tcp
DB_NAME=/djangoexample_web_run_2/db
DB_ENV_affinity:container==52c78c810792b0e7b9a231eab7ab7a3d50c95b76faf0abb8ec38a7d1ff0c7e5f
DB_ENV_LANG=en_US.utf8
DB_ENV_PG_MAJOR=9.4
DB_ENV_PG_VERSION=9.4.4-1.pgdg70+1
DB_ENV_PGDATA=/var/lib/postgresql/data
DB_1_PORT=tcp://172.17.0.35:5432
DB_1_PORT_5432_TCP=tcp://172.17.0.35:5432
DB_1_PORT_5432_TCP_ADDR=172.17.0.35
DB_1_PORT_5432_TCP_PORT=5432
DB_1_PORT_5432_TCP_PROTO=tcp
DB_1_NAME=/djangoexample_web_run_2/db_1
DB_1_ENV_affinity:container==52c78c810792b0e7b9a231eab7ab7a3d50c95b76faf0abb8ec38a7d1ff0c7e5f
DB_1_ENV_LANG=en_US.utf8
DB_1_ENV_PG_MAJOR=9.4
DB_1_ENV_PG_VERSION=9.4.4-1.pgdg70+1
DB_1_ENV_PGDATA=/var/lib/postgresql/data
LANG=C.UTF-8
PYTHON_VERSION=2.7.10
PYTHON_PIP_VERSION=7.0.3
PYTHONUNBUFFERED=1
HOME=/root

【讨论】:

您好,感谢您的回答,对不起,我犯了复制粘贴错误,请查看我编辑的 docker-compose.yml 文件。谢谢 现在你甚至不需要使用links。每docs.docker.com/compose/compose-file/#links:“启用服务进行通信不需要链接 - 默认情况下,任何服务都可以访问该服务名称的任何其他服务。”

以上是关于使用 docker-compose 链接 django 和 mysql 容器的主要内容,如果未能解决你的问题,请参考以下文章

Docker-compose 从链接迁移到网络 MongoDB 数据库问题

如何将映像创建的卷与 docker-compose 指定的命名卷链接?

docker-compose:网络和链接之间的区别

使用docker-compose简化docker run 运行参数

使用 docker-compose 与 docker run 的不同结果

Centos使用pip安装docker-compose