运行 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();
?>
在此阶段,我们已经创建了三个文件并具有以下目录结构:

让我们看一下这个目录结构:
-
Dockerfile
:我们声明要使用哪个基本 Docker 镜像并添加安装 MySQL 扩展说明的文件 -
docker-compose.yml
:我们为三个基本容器添加配置的文件,这些容器将作为我们的Linux Apache MySQL PHP
(LAMP)堆栈运行 -
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
运行命令后,您应该看到所有三个容器都被创建:

现在,让我们看看容器是否正常运行;运行以下命令:
$ docker ps -a
您应该看到我们创建的三个容器,并且状态应表明它们正在运行:

从图 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
容器:

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

现在您应该看到 phpMyAdmin 主控制面板,左侧栏列出了默认数据库。
这一切看起来都很好。我们配置的三个容器运行正常,可以相互通信和链接。现在,我们的 PHP 应用程序有了一个基本的开发环境。接下来,让我们尝试停止容器。
停止容器
有时您需要停止容器,例如当您想要重新加载新配置时,或者您只想停止不再需要的容器时。
要停止运行容器并删除其配置,请运行以下命令:
$ docker-compose down
现在,如果您尝试通过运行 docker ps
检查容器的状态,您将看到我们的三个容器已从列表中消失。您还可以使用 docker Kill <container_name>
来停止特定容器。
总结
在本章中,我们介绍了 Docker,并用它来创建和运行容器。容器是打包应用程序的实例。虽然我们已经看到容器是打包和隔离的,但它们也可以相互通信。例如,我们的 PHP 程序运行在 server-web
容器中,然后连接到运行 MySQL 服务器的 server-mysql
容器。
我们已经看到启动容器是多么简单。我们已经运行了两个 PHP 容器(server-web
和 app-phpmyadmin
)和一个数据库容器(server-mysql
),如果需要,我们还可以运行更多容器。我们将使用已创建的基本容器来构建 PHP 项目;我们将继续修改容器,并安装更多的库和工具。
在下一章中,我们将开始构建基础 PHP 应用程序。我们将详细介绍 PHP 的特性,以及当初决定使用 PHP 的原因。我们将安装 Laravel
框架,以简化解决方案的编写过程,从而把更多精力放在测试驱动开发 (TDD) 上,而不是编写大量的引导代码。