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

Bre*_*enw 14 mysql odbc docker

我正在努力将一个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
Run Code Online (Sandbox Code Playgroud)

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

 ssh -L 3307:127.0.0.1:3306 MYID@REMOTE_DB_SERVER
Run Code Online (Sandbox Code Playgroud)

我使用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
Run Code Online (Sandbox Code Playgroud)

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

docker exec MY_CONTAINER echo "show databases" | mysql -u DB_USER -pDB_USER_PWD -h 127.0.0.1 --port=3307
Run Code Online (Sandbox Code Playgroud)

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

    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)
Run Code Online (Sandbox Code Playgroud)

Bre*_*enw 5

我通过使用docker主机地址而不是'127.0.0.1'解决了此问题,该查询来自容器内:

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

由于Docker主机ip可能有所不同,因此本文介绍了获取正确地址的步骤:

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


Dan*_*lov 5

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

请阅读以下答案:

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

  • 之所以说“ Docker是虚拟机”,可能是因为误解,因为Docker与肯定的虚拟机没有相同的结构。我认为说“ Docker像虚拟机一样运行”更为合适。 (5认同)