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

hgqdbh6s  于 2023-01-20  发布在  Mysql
关注(0)|答案(3)|浏览(189)

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

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

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

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)
mlmc2os5

mlmc2os51#

Docker的工作方式类似于虚拟机。它具有本地存储和本地环境。当您从Docker连接到www.example.com时127.0.0.1,它会尝试连接到此Docker(而不是连接到运行Docker的本地计算机),因为Docker的本地主机是Docker。
请阅读以下答案:
From inside of a Docker container, how do I connect to the localhost of the machine?

qxgroojn

qxgroojn2#

我通过使用Docker主机地址而不是'127.0.0.1'来从容器中进行查询,从而解决了这个问题:
echo“显示数据库”|mysql -u数据库用户-p数据库用户PWD -h10.0.2.2--端口=3306
由于Docker主机IP可能会有所不同,因此本文介绍了获取正确地址的步骤:
如何从Docker容器内部获取Docker主机的IP地址

7gcisfzg

7gcisfzg3#

我创建了一个桥接网络:

$ docker network create -d bridge mynetwork

之后,查看IP和端口

$ docker inspect mysql
...
"Ports": {
    "3306/tcp": [
        {
            "HostIp": "0.0.0.0",
            "HostPort": "32031"
        }
    ],
    "33060/tcp": null
}
...

连接0.0.0.0:32031
Solved by Basit

相关问题