【问题标题】:Dockerized Django can't connect to MySQLDockerized Django 无法连接到 MySQL
【发布时间】:2018-06-10 16:39:48
【问题描述】:

使用本教程https://semaphoreci.com/community/tutorials/dockerizing-a-python-django-web-application,我正在使用docker-machine 将我的Django 应用程序停靠在VirtualBox 中。一切都很顺利,直到我打开浏览器,我的应用程序说 MySQL 有问题。

然后我找到了这个文档,用于对我遵循的 mysql https://github.com/mysql/mysql-docker 实例进行 dockerizing,在我创建的同一开发 VirtualBox 中创建图像。我最初得到的错误是

Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'

我的 Django 数据库看起来像这样

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db_name',
        'USER': 'root',
        'HOST': 'localhost',
        'PORT': ''
    }
}

然后我将主机更改为127.0.0.1,甚至尝试将端口指定为3306,但出现了一个新错误

(2003, "Can't connect to MySQL server on '127.0.0.1' (111)")

我还进入了 MySQL 工作台并将我的本地实例的连接更改为 127.0.0.1:3306,但这并没有帮助。

我正在运行的命令是

eval "$(docker-image env development)" ---> 据说做了这些事情:

         export DOCKER_TLS_VERIFY="1"
         export DOCKER_HOST="tcp://123.456.78.910:1112"
         export DOCKER_CERT_PATH="/Users/me/.docker/machine/machines/development"
         export DOCKER_MACHINE_NAME="development"

然后,现在我在我的 virtualbox 中,我运行:

docker run -it -p 8000:8000 <docker image name> ---> 将暴露的 8000 端口转发到我本地机器上的 8000 端口

docker run -it -p 3306:3306 mysql/mysql-sever ---> 将暴露的 3306 端口转发到我本地机器上的 3306 端口

【问题讨论】:

    标签: python mysql django docker docker-machine


    【解决方案1】:

    问题是您正在尝试连接127.0.0.1localhost,从 django 容器的角度来看,它们将引用自身而不是 mysql 容器。

    一般来说,对于容器来说,最好的“docker方式”就是让容器共享一个共同的docker网络。

    docker network create mynet
    docker run -it --network mynet -p 8000:8000 <docker image name>
    docker run -it --network mynet -p 3306:3306 --name mysql mysql/mysql-sever
    

    现在应用容器可以使用mysql作为主机名和3306作为端口连接到mysql。

    【讨论】:

    • 我的理解是 Docker 会自动将正在运行的容器链接到默认的“bridge”网络。事实上,在两个容器都运行的情况下,如果我运行“Docker 检查网络桥”,它会显示两个容器在桥接网络上运行,每个容器都有各自的 IP 地址......我尝试创建一个自定义网络并以与你相同的方式运行它们再次没有成功......
    • 是的,容器默认连接到默认桥接网络。但是,它们可以仅使用 IP 而不是 DNS 名称进行通信。 Docker does not support automatic service discovery on the default bridge networkdocs.docker.com/engine/userguide/networking/…
    • 那么你是说我需要将我的 DATABASES 配置中的 HOST 更改为“mysql”,以便在连接到自定义网络后访问 MySQL 数据库?
    • @Naji 是的。并确保为 my-sql 容器命名为mysql,如答案中指定的那样。
    猜你喜欢
    • 2016-06-05
    • 2016-09-10
    • 2019-03-24
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    • 2021-02-05
    • 2019-05-22
    • 2020-11-16
    相关资源
    最近更新 更多