Php 如何在Docker容器中访问主机MySQL服务器?

Php 如何在Docker容器中访问主机MySQL服务器?,php,mysql,apache,docker,docker-compose,Php,Mysql,Apache,Docker,Docker Compose,我的主机上有一个MySQL服务器,我希望我的docker容器连接到它,而不是创建一个MySQL容器 在我的应用程序配置文件中,我使用的是localhost,就像使用Docker之前一样,但是连接被拒绝了 我正在使用docker compose,这是我的.yml: version: "3.2" services: php: build: context: './dockerfiles/php/' args:

我的主机上有一个MySQL服务器,我希望我的docker容器连接到它,而不是创建一个MySQL容器

在我的应用程序配置文件中,我使用的是
localhost
,就像使用Docker之前一样,但是连接被拒绝了

我正在使用docker compose,这是我的
.yml

version: "3.2"

services:
    php:
        build: 
            context: './dockerfiles/php/'
            args:
                PHP_VERSION: ${PHP_VERSION}
        networks:
            - backend
        volumes:
            - ${PROJECT_ROOT}/:/var/www/html/
        container_name: acadbase_php

    apache:
        build:
            context: './dockerfiles/apache/'
            args:
                APACHE_VERSION: ${APACHE_VERSION}
        depends_on:
            - php
        networks:
            - frontend
            - backend
        ports:
            - "8080:80"
        volumes:
            - ${PROJECT_ROOT}/:/var/www/html/
        container_name: acadbase_apache

networks:
    frontend:
    backend:

volumes:
    data:
我的
/Dockerfile/php/Dockerfile

ARG PHP_VERSION=""
FROM php:${PHP_VERSION:+${PHP_VERSION}-}fpm-alpine

RUN apk update; \
    apk upgrade; \
    apk add libxml2-dev

RUN docker-php-ext-install mysqli soap mbstring xml pdo_mysql
ARG APACHE_VERSION=""
FROM httpd:${APACHE_VERSION:+${APACHE_VERSION}-}alpine

RUN apk update; \
    apk upgrade; \
    apk add vim;

COPY acadbase.conf /usr/local/apache2/conf/acadbase.conf
RUN echo "Include /usr/local/apache2/conf/acadbase.conf" \
    >> /usr/local/apache2/conf/httpd.conf
我的
/Dockerfile/apache/Dockerfile

ARG PHP_VERSION=""
FROM php:${PHP_VERSION:+${PHP_VERSION}-}fpm-alpine

RUN apk update; \
    apk upgrade; \
    apk add libxml2-dev

RUN docker-php-ext-install mysqli soap mbstring xml pdo_mysql
ARG APACHE_VERSION=""
FROM httpd:${APACHE_VERSION:+${APACHE_VERSION}-}alpine

RUN apk update; \
    apk upgrade; \
    apk add vim;

COPY acadbase.conf /usr/local/apache2/conf/acadbase.conf
RUN echo "Include /usr/local/apache2/conf/acadbase.conf" \
    >> /usr/local/apache2/conf/httpd.conf
我的
.env

PHP_VERSION=7.1
APACHE_VERSION=2.4
PROJECT_ROOT=.

您可以使用域-host.docker.internal(保存主机的内部ip)从容器连接到主机

您正在使用主机的环回地址。而是使用网络接口的inet(ip地址)。“eth0”应该是您的接口名。

无法从容器解析localhost。您应该使用本地机器的IP地址(例如:192.168.1.10),该地址应该可以从容器访问。还有,为什么不将MySQL容器添加到.yml文件中,并将卷链接添加到本地目录中,以便数据持久化。如果你愿意,我可以给你举个例子:)


祝你好运。

正如@StrahinjaTasic和@AvinashReddy所说,我需要使用我主机的IP,但它不能工作,因为我需要在MySQL本地服务器上做更多的事情

1-我需要允许数据库用户从容器IP(或从任何地方)连接,而不是仅从本地主机连接

#如果不是本地开发,请使用正确的IP
将**上的所有权限授予“[用户]@%”;
同花顺特权;
有关MySQL
GRANT
命令的详细信息,请参阅:

2-我需要更改MySQL配置文件,使其不仅可以侦听本地主机,还可以侦听容器IP(或everywhere)

在我的例子中,配置文件是
/etc/mysql/mysql.conf.d/mysqld.conf

# use the correct IP if it is not for local development
bind-address = 0.0.0.0

之后,我将主机的IP和数据库用户凭据放在应用程序配置文件中,它就工作了


注意:要获取容器IP,请参见

我得到了以下异常:PDO异常:PDO::_构造():php_网络_getaddresses:getaddrinfo失败:名称未解析我看到了此主题,我已经得到了主机IP,问题是当我使用它时,我收到了504超时我得到了此异常:PDO异常:PDO:_u构造():php\u network\u getaddresses:getaddrinfo失败:名称未解析您是否使用了ip或主机名?尝试使用IP。无法在容器内解析DNS名称。我尝试使用从
/sbin/IP route | awk'/default/{print$3}获得的IP“
但是现在我得到了一个504 timeout您没有从hostport:containerport在docker-compose.yaml中进行任何端口映射这使容器内的进程能够访问在host@ScottStensland但如果我这样做了,我应该使用什么IP和我的应用程序中创建的端口来进行连接?无。。。查看“8080:80”的当前apache端口设置,它只是将主机端口8080映射到容器端口80。。。对sql执行类似操作port@ScottStensland我的应用程序配置文件中有一个字符串:“mysql:host=localhost;dbname=admin'。如果我只创建一个新的端口连接“3306:3307”,我将不能使用“localhost”作为主机,因为它指向容器,而不是主机。我甚至无法创建这样的端口,因为当我这样做时,启动userland proxy:listen tcp 0.0.0.0:3306:bind:address已经在使用中,我无法使用本地机器的IP地址,它无法工作。我知道如何在容器中使用MySQL,但这里我们有一个生产数据库服务器,所以我想在本地docker环境中使用我的本地MySQL服务器,以帮助我在生产中仅更改IP。