运行 Docker 容器

现在我们已经有了所需的两个基本 Docker 文件,让我们创建一个示例 PHP 程序,我们可以使用它来确保我们的容器按预期工作。

创建一个 phptdd/codebase/index.php PHP 文件,如下所示:

<?php
$dbHost         = "server-mysql";
$dbUsername     = "root";
$dbPassword     = "mypassword";
$dbName         = "mysql";

try {
    $conn = new PDO("mysql:host=$dbHost;dbname=$dbName", $dbUsername, $dbPassword);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    echo "MySQL: Connected successfully";
} catch(PDOException $e) {
    echo "Connection failed: " . $e->getMessage();
}

// Show PHP info:
phpinfo();
?>

在此阶段,我们已经创建了三个文件并具有以下目录结构:

image 2023 10 23 11 04 02 222
Figure 1. Figure 3.2 – Base files

让我们看一下这个目录结构:

  • Dockerfile:我们声明要使用哪个基本 Docker 镜像并添加安装 MySQL 扩展说明的文件

  • docker-compose.yml:我们为三个基本容器添加配置的文件,这些容器将作为我们的 Linux Apache MySQL PHPLAMP)堆栈运行

  • index.php:我们创建的 PHP 测试文件,用于测试 PHP 应用程序是否能够连接到 MySQL 容器,并显示 PHP 服务器的一些详细信息。

在运行容器之前,我们需要先构建运行容器所需的主镜像。

构建 Docker 镜像并运行容器

运行以下命令来下载基础映像并构建我们的 Docker 映像:

$ cd ~/phptdd/docker
$ docker-compose build

第一次尝试运行需要几分钟。该命令将从 Docker 存储库中提取我们在 Dockerfile 中声明的基础映像,并且还将执行我们在 Dockerfile 的第二行中添加的 RUN 命令。

构建完成后,我们可以使用 docker-compose.yml 文件运行我们配置的三个容器:

$ docker-compose up -d

运行命令后,您应该看到所有三个容器都被创建:

image 2023 10 23 11 09 11 452
Figure 2. Figure 3.3 – Containers created

现在,让我们看看容器是否正常运行;运行以下命令:

$ docker ps -a

您应该看到我们创建的三个容器,并且状态应表明它们正在运行:

image 2023 10 23 11 10 36 849
Figure 3. Figure 3.4 – Containers are running

从图 3.4 的列表中我们可以看到容器正在运行。

现在,让我们尝试运行我们编写的 PHP 测试程序:打开 Web 浏览器并尝试访问http://127.0.0.1:8081。如果您检查 docker-compose.yml 文件,您将看到我们已声明要将端口 8081 从主机路由到容器的端口 80。您还可以使用 docker ps -a 命令查看运行容器的端口路由。

您应该看到一条 MySQL:连接成功消息和标准 PHP 信息输出。这表明我们在 server-web 容器内运行的 PHP 应用程序已连接到 server-mysql 容器:

image 2023 10 23 11 12 43 241
Figure 4. Figure 3.5 – Test script: successful PHP to MySQL connection and PHP info

我们还配置了第三个容器来为我们的 phpMyAdmin 应用程序提供服务;这完全是可选的。使用网络浏览器访问 http://127.0.0.1:3333:

image 2023 10 23 11 13 26 157
Figure 5. Figure 3.6 – phpMyAdmin screen

现在您应该看到 phpMyAdmin 主控制面板,左侧栏列出了默认数据库。

这一切看起来都很好。我们配置的三个容器运行正常,可以相互通信和链接。现在,我们的 PHP 应用程序有了一个基本的开发环境。接下来,让我们尝试停止容器。

停止容器

有时您需要停止容器,例如当您想要重新加载新配置时,或者您只想停止不再需要的容器时。

要停止运行容器并删除其配置,请运行以下命令:

$ docker-compose down

现在,如果您尝试通过运行 docker ps 检查容器的状态,您将看到我们的三个容器已从列表中消失。您还可以使用 docker Kill <container_name> 来停止特定容器。

总结

在本章中,我们介绍了 Docker,并用它来创建和运行容器。容器是打包应用程序的实例。虽然我们已经看到容器是打包和隔离的,但它们也可以相互通信。例如,我们的 PHP 程序运行在 server-web 容器中,然后连接到运行 MySQL 服务器的 server-mysql 容器。

我们已经看到启动容器是多么简单。我们已经运行了两个 PHP 容器(server-webapp-phpmyadmin)和一个数据库容器(server-mysql),如果需要,我们还可以运行更多容器。我们将使用已创建的基本容器来构建 PHP 项目;我们将继续修改容器,并安装更多的库和工具。

在下一章中,我们将开始构建基础 PHP 应用程序。我们将详细介绍 PHP 的特性,以及当初决定使用 PHP 的原因。我们将安装 Laravel 框架,以简化解决方案的编写过程,从而把更多精力放在测试驱动开发 (TDD) 上,而不是编写大量的引导代码。