Docker WordPress连接本地数据库服务器。

4

我运行使用命令 docker wordpress 镜像

docker run --name  test-wordpress -p 8081:80 -d wordpress

MySQL 8 在 Windows 10 的本地主机上。数据库凭据有效。

我在 WordPress 设置中使用以下配置:

  • 数据库名称:wordpress(尚不存在)
  • 用户名:root
  • 密码:***
  • 数据库主机:localhost || 127.0.0.1 || host.docker.internal

我收到以下错误信息:

建立数据库连接时出错

正确的数据库主机是什么?

3个回答

12
默认情况下,Docker会将您的新容器连接到一个桥接网络。这意味着像 localhost127.0.0.1 这样的地址只是指容器本身,而不是主机。

解决这个问题的简单方法是将MySQL数据库放在一个独立的容器中。这样,您的容器就可以轻松地相互通信。

连接到主机上的MySQL数据库



如果您真的想要将容器中的服务与主机上的服务连接起来,您需要将容器连接到相应的网络上。

首先,您需要创建一个网络。假设您的本地机器具有固定的IP地址192.168.0.1,您应该能够使用以下命令创建网络:
docker network create -d bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 dockernet

接下来,您可以:

docker run --name  test-wordpress --net=dockernet -p 8081:80 -d wordpress

然后,您应该能够通过IP地址:192.168.0.1从容器内部引用主机。

创建带有WordPress和MySQL的堆栈

这里更好的选择是使用docker-compose创建一个应用程序堆栈定义,其中包括数据库和WordPress应用程序。

您可以创建一个类似于以下内容的docker-compose.yml文件:

docker-compose.yml

version: '3.3'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
       WORDPRESS_DB_NAME: wordpress
volumes:
    db_data: {}

然后使用以下内容开始堆栈:

docker-compose up

请访问:http://localhost:8000

请注意,数据库数据将存储在名为db_data的docker管理卷中。

有关安装docker-compose的详细信息可以在这里找到:https://docs.docker.com/compose/install/

使用 docker run 启动两个容器

同样可以通过简单的docker run命令来实现,像这样:

docker volume create db_data

docker network create mysqlnet

docker run --name test-mysql -e MYSQL_ROOT_PASSWORD=somewordpress -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=wordpress -v db_data:/var/lib/mysql --net=mysqlnet -d mysql:5.7

docker run --name test-wordpress -e WORDPRESS_DB_HOST=test-mysql:3306 -e WORDPRESS_DB_USER=wordpress -e WORDPRESS_DB_PASSWORD=wordpress -e WORDPRESS_DB_NAME=wordpress --net=mysqlnet -p 8081:80 -d wordpress:latest
您可以将mysql数据文件的映射更改为本地目录,只需省略docker volume create语句即可。

非常感谢您提供如此详细和优秀的答案。您帮助了我很多,节省了我的时间。 - user11221128
谢谢int - 你采用了什么解决方案?我想我会在答案中添加一些内容。你也可以使用“主机网络模式”启动wordpress容器 - 我相信这也将解决问题。 - Andreas Lorenzen
同时拥有docker-compose风格和普通的CLI命令非常棒,有助于巩固网络和卷的概念!谢谢!注意:我认为指定一个卷在技术上并不是必要的,但如果没有一个卷来创建DB容器会很愚蠢。 - Andrew Smith
太棒了的答案。 - thlik

2
被接受的答案不完整且不准确。您可以通过在运行docker run期间提供--network=host选项来非常容易地将运行在主机上的MySQL与运行在容器内部的wordpress连接起来。
Wordpress问题:唯一的警告是,默认设置下,wordpress无法连接到MySQL。在运行MySQL 5.7(及更高版本)的Ubuntu系统中,任何MySQL用户默认情况下都使用auth_socket插件进行身份验证,而不是使用密码。这在许多情况下可以提供更大的安全性和可用性,但当您需要允许像wordpress这样的外部不兼容程序访问用户时,也可能会使事情变得复杂。
为了使用密码作为用户连接到MySQL,则需要将其身份验证方法从auth_socket切换到mysql_native_password
解决方案:在传统的mysql_native_password模式下为wordpress数据库创建一个专用的mysql用户。
$> sudo mysql
mysql> CREATE USER 'wpuser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'wp_password';
mysql> CREATE DATABASE wordpress_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
mysql> GRANT ALL ON wordpress_db.* TO 'wpuser'@'localhost';
mysql> FLUSH PRIVILEGES;

运行 Wordpress 容器:
docker run --rm --name my_wordpress --network=host -e WORDPRESS_DB_USER=wpuser -e WORDPRESS_DB_PASSWORD=wp_password -e WORDPRESS_DB_NAME=wordpress_db -e WORDPRESS_DB_HOST=127.0.0.1 wordpress


这个应该运行在哪个端口上?当我浏览到127.0.0.1时,它没有显示出来。 - Miguel Stevens
默认情况下端口是80,请检查WordPress容器日志以确认您的服务器是否正在运行。 - Imtiaz Shakil Siddique

1

我找到了一篇很好的文章,讲解如何使用Docker搭建WordPress。

问题在于,WordPress容器无法访问MySQL容器。为了解决这个问题,我们需要创建Docker网络,并将两个容器连接起来。

让我们创建一个Docker网络-

> docker network create --attachable wordpress-network

现在使用以下命令将两个容器连接起来 -
> docker network connect wordpress-network mysql-container
> docker network connect wordpress-network wordpress-container

现在在浏览器中打开WordPress并将“mysql-container”设置为数据库主机。

我相信问题是如何连接到运行在主机上的现有数据库,而不是Docker容器。 - Milan Markovic

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