Localhost connect MySQL Docker confusion - mysql

I created a test_mysql using the following command:
docker run -d -p 3306:3306 --name=test_mysql --env="MYSQL_ROOT_PASSWORD=123" mysql
I got the IP address using docker inspect test_mysql. The IP is 172.17.0.2.
The strange thing is that when I tried to connect to mysql server on my local using
mysql -uroot -p123 -h 172.17.0.2 -P 3306
An error raised:
ERROR 2003 (HY000): Can't connect to MySQL server on '172.17.0.2' (51)
However, if I use the localhost IP address instead it did work:
mysql -uroot -p123 -h 127.0.0.1 -P 3306
My question is why I can't connect to the container use docker inspect result while localhost IP works?

1) while localhost IP works?
Let's see again your command to start container:
docker run -d -p 3306:3306 --name=test_mysql --env="MYSQL_ROOT_PASSWORD=123" mysql
The -p 3306:3306 will "bind" the port 3306 of host to the port 3306 of the container. As a result, we can see that if there is any connections come to port 3306, they will be forwarded to the port of the container.
So, your connections on local IP will work:
mysql -uroot -p123 -h 127.0.0.1 -P 3306
See more detail on Docker page
2) why I can't connect to the container use docker inspect result
It seems your container is connected to the default bridge network(docker0 may have IP:172.17.0.1 in your case ) which is often created by default when you install Docker.
You can find more detail in Docker network page.Therefore, inside your container, you may "see" the bridge (you can try to use ping command", but from your local host, it may not know how to find/resolve the 172.17.0.2 and you got that error.

Related

Delphi Firedac connect to MySQL in docker container

I have created a MySQL image on my Windows 10 using the default settings from Docker.
I started the container using this command:
docker run --name local-mysql --network="host" -p 3306:3306 -e MYSQL_ROOT_PASSWORD=my-secret-pw -d <your-docker-Image>
I used the --network parameter in the hope that I could connect to the container from my host computer.
Then I ran this command to connect to the container from the MySQL shell
docker exec -it mysql bash -l
I was able to connect using this
mysql -h localhost -P 3306 --protocol=tcp -u root -p
Using Delphi and setting FireDac to use DriverId MySQL, I specified host as localhost, port 3306, user as root and the password.
But I get this connection error
[FireDAC][Phys][MySQL] Cannot connect to MySQL server on 'localhost:3306' (10061)
I have tried using 127.0.0.1 and 0.0.0.0 without success and with the same error.
I would appreciate it if anyone has tried it with Delphi FireDac to connect to a MySQL container hosted on the same computer.
Thank you in advance.
I was able to solve the issue by using this command to run the image
docker run --name local-mysql -p 127.0.0.1:3307:3306 -e MYSQL_ROOT_PASSWORD=my-secret-pw -d <your-docker-Image>
I used a different host port (3307) to map to the default 3306
I was able to test it using the bash first
mysql -h 127.0.0.1 -P 3306 -u root -p
And in Delphi FireDac, I used the following to connect
Host=127.0.0.1
Port=3307
User_Name=root
Password=my-secret-pw
And all is good. Hope this helps someone who is trying to the same.

How to connect to mysql container?

I am running official mysql docker image on Linux:
docker run --name somemysql -e MYSQL_ROOT_PASSWORD=pass -p 3306:3306 -d mysql
How do I connect to the database from outside of the container?
You must have to specify the port to container with something like -p 3306:3306, which means you redirect your host 3306 port to the 3306 container port and then you just need connect by exec to the container like:
$ docker exec -it somemysql bash and you can access it easily, otherwise if you want to connect via mysql client use:
$ mysql -h 127.0.0.1 -u root -p
It's important to specify the localhost IP. If you don't, you wont be able to connect. The port 3306 can't be in use when you assign it.
First you have to open the Ports via -p expose is Not enough, since it is used in a network for multiple container to find each other without connection to the outside. Then you can connect to your container with exec and then via SSL

Docker mysql: ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

I am trying to connect to mysql server using mysql cli. Image was created using following command:
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=****** -d mysql
The docker container is running. docker ps prints:
johnd#john-pc:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
598c0f8680dc mysql "docker-entrypoint.s…" 4 minutes ago Up 4 minutes 3306/tcp, 33060/tcp some-mysql
When i enter the following command:
mysql -h 127.0.0.1 -P 3306 -u root -p it returns:
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)
I also tried with --protocol=tcp attribute. How do i connect from client to mysql server running on docker using terminal from client machine (not from another docker)
EDIT:
I also tried connecting to mysql using this command:
docker run -it --rm mysql mysql -h127.0.0.1 -uexample-user -p
It returns the same error
mysql -h 127.0.0.1 -P 3306 -u root -p
You are connecting to your localhost's sql server but you didn't map the docker's container port to the host.
Try mapping the port to your host by this:
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=****** -d -p 3306:3306 mysql
Then retry:
mysql -h 127.0.0.1 -P 3306 -u root -p
same error to me, just remember start mysql service first in your container.
exec in your container
/etc/init.d/mysql start
Using internal docker IP like 127.0.0.1 didn't work for me
I used my POD's IP and it worked
mysql -h 10.10.10.41 -P 3306 -u root -p
I still don't understand why I wasn't able to login and before and after this command I was able to login

Accessing a Docker MySQL server from the host machine, without needing the container's IP address

I'm writing setup instructions for an application needing a MySQL database, and I'd like it to be easy even for people that don't have a MySQL installation.
Therefore, I'd like to run the MySQL server in a container:
docker run -p 3306:3306 \
--name mysql \
-e MYSQL_ROOT_PASSWORD=test \
-e MYSQL_DATABASE=my_db \
-d mysql
And to be able to connect to it this way:
mysql -u root -ptest -D my_db
Which doesn't work because the MySQL server only listens locally on the container.
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
So I see three options, none of which fitting my needs:
1) Using the container IP everytime
mysql -u root -ptest -D my_db -h 172.17.0.4
Annoying, the IP will often change and I don't want people to have to update their configuration this much.
2) Changing the configuration of MySQL inside the container
Requires to run a docker exec ... each time the container is run, so it's annoying as well.
3) Making a custom image where the configuration suits my needs
Seems a bit overkill, I'm pretty sure there is a better solution.
Thoughts?
When the mysql client is invoked as you did:
mysql -u root -ptest -D my_db
(i.e. without the hostname) or with localhost as hostname it tries to connect to the local server using Unix pipes. A pipe is a special file type and the client communicate with the server through it.
Your MySQL server is not local, it runs on a separate machine. You cannot connect to it using pipes.
As you already noticed, it works if you use the IP address of the container as argument for the -h command line option of mysql.
You also map the port 3306 of the container to port 3306 of the host machine. This means any TCP connection to port 3306 of the local machine goes through this mapping to the port 3306 of the container, where the MySQL server is listening.
Combining the two above, all you have to do is to put 127.0.0.1 as host name in the mysql command line:
mysql -u root -ptest -D my_db -h 127.0.0.1

how to connect remote docker container mysql server

is there any way to connect remote docker container mysql server?
I am installing magento web application, now I have a situation like I need to use/point the existing remote docker container database. I have make port forwarding in order to access database from remote machine but it doe not work.
docker run -it -d -p 3002:80 -h tm.gworks.mobi -v /var/www/public --privileged --name database magedev
For testing purpose in remote machine I have tried like mysql -u root -h 192.168.1.21:3002 -p in mysql console but it does not connect, it throws error ERROR 2005 (HY000): Unknown MySQL server host '192.168.1.21:3002' (-2)
Docker run command should be,
docker run -it -d -p 3002:3306 -h tm.gworks.mobi -v /var/www/public --privileged --name database magedev
default mysql port is 3306 but I listen port 80 which is my nginx port so it can't be to allow.
mysql -u root -h 192.168.1.21 -P 3002 -p
now everything works fine