繁体   English   中英

从 docker 容器连接到远程 MySQL db

[英]Connect to remote MySQL db from docker container

我正在努力将 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

我能够在我的本地计算机(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

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

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主机地址而不是'127.0.0.1'来解决这个问题:

echo“show databases”| mysql -u DB_USER -pDB_USER_PWD -h 10.0.2.2 --port = 3306

因为Docker主机ip可能会有所不同,所以这篇文章描述了获取正确地址的步骤:

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

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

请阅读以下答案:

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

我创建了一个 bridge.network:

$ 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

由 Basit 解决

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM