php - 如何访问Docker容器中的主机MySQL服务器?

标签 php mysql apache docker docker-compose

我的主机上有一个 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:

我的./dockerfiles/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

我的./dockerfiles/apache/Dockerfile:

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=.

最佳答案

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

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

# use the correct IP if it is not for local development
GRANT ALL PRIVILEGES ON *.* TO '[user]'@'%';

FLUSH PRIVILEGES;

对于 MySQL GRANT 命令详细信息,请参阅:https://dev.mysql.com/doc/refman/5.7/en/grant.html

2-我需要更改 MySQL 配置文件,让它不仅监听本地主机,还监听容器 IP(或任何地方)。

就我而言,配置文件是/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 和数据库用户凭据放入应用程序配置文件中,它就成功了!

P.S.:要获取容器IP,请参阅 How to get a Docker container's IP address from the host?

关于php - 如何访问Docker容器中的主机MySQL服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57500887/

相关文章:

php - SQL 数据库和 MQTT(Mosquitto 或 RSMB)

java - type2 的 mysql 数据库的驱动程序名称和 url 是什么

apache - CentOS7 无法启动 httpd 服务

javascript - 如何在MySQL数据库中更新数据后显示加载图像

php - 如何获取业务电子邮件 ID 以响应 paypal api

mysql - 在同一查询中对同一 WHERE 子句执行 COUNT 和 SUM

apache - 为什么RewriteCond%{REQUEST_FILENAME}!-d是必需的?

php - 如何将 https 请求重定向到 https::www

php - Git上传项目全站

mysql - 了解 InnoDB 可重复读隔离级别快照