【问题标题】:Docker Wordpress connection to the database server on the localhostDocker Wordpress 连接到本地主机上的数据库服务器
【发布时间】:2019-08-08 22:50:45
【问题描述】:

我用命令运行docker wordpress image

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

我收到错误

建立数据库连接时出错

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

【问题讨论】:

    标签: mysql wordpress docker localhost database-connection


    【解决方案1】:

    默认情况下,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 语句。

    【讨论】:

    • 非常感谢您提供非常详细的答案。你帮了我很多,节省了我的时间。
    • 谢谢 int - 你采用了什么解决方案?我想我会在答案中添加一些内容。您也可以使用“主机网络模式”启动 wordpress 容器 - 我也相信这会解决问题。
    • 同时拥有 docker-compose 风格和普通的 ol' CLI 命令很棒,并且有助于巩固一些关于网络和卷的概念!谢谢!注意:我认为指定一个卷在技术上不是必需的,尽管创建一个没有卷的数据库容器会很愚蠢。
    • 很棒的答案
    【解决方案2】:

    找到一篇很棒的文章解释How to setup Wordpress using Docker

    问题是无法从 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 容器
    猜你喜欢
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 2012-11-02
    • 2015-08-22
    • 1970-01-01
    • 2020-02-18
    • 2016-04-27
    • 2016-02-19
    相关资源
    最近更新 更多