Docker-Compose WordPress MySQL连接被拒绝。

28

我创建了一个小的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 version 1.9.1,build a34a1d5)时,它失败了。

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

当我查看 wordpress_1/etc/hosts 文件时,里面有关于 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容器?


1
你的MySQL容器正在使用哪个端口暴露3306?你是否有一个环境变量:MYSQL_PORT_3306_TCP_PORT? - Michael
谢谢你的回答。 正在运行在3306上,就像您可以在启动的Mariadb Docker消息(向右滚动)中看到的一样...仍然不知道为什么这个安装程序不再工作了。 - Harry
那是在容器内部,我正在询问Docker容器上暴露的端口:docker port <CONTAINER_ID> - Michael
感谢@Michael愿意提供帮助。服务器更新后进行完整的重启解决了所有奇怪的行为问题,设置重新开始工作了。 - Harry
1
由于最近这个话题很活跃,我想指出 WORDPRESS_DB_HOST 应该指向 docker-compose 文件中列出的数据库服务名称,对于上面的情况,应该是 "mysql" 而不是 "mariadb"。 - otravers
7个回答

12

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

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

restart: unless-stopped

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

sudo restart docker

或(适用于Ubuntu 15+)

sudo service docker restart 

下面是我使用的完整配置,用于设置WordPress与MariaDB:

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"

4
你救了我,老兄!谢谢。 - Luan Fagundes
请记住,您可能不应该将MySQL端口暴露给公众。在这种情况下,“ports”部分甚至可能不需要,因为WordPress实例可以使用在链接部分定义的链接与数据库通信。 - xxmicloxx

10

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


是的,重启Docker守护进程有帮助。 - lisak
4
重启Docker守护进程无法解决这个问题。 - Iliyass Hamza

3

我遇到了几乎相同的问题,但是只要重启 WordPress 容器就解决了:

$ docker restart wordpress

我希望这能帮助很多人。


2

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

$ docker logs XXXX将有助于指示关注区域。在我的情况下,MariaDB数据库会一直重新启动。

事实证明,所有这些东西都不适合微型512M单CPU服务。我从未收到过直接告诉我大小是问题的错误消息,但在将所有数据库启动时添加了这些内容后,我意识到我已经耗尽了内存。升级到1Gb、1 CPU服务就可以正常工作了。


非常感谢 @zipzit 帮我解决了我苦战数小时的问题。 - Bullwinkle

1
我正在使用您的docker-compose.yml文件,遇到了相同的问题。只是重新启动无法解决问题。经过将近一个小时的日志研究,我发现问题是:wordpress服务在完全启动之前就开始连接mysql服务。简单地添加depends_on是不会有帮助的。解决方法可能是在Up之前启动db服务器。当它完全启动后,运行docker-compose up。或者只需使用外部服务。Docker Compose等待容器X启动后再启动Y

1
你可以在WordPress服务中使用depends_on: database,但对我来说仍然无效。 - Iliyass Hamza

1

这意味着您正在尝试连接错误的主机。为了在本地主机上使用它,只需使用您的服务名称作为数据库主机示例,在您的情况下,它将是mysql,您可以通过指定localhost的名称以默认变量来修复此问题,如下所示:MYSQL_ROOT_HOST:localhost


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接