将 Wordpress 站点移动到 Docker:建立数据库连接时出错

Posted

技术标签:

【中文标题】将 Wordpress 站点移动到 Docker:建立数据库连接时出错【英文标题】:Moving Wordpress site to Docker: Error establishing DB connection 【发布时间】:2019-02-10 15:47:25 【问题描述】:

我最近一直在使用 Wordpress 和 Docker 创建新站点,并且对它们的工作原理有了合理的了解,我现在希望将一些已建立的站点迁移到 Docker 中。

我一直在关注本指南:

https://stephenafamo.com/blog/moving-wordpress-docker-container/

我已按应有的方式进行了所有设置,但是当我访问我的 domain.com:1234 时,我收到错误消息“建立数据库连接时出错”。我已按照建议将 wp-config.php 中的 'DB HOST' 更改为 'mysql',并且我引入的站点中的所有 DB 详细信息都是正确的。

我已附加到 mysql 容器并检查了 db 是否存在并且使用了正确的用户,并且还通过 mysql CLI 确保 pw 是正确的。

SELinux 设置为许可,我没有更改任何目录/文件所有权或权限,对于后者,目录全部为 755,文件应为 644。

编辑:我应该提到数据库/数据及其下的所有内容似乎由用户/组“polkitd 输入”而不是 root 拥有。

当我在端口 1234 上浏览网站时(如预期的那样),除了 WP 容器的 500 条错误消息之外,Docker 日志并没有真正告诉我太多信息。

这是 docker-compose 文件:

version: '2'

services:
  example_db:
    image: mysql:latest
    container_name: example_db
    volumes:
      - ./database/data:/var/lib/mysql
      - ./database/initdb.d:/docker-entrypoint-initdb.d
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password123 # any random string will do
      MYSQL_DATABASE: mydomin_db # the name of your mysql database
      MYSQL_USER: my domain_me # the name of the database user
      MYSQL_PASSWORD: password123 # the password of the mysql user

  example:
    depends_on:
      - example_db
    image: wordpress:php7.1 # we're using the image with php7.1
    container_name: example
    ports:
      - "1234:80"
    restart: always
    links:
      - example_db:mysql
    volumes:
      - ./src:/var/www/html

欢迎提出建议,因为我没有想法!

【问题讨论】:

我认为你也需要在 WP 容器中传递这些东西 WORDPRESS_DB_HOST: example_db:3306 WORDPRESS_DB_USER: $WORDPRESS_DB_USER WORDPRESS_DB_PASSWORD: $WORDPRESS_DB_PASSWORD WORDPRESS_DB_NAME: $WORDPRESS_DB_NAME 我以前也遇到过类似的问题。 刚刚尝试过,不幸的是它没有工作。编辑:还是我需要将数据库变量 MYSQL_DATABASE 更改为 WORDPRESS 或反之亦然? 所以我在环境下为 WP 容器尝试了类似的方法:通过传递类似 WORDPRESS_DB_NAME: my domain_db 但它仍然是同样的问题并尝试使用类似 WORDPRESS_DB_NAME: $MYSQL_DATABASE 的东西抛出了关于变量不存在,所以将它们设置为空字符串,所以我猜不是这样。 【参考方案1】:

使用新版本的 docker-compose 它看起来像这样(如果你不想使用 PhpMyAdmin,你可以省略它):

version: '3.7'

volumes:
  wp-data:
networks:
  wp-back:

services:

  db:
    image: mysql:5.7
    volumes:
      - wp-data:/var/lib/mysql
    environment:
       MYSQL_ROOT_PASSWORD: rootPassword
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wp-user
       MYSQL_PASSWORD: wp-pass
    ports:
      - 8889:3306
    networks:
      - wp-back

  phpmyadmin:
    depends_on:
      - db
    image: phpmyadmin/phpmyadmin
    environment:
      PMA_HOST: db
      MYSQL_USER: wp-user
      MYSQL_PASSWORD: wp-pass
      MYSQL_ROOT_PASSWORD: rootPassword
    ports:
      - 3001:80
    networks:
      - wp-back

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    ports:
      - 8888:80
      - 443:443
    environment:
       WORDPRESS_DB_HOST: db
       WORDPRESS_DB_USER: wp-user
       WORDPRESS_DB_PASSWORD: wp-pass
    volumes:
      - ./wordpress-files:/var/www/html
    container_name: wordpress-site
    networks:
      - wp-back

数据库卷是一个命名卷 wp-data,而 wordpress html 是一个绑定挂载到您当前目录的 ./wordpress-files 。

【讨论】:

谢谢,我已经接受了其他人的评论,但我确实想使用 phpmyadmin,所以会试一试 好的!您可以在以下教程中找到很多信息:https://github.com/Nxtra/Docker-Compose-Wordpress 我曾在 docker 工具箱中尝试过其他版本,但没有成功,但这个对我有用。谢谢!【参考方案2】:

请查看以下撰写脚本。我试过并测试过。它工作正常。

version: '2'

services:
  db:
    image: mysql:latest
    container_name: db_server
    volumes:
      - ./database/data:/var/lib/mysql
      - ./database/initdb.d:/docker-entrypoint-initdb.d
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: password123 # any random string will do
      MYSQL_DATABASE: udb_test # the name of your mysql database
      MYSQL_USER: me_prname # the name of the database user
      MYSQL_PASSWORD: password123 # the password of the mysql user

  example:
    depends_on:
      - db
    image: wordpress:php7.1 # we're using the image with php7.1
    container_name: wp-web
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: me_prname
      WORDPRESS_DB_PASSWORD: password123
      WORDPRESS_DB_NAME: udb_test
    ports:
      - "1234:80"
    restart: always
    volumes:
      - ./src:/var/www/html

如果您遇到其他问题,请告诉我。

【讨论】:

谢谢,但它对我不起作用,所以在这一点上,我认为我身边还有其他一些问题,比如我的 .sql 文件可能已损坏?我将仔细研究并尝试使用不同的站点和数据库并报告回来,再次感谢。 嗯,这很奇怪!也许做一个码头清理,然后再试一次。我在一个新的设置上试过了。祝您好运,如果您遇到更多问题,请回复。 仍然没有进展,我一直在我的本地 Centos7 机器和云 centos7 vm 上尝试,现在我什至无法进入“建立数据库连接时出错”,而是可以带上所有容器没有任何错误,但是当我尝试打开该站点时,它会挂起很长时间并最终断开连接,并且在 mysql 容器日志中出现类似这样的错误我可以看到我所有的网站内容。似乎确实有很多人在讨论让数据库在 GitHub 上工作的问题 ..在 Centos/Fedora 上使用 Docker 似乎确实存在一些问题,例如必须更改 docker-storage 驱动程序才能使其工作,例如 help.nextcloud.com/t/…。我认为你的回答确实有帮助,所以我会接受。 好吧,我还没有在 Centos/Fedora 上测试过这个。看看我能不能弄到一台测试机器。听起来绝对是 Docker 本身的问题。祝你好运!【参考方案3】:

如果你想把它全部放在一个容器中,你可以在这里参考这个 repo, https://github.com/akshayshikre/lamp-alpine/tree/development

这里使用了来自 lamp-alpine 的图像 然后安装 mysql, php, apache2 (lamp stack) 并复制本地 wordpress demosite 和 db 用于演示目的

如果您不想要任何类型的持续集成部分,请忽略 .circleci 文件夹 检查 docker-compose 文件和 Dockerfile,环境变量在 .env 文件中

【讨论】:

我实际上想将 WP 和 MYSQL 分开,但我也会检查一下,谢谢【参考方案4】:

我和你分享我的方法

显示正在运行的版本,询问您是否一切顺利!

$ docker --version && docker-compose --version

运行 Docker Copose 文件

$ docker-compose -f docker-compose.yml up -d

等到快进之后

显示正在运行的容器和 Wordpress 容器的名称正在侦听端口 8000

 $ docker ps 

如果您按照他们网站上列出的步骤进行操作,您将在表格中看到如下所示的 WordPress 容器名称 https://hub.docker.com/_/wordpress

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES

xxxxxxxxxxxx        wordpress:latest    "docker-entrypoint.s…"   8 minutes ago       Up 8 minutes        0.0.0.0:8000->80/tcp   cms_wordpress_1

xxxxxxxxxxxx        mysql:5.7           "docker-entrypoint.s…"   8 minutes ago       Up 8 minutes        3306/tcp, 33060/tcp    cms_db_1

如果您使用以下地址检查浏览器:localhost:8000 您将收到消息“建立数据库连接时出错”

在 Wordpress 容器中启动 bash

$ docker exec -it cms_wordpress_1 bash

apt 更新失败,因为没有连接

$ apt update

打开新终端并显示当前的防火墙配置

$ sudo cat /etc/firewalld/firewalld-workstation.conf | greb 'FirewallBackend'
currently set to 'nftables'

将值设置为“iptables”

$ sudo sed -i 's/FirewallBackend=nftables/FirewallBackend=iptables/g' /etc/firewalld/firewalld-workstation.conf

确认新值

$ sudo cat /etc/firewalld/firewalld-workstation.conf | grep 'FirewallBackend'

重启 Firwalld 服务以应用更改

$ sudo systemctl restart firewalld.service

在浏览器中刷新正在运行的 Wordpress 会话,这很好。 干得好。

【讨论】:

【参考方案5】:

确保wp-config.php 文件具有与docker-composer yml 文件中为db_userdb_password 定义的凭据相同的凭据。我也有类似的问题,我删除了所有文件并重新安装,看到docker-composer up -d 将启动所有内容,但 mysql 设置的wp-config.php 文件内容未在 docker 中定义。所以我相应地对其进行了更改并最终开始工作

【讨论】:

【参考方案6】:

如果您按照本教程进行操作,https://stephenafamo.com/blog/moving-wordpress-docker-container/,您的网站将无法正常运行。因为它不会恢复数据库,您需要使用此命令手动恢复 initdb.d 目录中存在的 .sql 转储文件。

cat backup.sql | docker exec -i CONTAINER /usr/bin/mysql -u root --password=root DATABASE

我也遇到了这个问题,我的 CSS 无法正常工作。 当你有新的想法时请告诉我。

【讨论】:

【参考方案7】:

在某些情况下,此问题的可能原因可能是,您使用 docker compose up 创建卷,然后当您使用 docker compose down 时,您希望删除卷以及 docker 映像,但这不是如何它有效。

从doc 你可以读到这个:

对于需要在更新之间保留的数据,请使用主机或命名卷。

这隐含地意味着命名卷不会被down 删除,所以发生的情况是,当您执行up,然后向表中添加一行,然后执行后续down,然后在下一个 up 您将获得相同的旧卷,因此查询同一个表会得到您之前创建的同一行!

这与错误Error establishing DB connection 有什么关系,您可能会问。为了回答您的问题,我们假设一种情况:如果您在运行down 命令和第二个up 命令之间更改了 docker compose 文件中的一些 MYSQL 密码怎么办?

MYSQL 保留自己的数据,就像它的表中的任何其他数据一样,所以当您执行第二个up 时,Docker 会加载旧卷(由第一个 up 创建的卷)因此旧的凭证信息将被 MYSQL 使用,Docker 甚至没有机会在管理表中插入您的新信息(您在 docker compose 文件中更改的信息)。所以很明显,你会被拒绝。

因此,现在的解决方案将非常简单。要修复它,请执行以下操作:

docker-compose down -v

在运行down 时删除命名卷和图像,或执行以下操作:

docker volume rm [volname]

如果您之前完成了 down,现在您想删除命名卷。

【讨论】:

要查看卷名列表,请运行docker volume ls

以上是关于将 Wordpress 站点移动到 Docker:建立数据库连接时出错的主要内容,如果未能解决你的问题,请参考以下文章

Docker wordpress 多站点 - 要公开哪些端口?

移动 wordpress 站点后无法访问此站点

Wordpress:将多站点从服务器移动到本地主机

将站点移到子文件夹后,WordPress无法登录到wp-admin

将 wordpress 站点从一个本地主机转移到另一个本地主机

Wordpress:将本地主机数据库导入实时站点时出现问题