使用docker compose链接django和mysql容器

使用docker compose链接django和mysql容器,mysql,django,docker,dockerfile,docker-compose,Mysql,Django,Docker,Dockerfile,Docker Compose,我一直在关注docker compose教程(链接django和postgres容器)。虽然我能够完成教程,但是我不能继续重复同样的内容 使用mysql容器。 以下是我的dockerfile和docker-compose.yml ` ` dockerfile FROM python:2.7 RUN mkdir /code WORKDIR /code RUN pip install mysql-python RUN pip install django 当我执行docker compose up

我一直在关注docker compose教程(链接django和postgres容器)。虽然我能够完成教程,但是我不能继续重复同样的内容 使用mysql容器。 以下是我的dockerfile和docker-compose.yml `

` 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 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

您需要修改设置文件

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
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 password变量


编辑:将
run
添加到上面的
docker compose
中;请参阅编辑评论

谢谢您的回答,请检查我的编辑。我犯了一个错误,在docker-compose.yml中使用postgres而不是mysql。这是一个复制粘贴错误。然而,我尝试过你的方法,我现在得到了未知的mysql服务器主机“mydb”,你甚至不需要使用
链接。Per:“启用服务通信不需要链接-默认情况下,任何服务都可以以该服务的名称访问任何其他服务。”语法是什么。:/code的意思?在这里,我不明白这个词的用法。并且:是否正在将当前目录装载到/code?
用于当前目录,docker-compose.yml文件所在的目录<代码>:
只是一个分隔符
/code
是容器内的路径,本地当前目录的内容将装载在容器内。您好,谢谢您的回答。很抱歉,我出现了一个复制粘贴错误。请查看我编辑的docker-compose.yml文件。感谢您,现在您甚至不需要使用
链接
。Per:“启用服务通信不需要链接-默认情况下,任何服务都可以以该服务的名称访问任何其他服务。”您使用的Docker和Docker compose版本是什么?你能分享docker compose up的输出吗?您还可以分享@dnozay-django+redis+postgres+nginx compose example建议的
docker compose run web env
的输出,它最终帮助了我。仍然不确定主机:'db'是如何工作的?嗨,山姆,主机是完全限定的域名,或者远程数据库主机的IP地址。如果将该值留空,则表示在本地主机上使用数据库。我还成功地将localhost指定为“HOST”:“127.0.0.1”,但您应该可以将其留空。为什么我们需要
MYSQL\u ROOT\u密码?应用程序不需要根密码,对吗?感谢您让我意识到docker-compose.yml中的明显错误。虽然对于docker新手来说,上述docker compose配置仅适用于数据库,但此配置确实有效。您仍然需要服务“web:”,如图所示,它将支持web服务配置。
docker-compose run web django-admin.py startproject composeexample .