PHP 虚拟化
在开发环境和生产环境中使用不同的操作系统运行你的应用程序,往往会在网站正式上线时引发各种莫名其妙的 bug。此外,当你与一个开发团队协作时,要确保所有人本地开发环境中使用的所有依赖库版本保持完全一致,也是一件非常棘手的事情。
如果你在 Windows 上开发,但最终要部署到 Linux(或任何非 Windows 系统)上,或者你正在一个团队中参与开发,你都应该考虑使用虚拟机 (Virtual Machine)。
这听起来似乎有些复杂,但除了大家熟知的 VMware 或 VirtualBox 等常规虚拟化软件之外,还有一些强大的辅助工具可以帮你只需几个简单的步骤,就能轻松搭建好完美的虚拟环境。
1. Vagrant
Vagrant 能够帮你在已知的虚拟化环境(如 VirtualBox)之上构建虚拟机,并且只需通过一个单一的配置文件,就能完成对这些环境的自动化配置。
这些虚拟机盒子 (boxes) 可以手动设置,但更推荐的方式是使用像 Puppet 或 Chef 这样的“自动化配置 (provisioning)”软件来替你完成这项工作。对基础环境盒进行自动化配置是一种极佳的方式,它能确保团队中生成的多个虚拟机拥有完全一致的配置,同时也免去了你手动维护那些复杂冗长的“安装配置”命令列表的麻烦。
你还可以随时“销毁 (destroy)”你的基础虚拟机环境,并在无需任何手动干预的情况下重新创建它,这让获取一个“全新”的干净安装环境变得轻而易举。
此外,Vagrant 会自动创建用于在你的宿主机(你的真实电脑)和虚拟机之间共享代码的文件夹。这意味着,你完全可以在你的宿主机上使用你最喜欢的编辑器来创建和编辑文件,然后直接在虚拟机内部运行这些代码。
2. Docker
Docker 是完整虚拟机的轻量级替代方案。之所以这么说,是因为 Docker 的核心理念全是关于“容器 (containers)”的。
一个容器就是一个构建块,在最简单的情况下,它只负责做一件特定的工作,比如专门运行一个 Web 服务器。“镜像 (image)”则是你用来构建这个容器的软件包——Docker 官方拥有一个装满各种镜像的庞大仓库。
一个典型的 LAMP (Linux, Apache, MySQL, PHP) 应用程序可能会包含三个独立的容器:一个 Web 服务器容器、一个 PHP-FPM 进程容器和一个 MySQL 数据库容器。就像 Vagrant 中的共享文件夹一样,你可以让你的应用程序文件留在宿主机原处,只需告诉 Docker 去哪里找到它们即可。
你可以直接通过命令行来生成容器(参见下文的示例),或者为了更方便地维护,你可以为你的项目编写一个 docker-compose.yml 文件,在里面详细指定需要创建哪些容器,以及它们之间该如何互相通信。
如果你正在开发多个不同的网站,并且希望获得“将每个网站安装在独立虚拟机上”所带来的隔离感,但又没有足够的硬盘空间或时间去保持每个系统都处于最新状态,那么 Docker 将是你的救星。
它极其高效:
- 速度快: 安装和下载速度更快。
- 省空间: 无论一个镜像被使用多少次,你只需要存储它的一份拷贝。
- 低能耗: 容器需要的内存 (RAM) 更少,并且它们共享同一个操作系统内核,因此你可以同时运行更多的服务器进程。
- 秒级启停: 停止和启动容器只需要几秒钟的时间,完全不需要等待漫长的完整服务器开机过程。
2.1 示例:在 Docker 中运行你的 PHP 应用
在你的电脑上安装好 Docker 之后,你只需一条命令就能启动一个 Web 服务器。
以下命令将会下载一个包含了最新版 PHP 且功能完备的 Apache 安装镜像,并将你本地的 /path/to/your/php/files 目录映射到容器的文档根目录中。随后,你就可以在浏览器中通过 http://localhost:8080 访问你的应用了:
docker run -d --name my-php-webserver -p 8080:80 -v /path/to/your/php/files:/var/www/html/ php:apache这条命令会初始化并启动你的容器。
-d参数:让容器在后台静默运行。- 停止容器:只需运行
docker stop my-php-webserver。 - 再次启动容器:运行
docker start my-php-webserver(之前输入过的其他参数都不需要再写一遍了)。
3. 深入学习 Docker
上面的命令展示了运行一个基础服务器的快捷方式。但 Docker 能做的远不止于此(Docker Hub 上有成千上万个预构建的镜像等着你)。
请花点时间学习相关的专业术语,并阅读官方的 Docker 用户指南以充分发挥它的潜力。极其重要的安全警告: 绝对不要在没有检查其安全性的情况下,运行你随机下载的代码——非官方的镜像可能没有包含最新的安全补丁。如果有任何疑虑,请始终坚持使用官方仓库 (official repositories) 提供的镜像。
如果你不想从零手写配置,PHPDocker.io 这个网站可以为你自动生成运行全功能 LAMP/LEMP 堆栈所需的所有配置文件,并且支持你自由选择 PHP 的版本和所需的扩展。