Node RED on Docker writing on MYSQL database - mysql

I am running Node-RED on Docker, and I am trying to write data to MySQL on my localhost.
As host, I am using localhost (see picture)
I receive the error: connection refused.
Which Host address should I use here? I don't quite understand the communication between the container and the local host.

localhost always points to the TCP/IP stack that the program opening the connection is bound to.
Every Docker container has it's own TCP/IP stack so unless the database is running in the same container as Node-RED localhost will not be the correct hostname for the database.
You have 3 choices
If you are using docker-compose then you can use the container name as the hostname and it will connect to the right container.
You can use the docker inspect [container-instance-name] to find the IP address assigned to the database container and use that
If you have mapped the container port to your host machine (with the -p option) then you can use the IP address of the host which normally defaults to 172.17.0.1
Edit:
To connect to the host machine then you can use host.docker.internal on Docker for Windows and Docker for Mac (unfortunately the issue to fix this on Linux has been open for over 3 years).
You should also be able to use the IP address from point 3 above.

Related

Can't reach MySQL hosted DB from Docker .NET Core

I’ve got a DigitalOcean Droplet that run Ubuntu and I’ve installed MySQL to it. I can reach it from my computer with SSH connection from MySQL workbench, so the remote access is Ok.
The hostname is 127.0.0.1
The bind address in my mysqld.cnf: 127.0.0.1
I’ve got a .NET Core API and I would like to use Docker to run it. I made the container push to docker hub and pulled it to the droplet. When I try to run I get this error:
An error occurred using the connection to database “ on server
‘127.0.0.1’.
My connection string:
"Server=127.0.0.1;Port=3306;Database=db;Uid=user;Pwd=pass”
I tried to server: localhost
IP address for docker0: 172.17.0.1 so I tried this to connectionString as well.
I don’t understand why can I connect to DB from MySQL workbench and cannot from .NET Core Web API.
The .NET Core version is 3.1.
Your .NET Core is inside container. Thus if you try to connect localhost or 127.0.0.1, it will try to connect the container itself, not the host. Since your MySQL is on your host, not inside the container, you can access it with other IP.
For example you have eth0 or enps0 or something like that, then that interface have IP 192.168.1.2, then you can use this IP as connection string.
Or, the alternate way, is using --network host when creating container. In this way, if you use 127.0.0.1, it will try to connect the host.

How to access remotely a dockerised database container in Ubuntu OS?

Current Situation :
In my company we are using a windows server, in which we have installed Docker Quickstart Terminal. We have made a mysql-container and made a DB inside. We access the DB with python apps in remote pcs by using the server's IP in the code (host argument):
connx = mysql.connector.connect(user='root', password='somepass', host='192.XXX.XX.XX', port=3306, database='db_name', auth_plugin='mysql_native_password')
but we used port-forward in the server-side to access the dockerised DB, thus the packets are forwarded to 192.168.99.100 (default docker IP)
Future Situation:
The company has decided to change the server and use Ubuntu instead (v18.04 i think). Unfortunately i have very little experience with linux and could not find a simple answer as the following online :
'Which IP should we use on the host argument above ?'
Docker installation on linux does not seem to install a VM, so will the new server's IP be enough to access the dockerised IP remotely ?
PS : we will probably do a 'docker run -p 3306:3306 mysql:latest' command on the server to expose the ports
You should be able to access the database the say way you were able to access in Windows Server, i.e., using the IP of the Ubuntu host machine and port forwarding the containerized database port with the host port.

Can't connect to db from docker container [duplicate]

This question already has answers here:
From inside of a Docker container, how do I connect to the localhost of the machine?
(41 answers)
Closed 3 years ago.
I have MySQL server installed on a server and dockerized project, The DB is not publicly accessible, only from inside the server. It's used by local non dockerized apps too.
I want to connect to it from inside the docker with it remaining not publicly accessible, I tried 172.17.0.1 but I get connection refused.
the current bind_address is 127.0.0.1, What do you suggest the bind_address would be ??
You can run the application through the host network mode which will make the container able to connect to the localhost of your main server (the docker host) while keeping the bind-address points to 127.0.0.1.
So you need to run your application like this if you are using docker cli:
docker run --network=host myappimage
In case of docker-compose you will use is in your service:
network_mode: host
Trying to describe a bit better what I understand from your question at first:
You have a host with mysql installed (not dockerized, but directly
on your host)
You have some client apps connecting to that MySQL in your host
using your localhost IP and the mysql port (let's say:
127.0.0.1:3306 by default)
Now you created a docker container with another app (inside the
container) that you want to have connected with your MySQL server,
which is still running in your host, accessible locally, but out
of your new container (or any other container)
You want your dockerized service to remain isolated, with no other contact with anything else outside your container (but the MySQL server, of course)
⚠️ Well, I'm going to start by ruling out the option of using --net=host (even when it could work in similar cases to allow your services to "live" in your host's network) since you don't want your container to be available from your other host's processes nor having access to anything else (which would happen with host networking)
Connecting to [non-dockerized] services in your host
✔️ In this case, what you actually need to do (from your app inside your container) is to connect to your Docker Host's IP
But not to the IP in your regular local network (e.g.: 192.168.1.5) nor in your public/wlan network, but to the IP that docker assigns to your host within your docker network itself (the network that docker creates to comunicate with and between your containers)
By default (if you don't specify any other network settings for your container) your container should be using the docker's bridge network, which is setup in the host (not inside the container) and commonly named docker0
So, it's as simple as finding the IP corresponding to your Host, and using that one as your mysql client's bind_address (e.g.: jdbc:mysql://172.X.XX.XX:3306 or $dbhost = "172.X.XX.XX"; etc.)
What is my Docker Host IP address?
Ok... and how can I find the IP that docker assigns to my host (the one for the docker's bridge network)?
Manually
You can just list all of your current assigned IP addresses, to find the one corresponding to that docker0 network:
ip -4 addr
or even better by directly filtering the one that you want:
ip -4 addr show docker0
You'll get an output similar to this:
3: docker0: mtu 1500 qdisc noqueue
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
And copy the ip that appears there after inet
Automatically
I like using this script to directly grab my current docker's host IP (especially useful when testing across many hosts):
ip -4 addr show docker0 | awk '$1=="inet" {print $2}' | cut -d/ -f1
Just put it in some handly place (e.g. in your /.bashrc) assigned to some environment variable:
export DOCKER_HOST_IP="$(ip -4 addr show docker0 | awk '$1=="inet" {print $2}' | cut -d/ -f1 )"
Hope it could be useful!

Why am I getting ECONNREFUSED connecting to localhost MySQL from docker node app?

I have a locally running MySQL server.. it's NOT within a container. My app is going to be hitting RDS so no sense in going that route. My app was able to hit RDS no problem, as a test. But obviously I want to hit something local for local development.
From my terminal I can do mysql --user=root --password=password mydb successfully.
And as I'm not getting a timeout error, from my container I can ping 127.0.0.1:3306 with no issue.
I also used console to see I am definitely passing the right info, after having updated the values from RDS to locally running MySQL.
Docker container has its own network IPs, including its own localhost. So you basically need to be sure of two things:
That your host MySQL is listening in all of its interfaces (bind-addres = 0.0.0.0 in my.cnf). Check with netstat -na|grep 3306.
Figure out the host ip that your container can reach. So check the IP of the container: docker inspect container-id, find the IP, and replace the last part with .1, that should be the IP of your host in the containers own network. I.e. 172.17.0.1 (it can be considered as fixed IP, for dev environment it's ok)
So most likely that this is what you need: 172.17.0.1:3306

Connecting to localhost mysql server from inside docker container on macOS

How can I connect to localhost mysql server from a docker container on macOS ?
One way to do it using --add-host but that requires me to pass some name like "myhost".
Is there any way in macOS so that references to localhost from inside docker container actually refer to docker host ?
On MacOS docker provide special DNS name docker.for.mac.localhost which will resolve to the internal IP address used by the host.
use host.docker.internal
to connect to the host running the Docker.
this works From docker version 18.03 onwards only and This is for development purposes and will not work in a production environment outside of Docker Desktop for Mac.
( refer the page https://docs.docker.com/docker-for-mac/networking/ for more info )
sample connection string for oracle, jdbc:oracle:thin:#host.docker.internal:1521/orcl
From inside of a Docker container, how do I connect to the localhost of the machine?
You should be able to connect to MySql running on host machine using host machine actual IP address. In MacOS, try to find your ip by command ifconfig. Mostly using IP assigned to en0 i.e. your ethernet interface should work. Just call that IP from within your container.
*localhost or 127.0.0.1 or 0.0.0.0 doesnt call host machine as they are local to container itself.