关于Django:Django – Mysql数据库不是在Docker中创建的

Django - Mysql Database is not created in Docker

我在Docker容器中设置了一个django项目,所有的事情都按预期工作,只是在mysql映像中找不到项目数据库。

文档文件

1
2
3
4
5
6
FROM python:3

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

docker-compose.yml公司

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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

设置Py

1
2
3
4
5
6
7
8
9
10
DATABASES = {
    'default': {
        'ENGINE':"django.db.backends.mysql",
        'NAME':"mywebsite",
        'USER':"root",
        'PASSWORD':"root",
        'HOST': 'db',
        'PORT': '3306',
    }
}

我运行了migrate,它工作了:

1
docker-compose run web python manage.py migrate

我创建了superuser:

1
docker-compose run web python manage.py createsuperuser

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

你能告诉我遗漏了什么吗?如果未创建数据库,则在哪里应用了迁移?

事先谢谢。


我不知道你所说的"我登录了mysql image shell,但没有找到mywebsite数据库"是什么意思。

您成功地迁移了数据库,这意味着数据库连接有效且工作正常。在您的docker-compose.yml文件中,这样做的端口映射,'33060:3306'表示dbport 3306映射到主机的port 33060上。所以,这可能就是问题(这不是问题,类似于typo)

如何检查数据库内容?

方法一:检查web集装箱的django-shell。1。运行docker-compose up。2。在同一路径上打开一个新终端,运行docker ps。你会得到如下的东西

1
2
3
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.通过docker exec -it 795093357f78 bash命令进入web容器,其中795093357f78是各自的容器ID。4。现在你在容器里。然后,运行命令python manage.py dbshell。现在您将进入EDOCX1的mysql shell(截图)5。运行命令show tables;。它将显示mywebsite数据库内的所有表。方法二:通过db集装箱检查1。重复上述部分中的步骤1和2。2。用docker exec -it 4ae48f291e34 bash进入db集装箱三。现在您将进入MySQL的bash终端。运行以下命令mysql -u root -p并在提示时输入密码4。现在你在mysql服务器上。运行命令,show databases;。这将显示服务器中的所有数据库。


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


您应该将compose规范更改为version '2'。取下容器,与docker-compose up -d一起运回。或者,如果您打算继续使用版本3,则可以使用以下数据库环境参数规范

1
2
3
4
5
6
7
```
  environment:
    MYSQL_ROOT_PASSWORD: root
    MYSQL_DATABASE: mywebsite
    MYSQL_USER: root
    MYSQL_PASSWORD: root
`
``

当您遇到集装箱无法到达的问题时,docker logs --tail 25 -f可以为您提供有关原因的大量信息。


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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

希望能成功!