0
votes

How can I access to Mysql via docker running in a Vagrant guest from Mac Os host?

My Vagrant file to run Ubuntu (guest) on Mac Os (host)

Vagrant.configure("2") do |config|
  config.vm.box = "hashicorp/bionic64"
  config.vm.provision "docker"
  config.vm.network :forwarded_port, guest: 80, host: 8000
  config.vm.network :forwarded_port, guest: 3306, host: 33060
  config.vm.provision :shell, path: "bootstrap.sh"
end

Then I

vagrant up

And

vagrant ssh

Inside the VM cd /vagrant, I can run docker-compose up -d with:

version: '3.3'

services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    ports:
      - "8000:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress

volumes:
  db_data: {}

And I can access to mysql as well from Ubuntu (Vagrant guest):

mysql -uwordpress -pwordpress -h 172.18.0.2

The server IP was given by docker inspect vagrant_db_1

But how can I access to the same mysql server from Mac Os host?

1

1 Answers

0
votes

I made few changes to the Vagrantfile and docker-compose.yml and tried it using a db client from my vagrant host. It worked. I dont use mysql or mysql from command line. so, i cant say how to use this solution from commandline, but it should be very simple. You need to change the reference to the mysql host to localhost:3306.

My Vagrant file changes, (added ip 192.168.50.110 i think you can remove it after testing and mapped port 3306).

Vagrant.configure("2") do |config|  
config.vm.box = "hashicorp/bionic64"  
config.vm.provision "docker"  
config.vm.network "private_network", ip: "192.168.50.110",  
    virtualbox__intnet: true  
config.vm.network :forwarded_port, guest: 80, host: 8000  
config.vm.network :forwarded_port, guest: 3306, host: 3306  
# config.vm.provision :shell, path: "bootstrap.sh"  
end  

docker-compose.yml (mapped port 3306 again).

version: '3.3'  

services:  
db:  
image: mysql:5.7  
volumes:  
    - db_data:/var/lib/mysql  
ports:  
    - "3306:3306"  
restart: always  
environment:  
    MYSQL_ROOT_PASSWORD: somewordpress  
    MYSQL_DATABASE: wordpress  
    MYSQL_USER: wordpress  
    MYSQL_PASSWORD: wordpress  

wordpress:  
depends_on:  
    - db  
image: wordpress:latest  
ports:  
  - "8000:80"  
restart: always  
environment:  
    WORDPRESS_DB_HOST: db:3306  
    WORDPRESS_DB_USER: wordpress  
    WORDPRESS_DB_PASSWORD: wordpress  
    WORDPRESS_DB_NAME: wordpress  

volumes:
db_data: {}

From my db client running on laptop (vagrant host), used these settings:

host - localhost  
port - 3306  
db/user/password - wordpress/wordpress/wordpress

I am able to connect to mysql from my osx host, running as docker image under vagrant. shutdown docker container and the connection fails.