问题描述
我有一个基于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