从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地址