【问题标题】:Connection refused when trying to connect to local mysql database from docker container尝试从 docker 容器连接到本地 mysql 数据库时连接被拒绝
【发布时间】:2019-01-02 09:42:18
【问题描述】:

我在从 docker 容器连接本地 mysql 数据库时遇到问题。我在容器中使用 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 容器是一个带有这个 Dockerfile 的 nginx 服务:

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

我在我的项目文件夹formapp 中安装了一个 lumen 应用程序,然后我创建了一个播种器以在我的数据库中插入假数据,如果我从 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 连接,我会遇到此流明错误:

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 是我的 docker0 inet 地址。

如何配置我的项目以使其正常工作?

PS:lumen 应用已经启动并运行,只是数据库连接不工作

【问题讨论】:

标签: mysql docker docker-compose lumen host


【解决方案1】:

当数据库和应用不在同一台服务器上时,您不能使用localhost

您需要通过以下方式允许访问:

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

您可以将172.17.0.2 替换为通配符%

【讨论】:

  • 谢谢,它可以工作,但如果我必须再次播种我的数据库,我必须再次更改我的环境 DB_HOST。有没有办法管理这个设置?我必须从容器内播种我的数据库?
  • @ufollettu 你说数据库服务器不是 docker 容器,所以它不会改变。只需在 DB_HOST 中输入正确的主机名或 IP 地址即可。
  • @ufollettu 设置正确的地址后,主机不会改变,我不明白你的“再次播种数据库”是什么意思。只做一次。
  • 如果我设置 DB_HOST=172.17.0.1 并尝试 php artisan db:seed 我有一个错误 SQLSTATE[HY000] [1130] Host '10.0.38.77' is not allowed to connect to this MySQL server 。以同样的方式解决,我授予对 'root'@'10.0.38.77' 的访问权限,一切正常。谢谢
  • @ufollettu aaah 好的,现在我明白了。我想这是因为有内部和外部 IP 地址,尤其是在桥接网络中。您也可以在 MySQL GRANT 命令中使用通配符 %,但我建议您使用好的用户名和密码(不是 root)。
猜你喜欢
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 2021-06-24
  • 2021-04-26
  • 1970-01-01
  • 2020-09-21
  • 2021-11-16
  • 1970-01-01
相关资源
最近更新 更多