使用Docker容器与PHP Apache和MySQL的PHP网站
容器技术每天都在增长。它是一种使应用程序开发更容易和更快的技术。它有一个简洁的架构,通过将一个应用程序划分为更小的服务,称为镜像,确保应用程序服务可持续地利用资源。这允许你独立设置每个服务,而不影响其他服务的运行。
在这种情况下,Docker提供了一个docker-compose文件,允许你设置所有的应用环境,并运行一些命令,以更优雅、更快速的方式完全设置好你的应用。
让我们以运行一个PHP应用程序为例。你将不得不安装所有你需要运行PHP脚本的环境。你需要在你的服务器/系统中安装一个apache服务器,可能还有一个MySQL数据库。然后将每个环境设置成允许你运行PHP驱动的网站。
有了Docker,事情就更容易管理了。Docker允许你将你的应用程序与每个服务设置为一个微服务运行。这样,你设置一个YML文件,将隔离你的应用程序需要运行的所有服务。该文件为你设置了PHP Apache服务器和MySQL数据库。你所需要的只是指定你的应用程序需要运行的参数。
容器提供的主要优势是一个可扩展的环境来运行你的应用服务。它确保持续集成和持续交付(CI/CD)管道的做法在整个团队中得到加强。所以你只需要与每个团队成员分享这个YML文件。这将在整个团队中设置所有必要的环境,无论他们运行的是什么操作系统。因此,团队成员可以在不破坏代码的情况下同步他们的工作。
本指南将告诉你我们如何使用Docker开发环境来。
- 设置并运行一个本地PHP Apache服务器实例。
- 提供一个动态的PHP驱动的网站。
- 设置一个MySQL数据库来运行SQL脚本,获取记录,并在PHP驱动的网站上打印它们。
我们将使用Docker中心的镜像来建立一个容器化的PHP开发环境。
前提条件
- 确保[Docker恶魔]已经安装在你的电脑上。
- 具有[PHP]和[SQL查询]的基本知识。
- 基本了解如何从Docker文件中[构建和运行Docker hub镜像]。
- 了解[容器]的工作原理。
- 基本了解如何执行[Docker和docker-compose命令]。
设置和测试Docker是否正在运行
在你下载并安装了Docker demon后,打开Docker引擎并确保引擎正在运行。

打开命令行并运行以下命令,以验证Docker是否正确安装在你的电脑上。
docker version
这将记录下与此命令行日志几乎相似的结果。

如果你是Docker的初学者,你可能会在运行上述命令时遇到这个Docker引擎错误。

要解决这个问题,请前往你的Docker桌面引擎,排除故障,将Docker重置为出厂/默认设置。

运行docker version 命令,现在应该可以正常工作了。而如果问题仍然存在,请搜索并找到必要的方法来正确设置你的Docker引擎。
我们从头开始;确保你的Docker引擎中没有运行容器和图像。运行docker container ls ,检查任何可用的容器。要删除一个Docker容器,运行docker container rm <container's name> 。并确保没有容器在运行。

铺设docker-compose YML文件
Docker-compose允许你设置你想在应用程序中运行的必要镜像的参数。在我们的案例中,我们将使用Docker hub的官方镜像,如PHP Apache和MySQL。我们将把它们的参数写在一个.yml 文件中。一个.yaml ,也可以。
继续创建一个项目文件夹,并在该文件夹中创建一个.yml 文件。
例如,docker-compose.yml 。
要设置一个docker-compose,你首先需要选择你想使用的Docker版本,你想提供的服务,以及你想运行的容器。
version: '3.8'
services:
php-apache-environment:
container_name:
设置并运行一个本地PHP Apache服务器实例
要设置一个PHP Apache容器,你需要指定以下环境。
- 容器名称 - 这只是一个随机的名字,你想给你的PHP容器命名。
例如:container_name: php-apache 。
-
容器镜像 - 这是官方的PHP镜像,是你想使用的PHP Apache的版本。在这个例子中,我们从Docker中心提取了
image: php:8.0-apache。 -
卷 - 这将为你的代码/源文件设置你现在的工作
src目录。如果你要运行一个PHP脚本,该文件就必须在该目录下。
比如说。
volumes:
- ./php/src:/var/www/html/
- 端口号。这定义了脚本将从哪些端口运行。它将设置一个Apache服务器端口与你本地计算机上的端口的映射。
比如说。
ports:
- 8000:80
这意味着我们正在设置一个Apache服务器来暴露80端口。8000端口会接触到PHP脚本,并在Docker容器内的浏览器中执行它们。
这就是你的docker-compose.yml ,看起来应该是这样的。
version: '3.8'
services:
php-apache-environment:
container_name: php-apache
image: php:8.0-apache
volumes:
- ./php/src:/var/www/html/
ports:
- 8000:80
让我们来测试一下。继续运行docker-compose up 。这将拉出所有的信息,下载Apache服务器,建立镜像,并运行容器。

如果你打开Docker桌面引擎,容器应该已经启动并运行了。

为了确保容器被设置为执行PHP脚本,在浏览器中打开你定义的本地主机帖子,即:http://localhost:8000/ 。

这表明容器被设置为运行一些PHP驱动的代码。
服务一个动态的PHP驱动的网站
现在让我们执行一些PHP代码并在浏览器中获得输出。你将从你在docker-compose的卷中定义的目录中执行这些脚本。
在这种情况下,我们使用的是./php/src 。
进入你的项目目录➙./php/src ,创建一个index.php 文件,开始编写你的PHP脚本。

一个简单的index.php 脚本。
<?php
echo "Hello there, this is a PHP Apache container";
?>
刷新你的浏览器(http://localhost:8000/),这个简单的PHP驱动网站的结果应该可以看到。

祝贺你!你现在有了一个容器化的PHP网站。
设置一个MySQL数据库容器
你可能想设置一个数据库来与你的网站互动。我们将创建另一个服务,在PHP容器内提供MySQL支持。
让我们把MySQL服务添加到docker-compose.yml 文件中。为了设置MySQL,我们需要定制一些环境,例如。
- 密码认证。为了使用和访问MySQL服务器,你需要设置认证环境,使你能够访问定义的MySQL服务器及其服务,如数据库。我们将使用
MYSQL_USER: MYSQL_USER和MYSQL_PASSWORD: MYSQL_PASSWORD来连接到MySQL,并访问MYSQL_DATABASE: MYSQL_DATABASE。 - 一个重启策略设置为
restart: always。每当任何定义的配置发生变化时,这将重新启动服务。
db:
container_name: db
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: MYSQL_ROOT_PASSWORD
MYSQL_DATABASE: MY_DATABASE
MYSQL_USER: MYSQL_USER
MYSQL_PASSWORD: MYSQL_PASSWORD
ports:
- "9906:3306"
我们需要在PHP容器内添加一些MySQL支持工具,以便这两个服务(db和php-apache)能够正常工作。这个工具包括mysqli。
在你的项目目录内,前往/php 文件夹,创建一个Docker文件,将其命名为Dockerfile ,并添加以下PHP配置。
FROM php:8.0-apache
RUN docker-php-ext-install mysqli && docker-php-ext-enable mysqli
RUN apt-get update && apt-get upgrade -y
这里我们已经创建了一个自定义的PHP Apache镜像和一个将安装mysqli的环境,mysqli是一个将PHP Apache连接到MySQL服务器的PHP扩展。
现在我们需要在docker-compose.yml 文件中的php-apache服务中建立这个自定义镜像。PHP Apache也依赖于db 服务来连接到MySQL。我们需要通过指定depends_on: 环境来配置它。
这就是你的docker-compose.yml 文件应该是这样的。
version: '3.8'
services:
php-apache-environment:
container_name: php-apache
build:
context: ./php
dockerfile: Dockerfile
depends_on:
- db
volumes:
- ./php/src:/var/www/html/
ports:
- 8000:80
db:
container_name: db
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: MYSQL_ROOT_PASSWORD
MYSQL_DATABASE: MYSQL_DATABASE
MYSQL_USER: MYSQL_USER
MYSQL_PASSWORD: MYSQL_PASSWORD
ports:
- "9906:3306"
运行docker-compose up ,拉出并设置好MySQL环境。MySQL将被添加到容器中。

使用PHP脚本运行SQL查询
让我们测试一下容器是否按预期工作。前往index.php 文件和下面的PHP MySQL连接代码。
<?php
//These are the defined authentication environment in the db service
// The MySQL service named in the docker-compose.yml.
$host = 'db';
// Database use name
$user = 'MYSQL_USER';
//database user password
$pass = 'MYSQL_PASSWORD';
// check the MySQL connection status
$conn = new mysqli($host, $user, $pass);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
} else {
echo "Connected to MySQL server successfully!";
}
?>
保存该文件并刷新你的http://localhost:8000/ 网页地址。

轰隆隆。你有了它。现在PHP Apache和MySQL环境已经设置好了,你可以开始开发你的PHP驱动的应用程序并与MySQL服务器通信。
设置PHPMyAdmin
MySQL的连接现在已经好了。让我们看看如何用PHP脚本从MySQL数据库中获取一些数据并显示在网页上。
假设你的应用程序与数据库进行交互;你可能希望有一个界面与你的数据进行交互。我们将添加PHPMyAdmin服务,为我们提供一个与MySQL数据库交互的接口。
让我们添加一个PHPMyAdmin服务,如下图所示。
phpmyadmin:
image: phpmyadmin/phpmyadmin
ports:
- '8080:80'
restart: always
environment:
PMA_HOST: db
depends_on:
- db
在浏览器上打开http://localhost:8080/ ,访问PHPMyAdmin。

要登录到Phpmyadmin面板,使用用户名为root ,密码为MYSQL_ROOT_PASSWORD 。密码已经在MySQL环境变量中设置好了 (MYSQL_ROOT_PASSWORD: MYSQL_ROOT_PASSWORD)

现在你可以看到我们定义的数据库已经被设置为MYSQL_DATABASE ,你可以开始与Phpmyadmin进行交互。
在PHP驱动的网站上获取记录并打印它们
创建一个数据库表并填入一些记录。选择数据库并执行以下查询。
drop table if exists `users`;
create table `users` (
id int not null auto_increment,
username text not null,
password text not null,
primary key (id)
);
insert into `users` (username, password) values
("admin","password"),
("Alice","this is my password"),
("Job","12345678");

继续用PHP写一个选择SQL查询。
<?php
//These are the defined authentication environment in the db service
// The MySQL service named in the docker-compose.yml.
$host = 'db';
// Database use name
$user = 'MYSQL_USER';
//database user password
$pass = 'MYSQL_PASSWORD';
// database name
$mydatabase = 'MYSQL_DATABASE';
// check the mysql connection status
$conn = new mysqli($host, $user, $pass, $mydatabase);
// select query
$sql = 'SELECT * FROM users';
if ($result = $conn->query($sql)) {
while ($data = $result->fetch_object()) {
$users[] = $data;
}
}
foreach ($users as $user) {
echo "<br>";
echo $user->username . " " . $user->password;
echo "<br>";
}
?>
刷新http://localhost:8000/ ,以查看结果。

我们只用了读操作来演示。继续尝试用docker化的PHP应用程序进行其他CRUD操作。
总结
我希望本教程能帮助你使用Docker容器建立一个PHP和MySQL开发环境。