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

时间:2016-04-01 23:00:27

标签: mysql docker odbc

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

3 个答案:

答案 0 :(得分:3)

我通过在容器内使用docker主机地址而不是'127.0.0.1'来解决这个问题:

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

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

How to get the IP address of the docker host from inside a docker container

答案 1 :(得分:3)

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

请阅读以下答案:

From inside of a Docker container, how do I connect to the localhost of the machine?

答案 2 :(得分:0)

首先,您必须通过以下命令检查防火墙中的Docker数据库端口是否可用 -

sudo firewall-cmd --list-all

示例输出:

  target: default
  icmp-block-inversion: no
  interfaces: eno79841677
  sources: 
  services: dhcpv6-client ssh
  **ports: 3307/tcp**
  protocols: 
  masquerade: no
  forward-ports: 
  sourceports: 
  icmp-blocks: 
  rich rules:

此处3307用作172.17.0.2 IP上的Docker数据库端口,如果此端口不可用运行以下命令 -

sudo firewall-cmd --zone=public --add-port=3307/tcp
sudo firewall-cmd --reload

现在,您可以通过上述配置轻松地从本地系统访问Docker数据库。