Docker 的 Wordpress-MySQL 连接问题

Docker 的 Wordpress-MySQL 连接问题

当我将 WordPress 移到 linuxserver/swag 容器后面以启用 https 后,我就无法让 WordPress 与 MySQL 数据库通信。

我正在使用 Docker 版本 20.10.2、build 2291f61 和 docker-compose 版本 1.27.4、build 40524192;它们在运行 Debian 10 的 VPS 上运行。

这是我创建的 docker-compose.yml 文件。简而言之,我有三个容器:

-wordpress:一个 WordPress 容器

-mysql:wordpress 的数据库,以及

-certman:管理 SSL/TLS 证书的 linuxserver/swag(安全 Web 应用程序网关)容器。

version: "3.8"
services:
 mysql:
  image: mysql:latest
  container_name: mysql
  environment:
   - PUID=1000
   - PGID=1001
   - MYSQL_ROOT_PASSWORD=[password 1]
   - TZ=America/New_York
   - MYSQL_DATABASE=wordpress
   - MYSQL_USER=wpuser
   - MYSQL_PASSWORD=[password 2]
  ports:
   - 3306:3306
   - 33060:33060
  volumes:
   - /home/[my username]/appdata/mysql:/var/lib/mysql
  restart: unless-stopped

 swag:
  image: linuxserver/swag:latest
  container_name: certman
  cap_add:
   - NET_ADMIN
  environment:
   - PUID=1000
   - PGID=1001
   - TZ=America/New_York
   - URL=[my domain name]
   - SUBDOMAINS=www,
   - VALIDATION=http
   - EMAIL=[my email]
   - CERTPROVIDER=zerossl #used up weekly quota from let's encrypt troubleshooting already
  volumes:
   - /home/noreply/appdata/swag:/config
  ports:
   - 443:443
   - 80:80
  depends_on:
   - mysql
  restart: unless-stopped

 wordpress:
  depends_on:
   - mysql
  image: wordpress:latest
  ports:
   - 8080:80
  restart: unless-stopped
  volumes:
   - /home/noreply/appdata/swag/www/wordpress:/var/www/html
  environment:
   - WORDPRESS_DB_HOST=mysql
   - WORDPRESS_DB_NAME=wordpress
   - WORDPRESS_DB_USER=wpuser
   - WORDPRESS_DB_PASSWORD=[password 2 from above]
  container_name: 'wordpress'

运行此程序后,我转到 ~/appdata/swag/nginx/site-confs/default 并更改根位置,以便 nginx 使用 WordPress:

...
# main server block
server {
        listen 443 ssl http2 default_server;
        listen [::]:443 ssl http2 default_server;
        root /config/www/wordpress; #the only change is adding /wordpress here
...

重新启动 certman 容器并等待片刻后,https://[我的域名] 仅显示来自 WordPress 的“建立数据库连接时出错”页面。

从日志来看,我认为 certman 运行良好(我可以在浏览器中检查证书,并且日志以“Server Ready”结尾)。

如果我跑docker 日志 mysql,得到这个输出(我不认为这里有什么了不起的?):

2021-01-26 00:01:49-05:00 [Note] [Entrypoint]: Creating database wordpress
2021-01-26 00:01:49-05:00 [Note] [Entrypoint]: Creating user wpuser
2021-01-26 00:01:49-05:00 [Note] [Entrypoint]: Giving user wpuser access to schema wordpress
2021-01-26 00:01:49-05:00 [Note] [Entrypoint]: Stopping temporary server
2021-01-26T05:01:49.440142Z 13 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.23).
2021-01-26T05:01:50.967557Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.23)  MySQL Community Server - GPL.
2021-01-26 00:01:51-05:00 [Note] [Entrypoint]: Temporary server stopped
2021-01-26 00:01:51-05:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up.
2021-01-26T05:01:51.757509Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.23) starting as process 1
2021-01-26T05:01:51.770145Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2021-01-26T05:01:52.015633Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2021-01-26T05:01:52.134045Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock
2021-01-26T05:01:52.225683Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2021-01-26T05:01:52.225949Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
2021-01-26T05:01:52.231383Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
2021-01-26T05:01:52.254800Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.23'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server - GPL.

然而,docker 日志 wordpress返回:

WordPress not found in /var/www/html - copying now...
Complete! WordPress has been successfully copied to /var/www/html
[26-Jan-2021 05:01:37 UTC] PHP Warning:  mysqli::__construct(): (HY000/2002): Connection refused in Standard input code on line 22
MySQL Connection Error: (2002) Connection refused
MySQL Connection Error: (2002) Connection refused
MySQL Connection Error: (2002) Connection refused
MySQL Connection Error: (2002) Connection refused
MySQL Connection Error: (2002) Connection refused
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 192.168.32.4. Set the 'ServerName' directive globally to suppress this message
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 192.168.32.4. Set the 'ServerName' directive globally to suppress this message
[Tue Jan 26 05:01:52.428348 2021] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.38 (Debian) PHP/7.4.14 configured -- resuming normal operations
[Tue Jan 26 05:01:52.428437 2021] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'

我读这里2002 错误意味着指定的用户无法编辑数据库,但由于两者设置为环境变量的访问参数相同(数据库名称、用户和密码),我不知道该怎么做。我还尝试在 wordpress 容器中使用 bash shell 来 ping 数据库主机名(“mysql”),并且工作正常(安装 inetutils-ping 后),所以我认为这不是网络问题。mysql 容器也可以很好地 ping wordpress。

我尝试修复该问题但没有看到任何变化:

-重新启动 wordpress 容器,以防 WordPress 启动速度对于 mysql 来说太快(代替等待函数或其他东西),反之亦然

- 删除所有内容(关闭 docker-compose,然后修剪图像并删除 ~/appdata 中的卷文件夹)并重复设置,但这也不起作用(我第一次这样做的时候只短暂地起作用了,但是如果不对 .yml 进行任何更改,我就无法多次复制它;我所做的就是用完了我本周的 let's encrypt 配额来尝试复制成功)。

-使用非最新的 MySQL 和 WordPress 镜像(灵感来自

-使用 root 密码而不是 wpuser 将 wordpress 连接到 mysql(灵感来自,这与我在日志下方链接的页面相同)。

-使用docker-compose.yml中wordpress服务下的链接:mysql(灵感来自

还要注意的是,如果我从 docker-compose.yml 中删除 linuxserver/swag 内容并为 wordpress 容器设置 ports:80:80,我可以通过 http 获得 WordPress 设置屏幕。检查此工作实例的 wordpress 容器日志显示它短暂地出现了 2002 错误,但我认为它会自动解决:

[26-Jan-2021 05:48:24 UTC] PHP Warning:  mysqli::__construct(): (HY000/2002): Connection refused in Standard input code on line 22
MySQL Connection Error: (2002) Connection refused
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 192.168.112.3. Set the 'ServerName' directive globally to suppress this message
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 192.168.112.3. Set the 'ServerName' directive globally to suppress this message

如果我在 wordpress 下设置 80:80(绕过 certman)并保留 certman 容器(使用 443:443),http://[IP 地址] 就可以工作(我认为我在 ~/appdata/swag/nginx/site-confs/default 中的 nginx 配置默认将 http://[我的域名] 流量重新路由到 https,因此 http://[我的域名] 只是重新路由到 https 并且不起作用是有道理的)。

由于在 wordpress 下设置 80:80 有效,我知道 wordpress 实际上可以与 mysql 通信。但将其移到 certman/nginx 后面会导致数据库连接中断或类似情况,我一直无法弄清楚。

有人知道是什么原因造成的,如何修复或如何进一步排除故障吗?提前感谢大家。

答案1

我想我终于明白了。

看完之后,我在 wordpress 容器的 docker-compose.yml 文件中将镜像从 wordpress:latest 切换到 wordpress:fpm。之后,docker-compose up -d --force-restart 似乎解决了所有问题。

还要注意的是,该链接包含一个 docker-compose.yml 示例,该示例使用单独的 certbot 和 nginx 容器代替 linuxserver/swag 容器。该设置更轻量,并且写入将证书放在卷中(如果我这样做了,我可能就不会遇到达到他们为每个域颁发的证书的每周配额的问题)并使用暂存环境来测试所有内容。

还值得注意的是,那些关于 MySQL 连接错误的 wordpress 容器日志似乎只是由于 wordpress 容器启动速度更快,因为如果我在 MySQL 已经运行的情况下重新启动 wordpress 容器,它们就不会出现。

相关内容