【问题标题】:docker-compose wordpress mysql connection refuseddocker-compose wordpress mysql连接被拒绝
【发布时间】:2016-03-08 05:23:50
【问题描述】:

我创建了一个小型的docker-compose.yml,它在部署小型 WordPress 实例时非常有用。它看起来像这样:

wordpress:
  image: wordpress:latest
  links:
   - mysql
  ports:
   - "1234:80"
  environment:
    WORDPRESS_DB_USER: wordpress
    WORDPRESS_DB_NAME: wordpress
    WORDPRESS_DB_PASSWORD: "password"
    WORDPRESS_DB_HOST: mariadb
    MYSQL_PORT_3306_TCP: 3306
  volumes:
    - /srv/wordpress/:/var/www/html/
mysql:
  image: mariadb:latest
  mem_limit: 256m
  container_name: mariadb
  environment:
    MYSQL_ROOT_PASSWORD: "password"
    MYSQL_DATABASE: wordpress
    MYSQL_USER: wordpress
    MYSQL_PASSWORD: "password"
  volumes:
    - /srv/mariadb:/var/lib/mysql

但是当我现在启动它时(可能是因为 docker 更新到 Docker 版本 1.9.1,构建 a34a1d5),它失败了

wordpress_1 | Warning: mysqli::mysqli(): (HY000/2002): Connection    refused in - on line 10
wordpress_1 | 
wordpress_1 | MySQL Connection Error: (2002) Connection refused

当我 cat /etc/hosts 中的 wordpress_1 时,有 MySQL 条目:

172.17.0.10 mysql 12a564fdbc56 mariadb

我可以 ping MariaDB 服务器。

当我docker-compose up 时,WordPress 被安装,并在多次重启后 MariaDB 容器打印:

Version: '10.0.22-MariaDB-1~jessie'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  mariadb.org binary distribution

哪个应该表明它正在运行,不是吗?

如何让 WordPress 能够连接到 MariaDB 容器?

【问题讨论】:

  • 你的 mysql 容器暴露 3306 的端口是什么?你有环境变量:MYSQL_PORT_3306_TCP_PORT?
  • 感谢您的回答。它在 3306 上运行,正如您在启动的 mariadb docker 消息(向右滚动)中看到的那样......仍然不知道,为什么这个设置不再工作了
  • 就是在容器里面,请问docker容器上暴露的端口是什么:docker port
  • 感谢@Michael 愿意提供帮助。服务器更新后完全重启解决了任何奇怪的行为,并且设置再次开始工作。
  • 由于这个主题最近很活跃,我会注意 WORDPRESS_DB_HOST 应该指向 docker-compose 文件中列出的数据库服务名称,在上面的例子中是“mysql”而不是“mariadb” "。

标签: wordpress docker mariadb docker-compose


【解决方案1】:

这只是意味着您尝试连接到错误的主机。为了在 localhost 中使用它,只需在您的情况下使用您的服务名称作为数据库主机示例,它将是 mysql 您可以通过使用像这样的默认变量指定 localhost 的名称来解决这个问题 MYSQL_ROOT_HOST: localhost

【讨论】:

    【解决方案2】:

    我遇到了几乎相同的问题,但只是重新启动 Wordpress 容器救了我:

    $ docker restart wordpress
    

    我希望这可以帮助很多人。

    【讨论】:

      【解决方案3】:

      这种行为的原因可能与最近的内核和 docker 更新有关。我在其他 docker-compose 设置中发现了其他几个连接问题。因此,我重新启动了服务器(不仅仅是 docker 服务),从那以后就再也没有遇到过这样的问题了。

      【讨论】:

      • 是的,docker daemon restart 有帮助
      • 重启 docker daemon 并不能解决这个问题。
      【解决方案4】:

      就我而言,我使用的是 Mysql(不是 MariaDb),但我遇到了同样的问题。 升级MySQL版本后,一切正常。

      可以看我的开源docker-compose配置:https://github.com/rimiti/wordpress-dockerized-environment

      【讨论】:

        【解决方案5】:

        我在这里也遇到了麻烦。我使用 docker-compose 在单个(微型)虚拟专用服务器上设置多个 wordpress 网站,包括 phpmyadminjwilder/nginx-proxy 作为控制器。

        $ docker logs XXXX 将有助于指出关注的领域。就我而言,MariaDB 数据库会一直重启。

        事实证明,所有这些东西都不适合微型 512M 单 CPU 服务。我从来没有收到直接告诉我大小是一个问题的错误消息,但是在加起来之后,我意识到当所有数据库都启动时,我的内存已经用完了。升级到 1Gb,1 个 CPU 服务工作得很好。

        【讨论】:

        • 非常感谢@zipzit 帮我解决了我打了几个小时的问题
        【解决方案6】:

        要解决这个问题,首先要做的是:

        将以下代码添加到 wordpress 和数据库容器(在 docker-compose 文件中):

        restart: unless-stopped
        

        这将确保您的数据库在 wordpress 容器尝试连接之前已启动和初始化。然后重启docker引擎

        sudo restart docker
        

        或(对于 ubuntu 15+)

        sudo service docker restart 
        

        这里是对我有用的完整配置,用 MariaDB 设置 wordpress:

        version: '2'
        
        services:
          wordpress:
            image: wordpress:latest
            links:
              - database:mariadb
            environment:
              - WORDPRESS_DB_USER=wordpress
              - WORDPRESS_DB_NAME=mydbname
              - WORDPRESS_TABLE_PREFIX=ab_
              - WORDPRESS_DB_PASSWORD=password
              - WORDPRESS_DB_HOST=mariadb
              - MYSQL_PORT_3306_TCP=3306
            restart: unless-stopped
            ports:
              - "test.dev:80:80"
            working_dir: /var/www/html
            volumes:
             - ./wordpress/:/var/www/html/
          database:
           image: mariadb:latest
           environment:
             - MYSQL_ROOT_PASSWORD=password
             - MYSQL_DATABASE=mydbname
             - MYSQL_USER=wordpress
             - MYSQL_PASSWORD=password
           restart: unless-stopped
           ports:
             - "3306:3306"
        

        【讨论】:

        • 你救了我,伙计!干杯
        • 请记住,您可能不应该向公众公开 MySQL 端口。在这种情况下甚至可能不需要“端口”部分,因为 WordPress 实例可以使用链接部分中定义的链接与数据库进行通信。
        【解决方案7】:

        我使用的是您的 docker-compose.yml,遇到了同样的问题。刚重启没有解决。研究了近一个小时的日志,我发现问题是:wordpress 服务在它完全启动之前就开始连接mysql 服务。简单地添加depends_on不会有帮助。Docker Compose wait for container X before starting Y

        解决方法可以是在 Up 之前启动 db 服务器。完全启动后,运行docker-compose up。或者只是使用外部服务。

        【讨论】:

        • 你可以在 wordpress 服务中使用depends_on: database,但这仍然不适合我