第二章 . 在 Docker 中运行 PHP 脚本

在我们开始构建应用程序之前,先了解一下如何在Docker中运行一个PHP脚本。我们从编写一个经典的Hello World开始
PHP脚本如下:

  1. <?php echo "Hello World!";

你可以在虚拟机或者笔记本的终端上运行这个脚本(假设你已经安装了PHP)。你应该可以看到终端输出 Hello World !

Docker 镜像介绍

Docker 在一个容器中运行每个进程。所有这些容器都在主机上运行,这是你在这本书里的电脑。一旦应用程序准备好进入生产环境,服务器(或多个服务器)将充当 Docker 主机。
每个运行的容器后面都有一个“镜像”。Docker 镜像是由软件开发人员使用 dockerfile 创建和维护的。换句话说,如果您想从头创建自己的 Docker 镜像,那么首先要创建一个新的Dockerfile,然后“构建”一个镜像,然后在容器中 “运行” 该镜像。
diagram2.png
通常我们不需要从头构建镜像。大多数流行的软件(包括PHP)都有由软件开发人员或感兴趣的社区维护的镜像。在这没必要构建一个全新的镜像,但是稍后我们将会讲解到如何通过编写自己的 Dockerfile 来扩展现有镜像。
Docker 镜像可以构建并存储在主机上,也可以保存在远程 “registry” 中。除了维护核心的Docker 平台之外,Docker 团队还维护一个名为 Docker Hub 镜像管理平台,在这里可以免费存储公共镜像。大多数开源软件团队在 Docker Hub 上托管官方镜像,包括 PHP

获取PHP Docker 镜像

为了在容器中运行 hello.php 脚本,首先需要为 pull 一个 PHP 镜像,选择 PHP 的最新稳定版本。在终端中执行:

  1. $ docker pull php:latest

在你的终端应该可以看到类似这样的东西:

  1. latest: Pulling from library/php
  2. 7d63c13d9b9b: Pull complete
  3. 24b15dfd3cfa: Pull complete
  4. 64625c2e355f: Pull complete
  5. 275a8dd8f358: Pull complete
  6. 25140c092894: Pull complete
  7. 48e615a81d63: Pull complete
  8. 5b1d56720240: Pull complete
  9. 16d610fad528: Pull complete
  10. 68ac649f8fe5: Pull complete

这表示 Docker 正在拉取 PHP 最新版镜像。当拉取完成时,在终端会显示一个如下的状态,表明它已经获取了最新的版本:

  1. Digest: sha256:16573d7e56efa328e59066205870e66c0ad851491df9d0ee66c05bbe4961f8ed
  2. Status: Downloaded newer image for php:latest

注意:“latest”标记是大多数 Docker 映像用于其软件的最新版本的标准约定。不要不加区分地使用“latest”,因为它会自动检索到“latest”版本,即使有重大的版本更改。
因为 hello.php 脚本很简单,所以我们使用哪个版本的PHP并不重要,但是如果我们需要为一个现有项目运行一个旧版本的PHP呢? 这是 Docker 真正的亮点,因为我们只需要在运行Docker pull时指定PHP版本。例如,下载PHP 5.6镜像,只需运行如下代码:

  1. docker pull php:5.6

我们也可以使用这个方法来获得最新的、未发布的PHP版本(假设 PHP registry’s list 中至少有一个Beta 版本)。这对于需要经常使用多个 PHP 版本的开发人员非常有帮助。

将代码放入容器中

为了更好的往下进行,您必须稍微了解 Docker 如何访问主机系统上的文件。一个正在运行的容器不能直接读取或写入文件到您的计算机—容器本质上它是独立的系统。相反,我们要运行的容器数据来自于主机中挂载的 volume 或者在构建镜像时添加代码。
在本书的后面,我们将介绍如何用 Dockerfiles 构建 Docker 映像并以这种方式添加代码,但是对于这个简单的 Hello World! 示例,我们将 hello.php 的目录文件挂载到我们需要运行的PHP容器中。

在Docker中运行Hello World脚本

现在我们已经从Docker Hub中获取了一些PHP镜像,并且对Docker如何使用卷有了一些了解,我们可以在终端的容器中运行我们的脚本:

  1. docker run --rm -v $(pwd):/app php:latest php /app/hello.php

如果一切正确,应该可以看到输出Hello World!。恭喜你在Docker中运行了第一个PHP脚本!

它是如何运行的?

让我们回顾一下Docker命令以及它的含义:

  • docker run - 这是Docker的命令 在新容器中运行命令.有很多选项可供您输入,但我们将从基础知识开始。
  • —rm - 这告诉Docker在命令运行后“删除”容器。 或者,您可以保存容器以再次运行它,但如果您最终没有删除容器,它会占用空间,因此在大多数情况下最好设置删除选项。
  • -v $(pwd):/app - 这是Docker的命令 mount a volume. 通常,您将路径传递到主机系统、冒号、以及容器中文件夹的路径上。 卷是一个强大的工具,但是对于这个简单的示例,我们只是将当前目录(使用$(pwd))从终端挂载到新的 Docker 容器中的 /app 目录中。
  • php:latest - 这表示我们为这个容器使用的镜像。您也可以指定其他的PHP镜像(例如:PHP:7.0或PHP:5.6)来使用该语言的特定版本。
  • php /app/hello.php - 最后,这是 Docker 将在容器中运行的命令。由于我们将代码挂载在容器的/app目录中,因此必须从该目录运行脚本。

现在您已经对 Docker 有了基本的了解,并且可以在容器中运行 PHP 脚本,现在是时候构建一些更有用、更有趣的东西了。可以简单的休息一下,并阅读一些关于 Docker 的资料(https://doc,docker.com/) ,当您准备好之后,请继续阅读本文,开始在 Docker 中构建 PHP web 应用程序。