带有 mysql 和 django 的 Docker。尽管有任何尝试,都拒绝连接到 mysql

Posted

技术标签:

【中文标题】带有 mysql 和 django 的 Docker。尽管有任何尝试,都拒绝连接到 mysql【英文标题】:Docker with mysql and django. Connection to mysql is refused despite any attempts 【发布时间】:2019-04-12 20:03:43 【问题描述】:

到目前为止,我已经尝试了所有可以在互联网上找到的方法 - 但似乎没有任何帮助。

这是我的 docker-compose.yml 文件:

version: '3.3'

services:
  ivs_fraud:
    build:
      context: .
      args:
        GIT_SSH_KEY: $GIT_SSH_KEY
    image: ivs_fraud:latest
    container_name: fraud
    depends_on:
      - ivsdb
    links:
      - ivsdb
    networks:
      - database_network

networks:
  database_network:
    driver: bridge

我有一个到 ivsdb 服务的链接/依赖项,该服务在另一个 docker-compose-dev.yml 文件中定义:

version: '3.3'

services:
  ivsdb:
    image: mysql
    container_name: ivsdb
    networks:
      - database_network
    ports:
      - $DEFAULT_DB_PORT:3306
    restart: always
    environment:
      MYSQL_DATABASE: $DEFAULT_DB_NAME
      MYSQL_USER: $DEFAULT_DB_USER
      MYSQL_PASSWORD: $DEFAULT_DB_PASS
      MYSQL_ROOT_PASSWORD: $DEFAULT_DB_ROOT_PASS

这是我的 .env 文件(Django 读取这个 .env 文件并根据它创建连接):

DEFAULT_DB_NAME=ivsdb
DEFAULT_DB_HOST=ivsdb
DEFAULT_DB_PORT=10001
DEFAULT_DB_USER=root
DEFAULT_DB_PASS=root
DEFAULT_DB_ROOT_PASS=root

我不断得到:

(2003, 'Can\'t connect to MySQL server on \'ivsdb\' (111 "Connection 拒绝")')

我尝试了一些修改但没有成功:

    将所有内容移到一个 docker-compose 文件中 彻底摆脱“网络”条目 将主机更改为ivsdb / 127.0.0.1 / localhost / 0.0.0.0

有效的方法:

    Djago 服务运行良好 Mysql 服务运行良好。

我可以使用命令行连接到它:

mysql -uroot -proot -P10001 --protocol=tcp 

mysql -uroot -proot -P10001 -h127.0.0.1 (IP adress enforces tcp protocol)

看起来 Django 很难连接到 mysql 容器。但是从“连接被拒绝”来看 - django 可以访问 mysql 容器。

我错过了什么?

【问题讨论】:

您可以先尝试通过 ssh/exec 调试到 Django 容器中并测试您可以连接到那里的端口docker exec -it ivs_fraud bash Django 配置并尝试连接到 MySQL 的端口是否也是 10001 是的。 Django 肯定在寻找 10001 端口。 【参考方案1】:

DEFAULT_DB_PORT=10001 实际上应该是 MySQL 的默认端口 (3306),而不是主机映射端口 (10001)

很好地解释了区别here

【讨论】:

据我所知,我指定的是主机的端口 (10001),但不是我的服务。因此,如果我希望这些服务也链接到 10001,我应该另外使用“expose”关键字吗? 顺便说一句。它解决了这个问题。谢谢。 你不能有暴露的映射,它只需要一个参数。所以,你可以暴露 10001,但它没有多大用处,因为 MySQL 仍会监听 3306。所以,要实现您想要的,您还必须更改 MySQL 的侦听端口。

以上是关于带有 mysql 和 django 的 Docker。尽管有任何尝试,都拒绝连接到 mysql的主要内容,如果未能解决你的问题,请参考以下文章

带有 mysql 和 django 的 Docker。尽管有任何尝试,都拒绝连接到 mysql

docke部署mysql

docker-compose部署django+nginx+uwsgi+celery+redis+mysql

Django中的原始sql到json,带有日期时间和十进制MySql列

将带有数据的 Docker 容器克隆到另一个主机

我可以在带有 Python3.x 的 Django(dev 1.6.x) 上使用 MySQL 吗?