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

时间:2019-08-14 19:27:28

标签: 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=.

4 个答案:

答案 0 :(得分:0)

您可以从具有域host.docker.internal的容器连接到主机,该域保存主机的内部ip。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

localhost无法从容器中解析。您应该使用可以从容器访问的本地计算机的IP地址(例如:192.168.1.10)。另外,为什么不只是将MySQL容器添加到.yml文件中,又将卷链接添加到本地目录中,以便数据持久存在。如果您愿意,我可以给您留下这样的例子:)

祝你好运。

答案 3 :(得分:0)

正如@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配置文件,以使其不仅可以监听localhost,还可以监听容器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?