如何使用mysql在docker中配置和运行旧的php 5.4 Web应用程序?

问题描述

我有一个基于php 5.4和mysql的旧应用程序。我在2015年进行了开发。我想使用docker运行该应用程序,因为更改单个应用程序的php版本不是可行的解决方案。

我所做的如下:

Dockerfile

FROM php:5.4-apache

COPY 000-default.conf /etc/apache2/sites-available/000-default.conf

RUN a2enmod rewrite

COPY . /var/www/html/
RUN chown -R www-data:www-data /var/www/html

RUN docker-php-ext-install mysql

CMD ["/usr/sbin/apachectl","-D","FOREGROUND"]

docker-compose.yml

version: "3.7"
services:
  webapp:
    build:
      context: ./
      dockerfile: Dockerfile
    ports:
      - "8000:80"
    volumes:
      - .:/var/www/html

    # first load the 'db' service
    depends_on:
    - db
    links:
      - db

  db:
      image: mysql:5.7
      restart: always
      ports:
      - "13306:3306"
      environment:
        MYSQL_USER: root
        MYSQL_PASSWORD: admin
        MYSQL_ROOT_PASSWORD: admin
        MYSQL_DATABASE: pizzabite
      volumes:
      - ./mysql:/var/lib/mysql

这里的问题是我正在使用旧的mysql方法(即mysql_connect()等)访问mysql。

database.php

<?php
// Connecting to the database server
$servername = "localhost:13306";
$username = "root";
$password = "admin";
$port = "13306";
$dbname = "pizzabite";


$connect = mysql_connect($servername,$username,$password) or die("<br/>Check your server connection...");

//  $connect = mysqli_connect($servername,$password,$dbname,$port); // I do not want to use mysqli_* function

$selectedDB = mysql_select_db($dbname) or die(mysqli_error());
//include('date.php');
?>
    

使用include()到处都包含此文件,但是使用docker运行时,此文件会显示错误:

Warning: mysql_connect(): No such file or directory in /var/www/html/database.php on line 10

Check your server connection...

使用 0.0.0.0:13306 时,出现此错误:

Warning: mysql_connect(): Connection refused in /var/www/html/database.php on line 10

Check your server connection...

docker-compose ps命令输出:

      Name                       Command               State                 Ports               
---------------------------------------------------------------------------------------------------
pizza_corner_db_1       docker-entrypoint.sh mysqld      Up      0.0.0.0:13306->3306/tcp,33060/tcp
pizza_corner_webapp_1   /usr/sbin/apachectl -D FOR ...   Up      0.0.0.0:8000->80/tcp 

解决方法

您正在尝试连接到localhost:13306,因为您的PC端口13306已转发到mysql容器。

但是,该代码是从php-apache容器执行的,因此'localhost'是容器,而不是您的pc。那里没有端口13306

您应该连接到db:13306,因为在docker-compose中,数据库容器称为db

此外,请确保在您的php容器中启用mysql:

RUN docker-php-ext-install mysql && docker-php-ext-enable mysql

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...