可以从docker容器外部连接到数据库,但不能从内部(在laravel中)连接到数据库

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可以从docker容器外部连接到数据库,但不能从内部(在laravel中)连接到数据库相关的知识,希望对你有一定的参考价值。

由于投票减少,我重构了这个问题。

它就像这样简单:

外码头集装箱:

➜  backoffice git:(master) ✗ php artisan tinker
Psy Shell v0.9.9 (PHP 7.2.15 — cli) by Justin Hileman
>>> $ur = app(MDiPaoloRepositoriesUserRepository::class)
=> AppInfrastructureRepositoriesDoctrineUserDoctrineRepository {#3159}
>>> $u = new MDiPaoloEntitiesUser
=> MDiPaoloEntitiesUser {#3295}
>>> $u->setEmail('one_email@gmail.com')
=> MDiPaoloEntitiesUser {#3295}
>>> $u->setPassword(password_hash('1234', PASSWORD_BCRYPT))
=> null
>>> $ur->save($u)
=> null
>>>

在docker容器内:

➜  backoffice git:(master) ✗ docker exec -it backoffice_web_1 bash
root@042969f0229c:/var/www/html# php artisan tinker
Psy Shell v0.9.9 (PHP 7.2.17 — cli) by Justin Hileman
>>> $ur = app(MDiPaoloRepositoriesUserRepository::class)
Doctrine/DBAL/Exception/ConnectionException with message 'An exception occurred in driver: SQLSTATE[HY000] [2002] Connection refused'
>>>

我觉得它与docker系统有关,比如两个容器之间的通信或我是如何构建它们的。

这是我的Dockerfile。

FROM php:7.2-apache

RUN docker-php-ext-install pdo_mysql && docker-php-ext-enable pdo_mysql
RUN apt-get update && apt-get install nano && mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"

RUN a2enmod rewrite
RUN service apache2 restart

ENV APACHE_DOCUMENT_ROOT=/var/www/html/public
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf

docker-compose文件:

version: '3.1'

services:
    web:
        build: .
        ports:
            - "8080:80"
        links:
            - mysql
        depends_on:
            - mysql
        volumes:
            - ./:/var/www/html
    mysql:
        image: mysql:5.7.25
        ports:
            - "3306:3306"
        environment:
            MYSQL_ROOT_PASSWORD: backoffice
答案

好的,我找到了解决方案。

在.env文件中,DB_HOST字段必须等于docker-compose.yml文件中mysql容器的名称,在我的例子中是mysql

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=dashboard
DB_USERNAME=root
DB_PASSWORD=backoffice

问题是现在我不能从外面访问它,但当然你总是可以去:

127.0.0.1    mysql

在你的hosts文件

以上是关于可以从docker容器外部连接到数据库,但不能从内部(在laravel中)连接到数据库的主要内容,如果未能解决你的问题,请参考以下文章

从 docker 主机外部远程连接到在 docker 容器上运行的 oracle 数据库

无法从 Docker 容器连接到外部 SQL Server

无法从 docker 容器连接到数据库 [重复]

sh 从外部连接到Docker容器中的Postgresql

使用 *** 从 Docker 容器内访问专用网络中的资源

Docker compose api无法连接到主机MongoDB数据库