将 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_user
、db_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无法登录到wp-admin