Clément Baconnier
Clément Baconnier

Reputation: 6058

Connect to MariaDB with localhost from Docker container

First of I did read thoses links

But as a beginner with docker. It did not help me.

What you need to know:

./docker-compose.yml

###############################################################################
#                          Generated on phpdocker.io                          #
###############################################################################
version: "3.1"

services:

    mailhog:
      image: mailhog/mailhog:latest
      container_name: myapp-mailhog
      ports:
        - "8081:8025"

    redis:
      image: redis:alpine
      container_name: myapp-redis

    mariadb:
      image: mariadb:10.4
      container_name: myapp-mariadb
      working_dir: /application
      volumes:
        - .:/application
      environment:
        - MYSQL_ROOT_PASSWORD=root
        - MYSQL_DATABASE=myapp
        - MYSQL_USER=forge
        - MYSQL_PASSWORD=forge
      ports:
        - "8083:3306"

    webserver:
      image: nginx:alpine
      container_name: myapp-webserver
      working_dir: /application
      volumes:
          - .:/application
          - ./phpdocker/nginx/nginx.conf:/etc/nginx/conf.d/default.conf
      ports:
       - "8080:80"

    php-fpm:
      build: phpdocker/php-fpm
      container_name: myapp-php-fpm
      working_dir: /application
      volumes:
        - .:/application
        - ./phpdocker/php-fpm/php-ini-overrides.ini:/etc/php/7.3/fpm/conf.d/99-overrides.ini

./phpdocker/nginx/nginx.conf

server {
    listen 80 default;

    client_max_body_size 108M;

    access_log /var/log/nginx/application.access.log;


    root /application/public;
    index index.php;

    if (!-e $request_filename) {
        rewrite ^.*$ /index.php last;
    }

    location ~ \.php$ {
        fastcgi_pass php-fpm:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PHP_VALUE "error_log=/var/log/nginx/application_php_errors.log";
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        include fastcgi_params;
    }

}

./phpdocker/php-fpm/Dockerfile (slightly modified to add mysql_client and not installing git in a second RUN command)

FROM phpdockerio/php73-fpm:latest
WORKDIR "/application"

# Fix debconf warnings upon build
ARG DEBIAN_FRONTEND=noninteractive

# Install selected extensions and other stuff
RUN apt-get update \
    && apt-get -y --no-install-recommends install  \
        php7.3-mysql php-redis php7.3-sqlite3 php-xdebug php7.3-bcmath php7.3-bz2 php7.3-gd \
        git \
        mysql-client \
    && apt-get clean; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/*

./php-ini-overrides.ini

upload_max_filesize = 100M
post_max_size = 108M

I tried to use network_mode: host but it makes the webserver stopping with Exit 1

Upvotes: 3

Views: 15157

Answers (3)

LucianDex
LucianDex

Reputation: 647

If the problem with connection to DB persists:

We can interogate what IP DB container has:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container_name>

We'll receive container IP (eg: 172.21.0.3);

After this, we can place this IP into connection "host" section.

Enjoy!

Ref How can I access my docker maria db?

Upvotes: 0

Cl&#233;ment Baconnier
Cl&#233;ment Baconnier

Reputation: 6058

@F.Maden gave me the right direction. I accepted his answer but here's how I made it in details.

Basically has he said, I need to share mysqld.sock between my services mariadb and php-fpm

  1. The first step is to share a folder between both services. Since I already have /application that contains the docker config /application/phpdocker, I will reuse this one.

  2. I had to create a custom my.cnf file to edit the default mariadb config configuration and add a custom socket path:

./phpdocker/mariadb/my.cnf

[mysql]
socket = /application/phpdocker/shared/mysqld.sock

[mysqld]
socket = /application/phpdocker/shared/mysqld.sock
  1. Then I had to share the config file with my mariadb container

./docker-compose.yml

  mariadb:
  image: mariadb:10.4
  container_name: myapp-mariadb
  working_dir: /application
  volumes:
    - .:/application
    - ./phpdocker/mariadb/my.cnf:/etc/mysql/my.cnf # notice this line
  environment:
    - MYSQL_ROOT_PASSWORD=root
    - MYSQL_DATABASE=myapp
    - MYSQL_USER=forge
    - MYSQL_PASSWORD=forge
  ports:
    - "8083:3306"
  1. I created a folder ./phpdocker/shared with privileges 777 where mariadb will be able to create mysqld.sock (I couldn't start mariadb with 755. In my case this is only used on local not on production so it's fine)

From the terminal

$ mkdir ./phpdocker/shared && chmod 777 ./phpdocker/shared

And now test it!

From the terminal

$ docker-compose up -d --force-recreate --build
$ docker exec -it -u $(id -u):$(id -g) myapp-php-fpm /bin/bash

Once in the container

$ mysql -u root -p -h localhost --socket=/application/phpdocker/shared/mysqld.sock
$ mysql > select user();

+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+

Upvotes: 0

F.Madsen
F.Madsen

Reputation: 702

Ok but as remember it, localhost in mysql/mariadb means access thru the local unix socket. There are ways of sharing these between containers.

Have a look here Connection between docker containers via UNIX sockets

Upvotes: 2

Related Questions