Django-未在Docker中创建Mysql数据库

时间:2018-09-22 13:40:11

标签: mysql django docker docker-compose dockerfile

我在docker容器中设置了一个django项目,并且一切都按预期工作,除了我没有在mysql映像中找到项目数据库。

Dockerfile

FROM python:3

RUN mkdir /django-website
WORKDIR /django-website
COPY . /django-website
RUN pip install -r requirements.txt

docker-compose.yml

version: '3'

services:
    db:
        image: mysql:5.7
        restart: always
        environment:
            - MYSQL_ROOT_PASSWORD=root
            - MYSQL_DATABASE=mywebsite
            - MYSQL_USER=root
            - MYSQL_PASSWORD=root
        ports:
            - '33060:3306'
        volumes:
            - /var/lib/mysql
    web:
        build: .
        command: python manage.py runserver 0.0.0.0:8000
        volumes:
            - .:/django-website
        ports:
            - '8000:8000'
        links:
            - db

settings.py

DATABASES = {
    'default': {
        'ENGINE': "django.db.backends.mysql",
        'NAME': "mywebsite",
        'USER': "root",
        'PASSWORD': "root",
        'HOST': 'db',
        'PORT': '3306',
    }
}

我进行了迁移,并且有效:

docker-compose run web python manage.py migrate

我创建了超级用户:

docker-compose run web python manage.py createsuperuser

开发服务器正在运行docker-compose up,站点正在按预期运行,这是我在mysql映像中导航时找不到的与项目相关的数据库mywebsite的问题。

您能告诉我缺少什么吗?如果未创建数据库,则在哪里应用迁移?

谢谢。

4 个答案:

答案 0 :(得分:5)

我不确定您是什么意思 “我登录了mysql映像外壳程序,但未找到mywebsite数据库”

您已成功迁移数据库,这意味着数据库连接是 有效 有效

在您的 docker-compose.yml 文件中,端口映射如下完成: '33060:3306' ,即 db port 3306映射到主机的port 33060。因此,此 可能是个问题(这不是问题,typo种)

如何检查数据库内容?

METHOD-1:通过django-shell容器的web 检查
1.运行 docker-compose up
2.使用相同的路径打开一个新终端,然后运行 docker ps
您会看到类似以下的内容

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
795093357f78        django_1_11_web     "python manage.py ru…"   34 minutes ago      Up 11 minutes       0.0.0.0:8000->8000/tcp    django_1_11_web_1
4ae48f291e34        mysql:5.7           "docker-entrypoint.s…"   34 minutes ago      Up 12 minutes       0.0.0.0:33060->3306/tcp   django_1_11_db_1

3。通过 web 命令进入docker exec -it 795093357f78 bash容器,其中795093357f78是相应的容器ID
4.现在您在容器内。然后,运行命令 python manage.py dbshell 。现在,您将进入mywebsiteScreenshot)的 MYSQL shell中。
5.运行命令show tables;。它将显示mywebsite数据库中的所有表

METHOD-2:通过db容器进行检查
1.重复以上部分中的步骤1和2
2.通过 db
进入docker exec -it 4ae48f291e34 bash容器 3.现在,您将进入MYSQL的bash终端。运行以下命令 mysql -u root -p 并在出现提示时输入密码
4.现在您在MYSQL服务器中。运行 show databases; 命令。这将显示服务器中的所有数据库。

答案 1 :(得分:2)

您是否尝试过在dockerfile中定义数据库映像?以下链接与您的问题有些相关: https://medium.com/@lvthillo/customize-your-mysql-database-in-docker-723ffd59d8fb

答案 2 :(得分:0)

我认为主机容器的端口值应该是3306,而不是33060。 使用值3306的docker-compose.yml:

version: '3'

services:
    db:
        image: mysql:5.7
        restart: always
        environment:
            - MYSQL_ROOT_PASSWORD=root
            - MYSQL_DATABASE=mywebsite
            - MYSQL_USER=root
            - MYSQL_PASSWORD=root
        ports:
            - '3306:3306'
        volumes:
            - /var/lib/mysql
    web:
        build: .
        command: python manage.py runserver 0.0.0.0:8000
        volumes:
            - .:/django-website
        ports:
            - '8000:8000'
        links:
            - db

希望这行得通!

答案 3 :(得分:0)

您应该将撰写规范更改为version '2'。取下容器,并用docker-compose up -d将其放回原处。或者,如果您打算使用版本3,则可以对数据库环境参数使用以下规范

```
  environment:
    MYSQL_ROOT_PASSWORD: root
    MYSQL_DATABASE: mywebsite
    MYSQL_USER: root
    MYSQL_PASSWORD: root
```

如果容器出现问题,docker logs <container-name> --tail 25 -f可以为您提供很多有关原因的信息。