php - 如何使用 Docker 连接 php-apache 和 MySQL?

标签 php mysql wordpress bash docker

我在实时服务器上有一个 Wordpress 站点,我想使用 Docker 在本地创建一个 LAMP 堆栈来测试。

我拉取了 php:7.0-apachemysql:5.7 的镜像,与 live 上的版本相同。

我创建了一个 MySQL 容器:

docker run -d --name achi-mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

我创建了一个 php 和 apache 容器并将其与 MySQL 链接:

docker run -d --name achi-php-apache --link achi-mysql:mysql -p 8080:80 -v /home/achi/workspace/web/wordpress-template/:/var/www/html php:7.0-apache

我在 localhost:8080 上收到以下错误:

fatal error :未捕获错误:调用/var/www/html/wp-includes/wp-db.php:1564 [...] 中未定义的函数 mysql_connect()

我是否以错误的方式链接了这两个容器?<​​/p>

最佳答案

您的问题不在于容器之间的连接。问题是您的 PHP/Apache 容器不支持 mysqli (或 PDO MySQL )。 WordPress 无法找到其他功能来连接 MySQL 数据库或您的 MySQL 容器。相反,WordPress 默认使用 deprecated and removed (since PHP 7.0) mysql_ function。您至少需要在 PHP 容器上安装 mysqli(如下所述)。

我还建议使用 docker-compose 文件通过一个命令安装和运行所有容器。

要创建您想要的容器,您可以使用以下 docker-compose.yml file :

version: "3"

services:
  achi-php-apache:
    build:
      context: ./
    container_name: achi-php-apache
    ports:
      - "8080:80"
    volumes:
      - /home/achi/workspace/web/wordpress-template:/var/www/html:rw
    depends_on:
      - achi-mysql
    networks:
      - wp-net
  achi-mysql:
    image: mysql:5.7
    container_name: achi-mysql
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: wp-dbname
    volumes:
      - wp-mysql-data:/var/lib/mysql
    networks:
      - wp-net

networks:
  wp-net:
    driver: bridge

volumes:
  wp-mysql-data:

您需要将以下 Dockerfile 放在与 docker-compose.yml 文件相同的目录中:

FROM php:7.0-apache

RUN docker-php-ext-install -j$(nproc) mysqli

Dockerfile 安装缺少的 mysqli 扩展,以便 WordPress 可以使用它。

您也可以使用 PDO MySQL 代替 mysqli 。在这种情况下,您可以使用以下 Dockerfile:

FROM php:7.0-apache

RUN docker-php-ext-install -j$(nproc) pdo
RUN docker-php-ext-install -j$(nproc) pdo_mysql

现在你可以在docker-compose up文件所在的文件夹中执行命令docker-compose.yml。创建容器并运行后,您应该能够访问 WordPress 站点 ( <ip-or-hostname>:8080 )。

wp-config.php 文件中,您需要使用以下常量:

define('DB_NAME', 'wp-dbname');
define('DB_USER', 'root');
define('DB_PASSWORD', '123456');
define('DB_HOST', 'achi-mysql');

您还可以使用 official WordPress image 安装 WordPress。在这种情况下,您可以使用以下 docker-compose.yml 文件:

version: "3"

services:
  achi-php-apache:
    image: wordpress:4.9.4-php7.0-apache
    container_name: achi-php-apache
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: achi-mysql
      WORDPRESS_DB_USER: root
      WORDPRESS_DB_PASSWORD: 123456
      WORDPRESS_DB_NAME: wp-dbname
    volumes:
      - /home/achi/workspace/web/wordpress-template:/var/www/html:rw
    depends_on:
      - achi-mysql
    networks:
      - wp-net
  achi-mysql:
    image: mysql:5.7
    container_name: achi-mysql
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: wp-dbname
    volumes:
      - wp-mysql-data:/var/lib/mysql
    networks:
      - wp-net

networks:
  wp-net:
    driver: bridge

volumes:
  wp-mysql-data:

关于php - 如何使用 Docker 连接 php-apache 和 MySQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49254178/

相关文章:

wordpress - 获取 WordPress 页面中所有自定义帖子类型的标题

PHP单元 |测试json返回

php - 如何在 php 中添加形状文件 (.shp) 并在 php 文件中使用该形状文件数据?

php - 从 PHP 回显 &lt;script&gt; 到 jQuery AJAX 会导致我的时间间隔出现问题

php - WordPress错误: A TimThumb error has occured

php - MySQL - 在不存在的地方插入

javascript - 我想读出我的多重上传表单的文件名,并且我想将其包含在数据库中

php - Float left 在 Drupal 表单中无法正常工作

php - store 函数不将数据保存到数据库

mysql - Rails mysql ELF header 错误