【问题标题】:Apache with Docker shows a [2002] Can't connect to local MySQL server带有 Docker 的 Apache 显示 [2002] 无法连接到本地 MySQL 服务器
【发布时间】:2019-08-19 19:18:03
【问题描述】:

我使用 Mac OSX 和 MAMP。 我想为 web 项目制作一个 Docker 容器,因为它使用 php 5.5 版本,我不想对我的 MAMP 进行更改。 所以这里是 docker-compose.yml

version: '2'

services:
    www:
        build: "./docker/apache"
        volumes:
          - .:/var/www
          - ./docker/silexx.conf:/etc/apache2/sites-enabled/silexx.conf
        working_dir: "/var/www"
        command : "bash -c 'source /etc/apache2/envvars; apache2 -DFOREGROUND'"
        ports:
          - 80:80
        links:
          - mysql

    mysql:
        image: mysql:5.7
        restart: always
        environment:
          MYSQL_DATABASE: 'silexx_dev'
          MYSQL_ROOT_PASSWORD: 'root'
        ports:
          - 3306:3306

    pma:
        image: phpmyadmin/phpmyadmin
        environment:
         - PMA_ARBITRARY=1
        restart: always
        ports:
         - 8080:80
        volumes:
         - /sessions

这是 Dockerfile:

FROM  debian:jessie

RUN apt-get update
RUN apt-get install -y --force-yes apt-transport-https apache2 php5 php5-cli libicu-dev php5-gd php5-curl php5-mysql php5-memcached php5-intl php5-json php5-mcrypt curl sudo
RUN a2enmod rewrite

# install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

RUN apt-get install -y --force-yes make git locales gcc g++
RUN echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen
RUN locale-gen
ENV LC_ALL en_US.UTF-8

RUN rm /etc/apache2/sites-*/*
COPY default /etc/apache2/sites-available/default.conf
RUN a2ensite default

CMD "source /etc/apache2/envvars && apache2 -DFOREGROUND"
ENV LANG en_US.UTF-8

CMD "/etc/init.d/mysql start"

# forward request and error logs to docker log collector
RUN ln -sf /proc/1/fd/1 /var/log/apache2/access.log
RUN ln -sf /proc/1/fd/2 /var/log/apache2/error.log

EXPOSE 80

我做了一个小虚拟主机:

NameVirtualHost *:80

<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "/var/www/core/"
    ServerName demo.silexx.local
    ServerAlias demo.silexx.local
    #ErrorLog "logs/silexx.com-error_log"
    #CustomLog "logs/silexx.com-access_log" common
</VirtualHost>

然后我让 docker-compose up,我生成我的容器。

当我去控制台并 mysql -h localhost -P 3306 --protocol=tcp -u root -proot

效果很好!

但在我的导航器中出现 2002 错误... SQLSTATE[HY000] [2002] 无法通过socket '/var/run/mysqld/mysqld.sock'连接到本地MySQL服务器(2)

但是我已经修改了我的凭据...

define('DB_HOST', 'localhost');
define('DB_INTRANET', 'silexx_dev');
define('DB_INTRANET_UTI', 'root');
define('DB_INTRANET_PWD', 'root');

$oPDO = new PDO ('mysql:host=' . DB_HOST . ';dbname=' . DB_INTRANET, DB_INTRANET_UTI, DB_INTRANET_PWD);
$oPDO -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

老实说,我不明白... :s 请问你有什么想法吗?

谢谢。

【问题讨论】:

  • 有时localhost 不起作用但define('DB_HOST', '127.0.0.1'); (stackoverflow.com/questions/31413728/…)
  • @Nigel 你应该看看解决的答案:在这里,inside 一个容器,主机名必须是链接容器的名称。在容器之外,localhost127.0.0.1 的含义相同,因为现在几乎每个现代操作系统都将 localhost 别名为 127.0.0.1
  • @AlexRock,因为 OP 在 docker-compose.yml 中向主机公开 3306,这应该允许您通过主机进行连接。同样至于区别 - stackoverflow.com/a/31414252/1213708 - 并且错误表明它正在尝试使用 '/var/run/mysqld/mysqld.sock' 那么这将表明这是问题所在。
  • 对不起@Nigel 但亚历克斯是对的,那么我的容器就可以了。
  • 不,它不起作用。

标签: php mysql apache docker dockerfile


【解决方案1】:

您必须将应用的 host 数据库配置更改为链接到您的应用的数据库容器的名称。

在这里,在您的示例中,容器名称为 mysql,因此您需要进行此更改:

-define('DB_HOST', 'localhost');
+define('DB_HOST', 'mysql');

【讨论】:

    猜你喜欢
    • 2019-06-01
    • 2018-10-29
    • 2015-05-06
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 2019-10-08
    相关资源
    最近更新 更多