我的主机上有一个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(或从任何地方)而不是仅从localhost连接。
# 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和数据库用户凭据放入我的应用程序配置文件中,它开始工作了!
附注:要获取容器IP,请参阅如何从主机获取Docker容器的IP地址?