96

I have a docker mysql image running, following is what the docker-compose.yml file looks like:

db:
  image: mysql
  environment:
    MYSQL_ROOT_PASSWORD: ""
    MYSQL_ALLOW_EMPTY_PASSWORD: yes
  ports:
    - "3306:3306"

This works fine.

My question is: How can I connect to the MySQL instance running on that container from the command line mysql client on my the host (my macbook)?

To clarify:

  • I have a macbook with Docker installed
  • I have a docker container with mysql
  • I want to connect to the mysql instance running on the aforementioned container from the Terminal on my macbook
  • I do NOT want to user a docker command to make this possible. Rather, I want to use the mysql client directly from the Terminal (without tunneling in through a docker container).

I don't have MySQL running locally, so port 3306 should be open and ready to use.

The command I am using to start the container is: docker-compose run

3
  • This looks particularly relevant: serverfault.com/questions/688513/… Commented Sep 3, 2015 at 18:02
  • how is docker installed on your macbook? docker toolbox, boot2docker or kitematic? Commented Sep 3, 2015 at 18:02
  • boot2docker The docker toolbox was unreliable. I have open issues on their github, and if/when it becomes more stable I'll use it, but for now boot2docker is managing the VMs, and it's working fine. Commented Sep 4, 2015 at 18:00

8 Answers 8

111

Using docker-compose up

Since you published port 3306 on your docker host, from that host itself you would connect to 127.0.0.1:3306.

Using docker-compose run

In that case the port mapping section of the docker-compose.yml file is ignored. To have the port mapping section considered, you have to add the --service-ports option:

docker-compose run --service-ports db

Additional note

Beware that by default, the mysql client tries to connect using a unix socket when you tell it to connect to localhost. So do use 127.0.0.1 and not localhost:

 $ mysql -h 127.0.0.1 -P 3306 -u root

Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.6.26 MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

$ mysql -h localhost -P 3306 -u root

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

Sign up to request clarification or add additional context in comments.

14 Comments

thanks for the tip. I tried using 127.0.0.1 (and 192.168.59.103), neither worked :(
Any other ideas? @Thomasleveil
sorry I never used boot2docker myself. Maybe github.com/docker/docker/issues/4007 will help
any advice on how this might work using Docker toolbox? I'd be happy to ditch boot2docker
Ok, check this out: If I run the mysql server this way, I can connect fine: docker run -p 0.0.0.0:3306:3306 -e MYSQL_ROOT_PASSWORD=foo -d mysql The PORTS column looks like this when I run docker ps: 0.0.0.0:3306->3306/tcp However, specifying the ports in docker compose as - "0.0.0.0:3306:3306" doesn't work. The PORTS column looks like this, as opposed to the aforementioned example: 3306/tcp Any idea on how to specify the ports in docker-compose so that it results in the 0.0.0.0 mapping? Thanks a bunch!
|
21

A simple way to login to MySQL inside a Docker image is:

sudo docker exec -it <CONTAINER_ID> mysql -u root -p

for mySQL's root account by default password is not set, its BLANK, just press enter/return key, unless you have changed root password.

On successful execution, above command gives you mysql prompt.

Cheers!

1 Comment

The original question very specifically states that they do NOT want to do this.
14

If your Docker MySQL host is running correctly you can connect to it from local machine, but you should specify host, port and protocol like this:

mysql -h localhost -P 3306 --protocol=tcp -u root

Because you are running MySQL inside Docker container, socket is not available and you need to connect through TCP. Setting "--protocol" in the mysql command will change that.

2 Comments

this answer work for me. I was running mysql workbench and although my host were different in workbench localhost still worked to connect.
This is not that suitable in most cases, as you would need to have mysql tools to be installed on the machine you want to get access from. There are many cases in which user might have mysql in container only.
13

I got it!! The answer is to use the --service-ports option when running docker-compose:

docker-compose run --service-ports db (the original docker-compose.yml file works fine)

Thanks to all for the help!

2 Comments

This worked, but now the container is unkillable? How do you stop it?
that is similar when you define a service db in docker-compose file. It really not effecient -.-
3

this worked for me.

/usr/local/mysql/bin/mysql -h 127.0.0.1 -P 3306 -u root -p

3 Comments

Can you explain it in more details how exactly does it work and where was it used?
thats the location where mysql is installed. so the command "/usr/local/mysql/bin/mysql" will run the mysql executable. just mysql on its own wont work in some cases as it depends on how you installed mysql on your mac
I used it on a mysql 5.7 container running via docker-compose and used it with a docker swarm using docker-machine
3

You can just Use --network="host" in your docker run command, then 127.0.0.1 or localhost in your docker container will point to your docker host.

docker run --network="host" -p 8080:8080 <your-docker-Image>

1 Comment

Host networking doesn't work on MacOS or Windows hosts (this question specifically mentions a MacOS host). Since it totally disables Docker's networking layer, it's not usually a recommended approach.
1

Your yml file looks good.

You can directly connect docker container directly as it already mapped with local port 3306. Just goto terminal and run

mysql -h 127.0.0.1 -u root -p

Note: you must have access to mysql command line. If mysql command show an error, check '/usr/local/mysql/bin' other wise you can not connect to mysql server. In other word you must have mysql client on your machine.

Comments

0

Connect to MySQL via {host ip}:3306 since you've exposed the internal port to your host as 3306. If you need to access the MySQL CLI tools you will need to go docker exec -it mycontainer bash this will place you inside the container to access the tools installed with MySQL if you do not have them installed locally on the host o/s.

1 Comment

good answer, default mysql docker image has mysql-client tools (checked on tag 5.6, 5.7)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.