【问题标题】:Connect to remote MySQL db from docker container从 docker 容器连接到远程 MySQL 数据库
【发布时间】:2016-04-01 23:00:27
【问题描述】:

我正在对通过 ODBC 连接到单独服务器上的 MySQL DB 的 Django 1.5.x 应用程序进行容器化:

[mysql_default]
database = DB_NAME
driver = /usr/lib64/libmyodbc5.so
server = REMOTE_DB_SERVER
user = DB_USER
password = DB_USER_PWD
port = 3306

我可以在我的本地机器(docker 外部)上运行 Django 应用程序,并通过端口转发和 SSH 连接到远程数据库:

 ssh -L 3307:127.0.0.1:3306 MYID@REMOTE_DB_SERVER

我已经使用 Centos 6.x 为应用程序设置了 Docker 容器,但无法使 MySQL 连接正常工作。容器已安装 MySQL 并运行 mysqld。

我的 docker-compose.yml 文件如下所示:

version: "2"
services:
  web:
    build: .
    image: MY_IMAGE
    container_name: MY_CONTAINER
    network_mode: "host"
    ports:
      - "3307:3306"
    command: /bin/bash

在容器运行的情况下,我可以执行以下命令(在容器外)以显示远程 DB 上的数据库:

docker exec MY_CONTAINER echo "show databases" | mysql -u DB_USER -pDB_USER_PWD -h 127.0.0.1 --port=3307

但是在容器内部,同样的命令失败了:

    echo "show databases" | mysql -u DB_USER -pDB_USER_PWD -h 127.0.0.1 --port=3306

ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)

【问题讨论】:

  • 你可以通过ssh -L 172.17.0.1:3307:127.0.0.1:3306 ...(未测试)使SSH隧道监听docker0接口(172.17.0.1)或所有接口(0.0.0.0,注意风险)。另一种可能性是在容器内建立 SSH 隧道。
  • 如何使用套接字连接到mysql并使用-v /var/run/mysqld:/var/run/mysqld运行“django”容器

标签: mysql docker odbc


【解决方案1】:

Docker 像虚拟机一样工作。它具有本地存储和本地环境。当您从 Docker 连接到 127.0.0.1 时,它会尝试连接到此 Docker(而不是运行 Docker 的本地计算机),因为 Docker 的 localhost 是 Docker。

请阅读以下答案:

From inside of a Docker container, how do I connect to the localhost of the machine?

【讨论】:

  • 说“Docker 是虚拟机”可能会产生误解,因为 Docker 与绝对虚拟机的结构不同。我认为说“Docker 像虚拟机一样运行”更合适。
【解决方案2】:

我通过使用 docker 主机地址而不是“127.0.0.1”来解决来自容器内的查询:

echo "显示数据库" | mysql -u DB_USER -pDB_USER_PWD -h 10.0.2.2 --port=3306

由于 Docker 主机 ip 可能不同,这篇文章描述了获取正确地址的步骤:

How to get the IP address of the docker host from inside a docker container

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 2021-11-23
    相关资源
    最近更新 更多