souyahia
souyahia

Reputation: 83

How to run a MySQL command terminal in Docker, with a docker-compose server

Let's say I have the following compose file :

networks:
  my_network:

services:

  ...

  mysql:
    container_name: "mysql"
    image: "mysql:5.7"
    volumes:
      - ./mysql.cnf:/etc/mysql/conf.d/mysql.cnf
    environment: 
      MYSQL_ROOT_PASSWORD: "password"
      MYSQL_USER: "user"
      MYSQL_PASSWORD: "password"
      MYSQL_DATABASE: "test-db"
    ports:
      - "3306:3306"
    restart: always
    networks: 
      - my_network

Once I run docker-compose up, my services get started and I can see that my MySQL server is ready to accept connections. Now what do I need to do to access the mysql terminal prompt from "outside" the container ? I remember seeing a teacher run another docker container (from a new terminal), and access the MySQL command prompt, enabling him to manage the database by hand, from another terminal window, but I can't remember the command exactly.

I tried running a new Docker container like this :

docker run -it --rm --name mysqlterm \
  --network="compose_project_my_network" \
  --link mysql mysql:5.7 \
  sh -c 'exec mysql \
  -h "localhost" -P 3306" \
  -uroot \
  -ppassword'

But unfortunatly, the container can't connect to the MySQL server, giving me the following error : ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2).

I guess the "localhost" or 3306 port are wrong ? What should I put in these parameters ?

Thanks in advance for your answers :)

Upvotes: 4

Views: 6420

Answers (1)

David Maze
David Maze

Reputation: 158837

You need an ordinary MySQL client; if your host's package manager (Debian/Ubuntu APT, MacOS Homebrew, ...) has a packaged named something like mysql-client, that's it.

When you run mysql, that tool does not interpret localhost as a host name but rather as a signal to use a Unix socket, so you need to use the corresponding IP address 127.0.0.1 instead. (If the database is running on a different system, use its DNS name or IP address: this is indistinguishable from running the database directly on the host outside of Docker.)

So from the host run:

mysql -h 127.0.0.1 -u root -p

The default port 3306 matches the published ports:, and you'll be prompted to interactively enter the password.

Upvotes: 3

Related Questions