从Docker容器连接到远程MySQL数据库

我正在努力容纳一个Django 1.5.x应用程序,它通过ODBC连接到一个单独的服务器上的MySQL数据库:

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

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

  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 

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

 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) 

Docker像虚拟机一样工作。 它有一个本地存储和当地的环境。 当你从Docker连接到127.0.0.1时,它会尝试连接到这个Docker(而不是连接Docker的本地机器),因为Docker的本地主机是Docker。

请阅读以下答案:

从Docker容器内部,如何连接到本机的本地主机?

我通过使用docker主机地址而不是“127.0.0.1”来解决这个问题,

回声“显示数据库”| mysql -u DB_USER -pDB_USER_PWD -h 10.0.2.2 –port = 3306

由于Docker的主机IP可以变化,这篇文章介绍了获取正确地址的步骤:

如何从Docker容器中获取Docker主机的IP地址