Отказ в соединении при попытке подключения к локальной базе данных mysql из контейнера Docker - PullRequest
0 голосов
/ 02 января 2019

У меня проблема с подключением к локальной базе данных mysql из контейнера Docker.Я использую docker-compose с двумя службами в контейнерах, база данных не находится в контейнере

У меня есть этот файл docker-compose:

version: '2'
services:
    web:
        build:
            context: ./
            dockerfile: web-dev.dockerfile
        volumes:
            - ./:/var/www
        ports:
            - "8080:80"
        links:
            - app
        network_mode: "bridge"
        dns:
            - 10.0.50.6
    app:
        build:
            context: ./
            dockerfile: app-dev.dockerfile
        volumes:
            - ./:/var/www
        network_mode: "bridge"
        dns:
            - 10.0.50.6

web контейнер - это служба nginxс этим Dockerfile:

FROM nginx:1.10

ADD ./vhost.dev.conf /etc/nginx/conf.d/default.conf

WORKDIR /var/www

и этим файлом конфигурации:

server {
    listen 80;

    index index.php index.html;
    root /var/www/formapp/public;

    location / {
        try_files $uri /index.php?$args;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass app:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

контейнер app является службой приложений с этим Dockerfile:

FROM php:7-fpm

ENV USER=pasquale

RUN apt-get update && apt-get install -y libmcrypt-dev mysql-client \
    openssl zip unzip git nano wget libaio-dev iputils-ping

RUN mkdir -p /opt/oracle/instantclient_10_2
# Download files from in oracle folder:
#   https://agora.zanichelli.it/downloads/basic-10.2.0.5.0-linux-x64.zip
#   https://agora.zanichelli.it/downloads/sdk-10.2.0.5.0-linux-x64.zip

ADD oracle/basic-10.2.0.5.0-linux-x64.zip /opt/oracle/basic-10.2.0.5.0-linux-x64.zip
ADD oracle/sdk-10.2.0.5.0-linux-x64.zip /opt/oracle/sdk-10.2.0.5.0-linux-x64.zip
RUN unzip /opt/oracle/basic-10.2.0.5.0-linux-x64.zip -d /opt/oracle \
    && unzip /opt/oracle/sdk-10.2.0.5.0-linux-x64.zip -d /opt/oracle \
    && ln -s /opt/oracle/instantclient_10_2/libclntsh.so.10.1 /opt/oracle/instantclient_10_2/libclntsh.so \
    && ln -s /opt/oracle/instantclient_10_2/libclntshcore.so.10.1 /opt/oracle/instantclient_10_2/libclntshcore.so \
    && ln -s /opt/oracle/instantclient_10_2/libocci.so.10.1 /opt/oracle/instantclient_10_2/libocci.so

ADD oracle/tns-admin/tnsnames.ora /opt/oracle/instantclient_10_2/network/admin/tnsnames.ora
ENV LD_LIBRARY_PATH /opt/oracle/instantclient_10_2/

RUN docker-php-ext-install pdo_mysql \
    && pecl install mcrypt-1.0.1 \
    && docker-php-ext-enable mcrypt \
    && pecl install mongodb \
    && docker-php-ext-enable mongodb \
    && docker-php-ext-configure pdo_oci --with-pdo-oci=instantclient,/opt/oracle/instantclient_10_2,10.2 \
    && echo 'instantclient,/opt/oracle/instantclient_10_2' | pecl install oci8 \
    && docker-php-ext-install pdo_oci \
    && docker-php-ext-enable oci8

RUN yes | pecl install xdebug \
    && echo "zend_extension=$(find /usr/local/lib/php/extensions/ -name xdebug.so)" > /usr/local/etc/php/conf.d/xdebug.ini \
    && echo 'xdebug.remote_enable=1' >> /usr/local/etc/php/conf.d/xdebug.ini \
    && echo 'xdebug.default_enable=1' >> /usr/local/etc/php/conf.d/xdebug.ini \
    && echo 'xdebug.remote_connect_back=1' >> /usr/local/etc/php/conf.d/xdebug.ini \
    && echo 'xdebug.remote_autostart=1' >> /usr/local/etc/php/conf.d/xdebug.ini \
    && echo 'xdebug.remote_handler="dbgp"' >> /usr/local/etc/php/conf.d/xdebug.ini \
    && echo 'xdebug.remote_port=9000' >> /usr/local/etc/php/conf.d/xdebug.ini \
    && echo 'xdebug.remote_host=0.0.0.0' >> /usr/local/etc/php/conf.d/xdebug.ini \
    && echo 'xdebug.remote_log=/var/www/xdebug.log' >> /usr/local/etc/php/conf.d/xdebug.ini

RUN mkdir -p /home/$USER
RUN groupadd -g 1000 $USER
RUN useradd -u 1000 -g $USER $USER -d /home/$USER
RUN chown $USER:$USER /home/$USER
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

WORKDIR /var/www
USER $USER

контейнеры с docker-compose -f docker-compose.dev.yml up --build -d работают нормально, а команда docker ps дает мне такой вывод:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES
7202e2862ef5        190todb_web         "nginx -g 'daemon of…"   9 hours ago         Up About an hour    443/tcp, 0.0.0.0:8080->80/tcp   190todb_web_1_3c628ae1c69b
d45c04d353d5        190todb_app         "docker-php-entrypoi…"   9 hours ago         Up About an hour    9000/tcp                        190todb_app_1_dd2ac7028b87

Я устанавливаю приложение lumen в папку своего проекта formapp, а затем я создал сеялку для вставки поддельных данных вмоя база данных, и из bash, если я запускаю /projectfolder/formapp$ php artisan db:seed, работает сеялка, и у меня выводится:

Seeding: UsersTableSeeder
Database seeding completed successfully.

Затем я создал маршрут для доступа к моей таблице пользователей из приложения lumen:

$router->get('users', function () use ($router) {
    return User::all();
});

у меня файл lumen env такой:

APP_NAME=Lumen
APP_ENV=local
APP_KEY=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
APP_DEBUG=true
APP_URL=http://localhost
APP_TIMEZONE=UTC

LOG_CHANNEL=stack
LOG_SLACK_WEBHOOK_URL=

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=form_db
DB_USERNAME=root
DB_PASSWORD=radiohead

CACHE_DRIVER=file
QUEUE_CONNECTION=sync

JWT_SECRET=JhbGciOiJIUzI1N0eXAiOiJKV1QiLC

, но если я пытаюсь подключиться с http://localhost:8080/users У меня ошибка lumen:

SQLSTATE[HY000] [2002] Connection refused (SQL: select * from `users`)

Я пытался изменитьDB_HOST, но я не могу решить эту проблему:

0.0.0.0 (SQLSTATE[HY000] [2002] Connection refused (SQL: select * from `users`));
172.17.0.1 (SQLSTATE[HY000] [1130] Host '172.17.0.2' is not allowed to connect to this MySQL server (SQL: select * from `users`));

172.17.0.1 - это мой incker-адрес docker0.

Как настроить мой проект для работы?

PS: приложение lumen запущено и работает, только соединение db, которое не работает

1 Ответ

0 голосов
/ 02 января 2019

Нельзя использовать localhost, если база данных и приложение не находятся на одном сервере.

Вам необходимо разрешить доступ, например:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'172.17.0.2' IDENTIFIED BY '<password>';

Вы можете заменить 172.17.0.2 на подстановочный знак %.

...