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

Posted

技术标签:

【中文标题】如何使用 Docker 连接 php-apache 和 MySQL?【英文标题】:How can I connect php-apache and MySQL using Docker? 【发布时间】:2018-08-21 14:11:56 【问题描述】:

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

我拉取了php:7.0-apachemysql:5.7的图片,直播的版本相同。

我创建了一个 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: Uncaught Error: Call to undefined function mysql_connect() in /var/www/html/wp-includes/wp-db.php:1564 [...]

我是否以错误的方式链接这两个容器?

【问题讨论】:

自 PHP 7.0 起,mysql_* 函数已被弃用/删除。 wordpress 版本? @SebastianBrosch wordpress v4.9.4 还有一个wordpress 的图片,你可以试试。这是一个可能有帮助的指南:docs.docker.com/compose/wordpress/ 【参考方案1】:

最简单的方法是使用 docker-compose 将所有 docker 实例链接在一起,而不是通过 docker 命令链接。这是一个示例 docker-compose.yml 文件,应该可以满足您的要求:

version: '2'
services:
  achi-php-apache:
    image: php:7.0-apache
    ports:
     - "8080:80"
    volumes:
     - /home/achi/workspace/web/wordpress-template/:/var/www/html
    links:
     - achi-mysql
  achi-mysql:
    image: mysql:5.7
    volumes:
     - /var/lib/mysql
    ports:
     - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_USER: someuser
      MYSQL_PASSWORD: somepassword
      MYSQL_DATABASE: somedefaultdatabase

【讨论】:

谢谢,这个解决方案很干净,但我仍然遇到同样的错误。会不会是我的 php 图像缺少某些功能?不过我用的是官方7.0。 是的,我认为您可能需要更新 PHP 设置以允许 mysql_ 函数,但如果您可以更新您的 wordpress 以使用 mysqli_ 函数,那会更安全。【参考方案2】:

您的问题不在于容器之间的连接。问题是您的 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:

您需要与docker-compose.yml 文件位于同一目录中的以下Dockerfile

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.yml 文件所在的文件夹中执行命令docker-compose up。创建容器并运行后,您应该可以访问 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:

【讨论】:

谢谢,我用的是你描述的第一种方法(不是wordpress图片)。

以上是关于如何使用 Docker 连接 php-apache 和 MySQL?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 PHP docker 容器无法查找 MYSQL 容器的主机名?

Docker:如何安装 PHP 7.4 扩展 ext-http?

使用 docker compose 的最佳部署策略(LAMP 堆栈)

docker 自定义镜像

Docker Compose搭建LAMP环境

AngularJS 和 Silex 的 CORS 问题(PHP - Apache)