Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Connect to remote MySQL db from docker container

Tags:

I'm working to containerize a Django 1.5.x application that connects to a MySQL DB on a separate server via ODBC:

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

I'm able to run the Django app on my local machine (outside docker) with a connection to the remote DB via port forwarding & SSH:

 ssh -L 3307:127.0.0.1:3306 MYID@REMOTE_DB_SERVER 

I've set up a Docker container for the app using Centos 6.x, but can't get the MySQL connection working. The container has MySQL installed and the mysqld running.

My docker-compose.yml file looks like this:

version: "2" services:   web:     build: .     image: MY_IMAGE     container_name: MY_CONTAINER     network_mode: "host"     ports:       - "3307:3306"     command: /bin/bash 

With the container running, I can execute the following command (outside the container) to show databases on the remote DB:

docker exec MY_CONTAINER echo "show databases" | mysql -u DB_USER -pDB_USER_PWD -h 127.0.0.1 --port=3307 

But from inside the container the same command fails:

    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) 
like image 946
Brendenw Avatar asked Apr 01 '16 23:04

Brendenw


Video Answer


2 Answers

The Docker works like a virtual machine. It has a local storage and a local environment. When you connect to 127.0.0.1 from the Docker it tries to connect to this Docker (not to local machine where the Docker was runned) because the localhost for the Docker is the Docker.

Please, read the following answer:

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

like image 101
Danil Valov Avatar answered Sep 27 '22 19:09

Danil Valov


I solved this by using the docker host address instead of '127.0.0.1' for queries from within the container:

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

Because Docker host ip can vary, this post describes steps to get the right address:

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

like image 35
Brendenw Avatar answered Sep 27 '22 20:09

Brendenw