如何使用Docker容器与PHP Apache和MySQL的PHP网站

1,530 阅读8分钟

使用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引擎并确保引擎正在运行。

Running the Docker engine

打开命令行并运行以下命令,以验证Docker是否正确安装在你的电脑上。

docker version

这将记录下与此命令行日志几乎相似的结果。

Testing Docker version

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

Docker error

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

Solve Docker error

运行docker version 命令,现在应该可以正常工作了。而如果问题仍然存在,请搜索并找到必要的方法来正确设置你的Docker引擎。

我们从头开始;确保你的Docker引擎中没有运行容器和图像。运行docker container ls ,检查任何可用的容器。要删除一个Docker容器,运行docker container rm <container's name> 。并确保没有容器在运行。

No running Docker container

铺设docker-compose YML文件

Docker-compose允许你设置你想在应用程序中运行的必要镜像的参数。在我们的案例中,我们将使用Docker hub的官方镜像,如PHP ApacheMySQL。我们将把它们的参数写在一个.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-compose up

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

Docker engine container running

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

Apache server running

这表明容器被设置为运行一些PHP驱动的代码。

服务一个动态的PHP驱动的网站

现在让我们执行一些PHP代码并在浏览器中获得输出。你将从你在docker-compose的卷中定义的目录中执行这些脚本。

在这种情况下,我们使用的是./php/src

进入你的项目目录➙./php/src ,创建一个index.php 文件,开始编写你的PHP脚本。

A php Docker container

一个简单的index.php 脚本。

<?php
echo "Hello there, this is a PHP Apache container";
?>

刷新你的浏览器(http://localhost:8000/),这个简单的PHP驱动网站的结果应该可以看到。

Dockerized php website

祝贺你!你现在有了一个容器化的PHP网站。

设置一个MySQL数据库容器

你可能想设置一个数据库来与你的网站互动。我们将创建另一个服务,在PHP容器内提供MySQL支持。

让我们把MySQL服务添加到docker-compose.yml 文件中。为了设置MySQL,我们需要定制一些环境,例如。

  • 密码认证。为了使用和访问MySQL服务器,你需要设置认证环境,使你能够访问定义的MySQL服务器及其服务,如数据库。我们将使用MYSQL_USER: MYSQL_USERMYSQL_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将被添加到容器中。

MySQL image

使用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/ 网页地址。

MySQL connected successfully

轰隆隆。你有了它。现在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 login

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

Phpmyadmin

现在你可以看到我们定义的数据库已经被设置为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");

Db inserted records

继续用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/ ,以查看结果。

MySQL select results

我们只用了读操作来演示。继续尝试用docker化的PHP应用程序进行其他CRUD操作。

总结

我希望本教程能帮助你使用Docker容器建立一个PHP和MySQL开发环境。