继上一篇文章中安装了 Docker Desktop 并已经基本掌握 Container 构建与运行后,现在就来真正手动搭建一个 LAMP 环境以为开发环境服务。其实上一次我们已经成功运行了一整个 Debian 系统,如果只是想安装 LAMP,则安装过程与真实服务器上安装无异,但是我在这里需要利用到 Docker 的特性来更好地为开发服务,即各个服务隔离运行,比如 web 服务与数据库隔离运行,当 web 服务因为某些原因被玩坏了以后不会影响到数据库,只需重新创建一个 web 服务的 Container 再运行就可以了。
这里我先获取了 PHP 的官方镜像,一般比较流行的官方镜像在 Docker Hub 里搜索找到。

这里官方也详细提供了如果你想要实现安装特定组合或者特定版本所需的 tag 以及如果需要特定方式构建所需的 DockerFile,甚至右边还有 pull 命令使用方法。我们查看并且记下所需版本的 tag。

pull 与 run 的方式与上一次完全相同,只要在 Image 名称后面加上对应的 tag 即可。这里我们 run 的时候绑定一下主机和 Container 的目录(-v),这里把主机的目录(:之前的路径)与 Container 的网页存储目录绑定,这样这两个目录就是等同的了。
docker pull php:apache
docker run -d -p 80:80 -v [HOST DIRECTORY]:/var/www/html php:apache
安装完成后就可以直接看到这个 web 服务正在运行了,不过因为没有文件所以会显示一个错误。

同样的方法创建并运行另一个 Container 安装 mysql。与 PHP+Apache 有些不一样,这里在运行 Container 时要指定数据库密码否则就会无法登录访问数据库。
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=[YOUR PASSWORD] -d mysql
很方便,这两个 Container 就同时开始运行了,而且它们默认是在同一个网络 bridge 下,可以相互连接,就可以通过 PHP 访问数据库了。
有时候我们需要多次毁掉这两个 Container 并重新创建运行它们,这样一句一句创建显然是有些麻烦了。这个时候就有个很强大的东西 Docker Compose,可以配置好运行时的各种条件,使多个 Container 同时创建并运行。介绍可以在官方文档中看到,具体的使用文档在这里。
于是我撰写好了这个 docker-compose.yml 文件,放在一个准备好的目录下。可见语法其实和 run 命令是差不多的,稍微改一下写法即可。
services:
web:
image: php:apache
ports:
- "80:80"
volumes:
- ./test:/var/www/html
database:
image: mysql:latest
ports:
- "3306:3306"
command: --default-authentication-plugin=mysql_native_password
environment:
MYSQL_ROOT_PASSWORD: mysql

写完之后在该目录下运行以下命令就可以了,十分生动形象:
cd [DIRECTORY]
docker-compose up

可见这两个 Container 就开始正常运行了。

以后若是想初始化这整个组合只要再 Compose 一下就可以了,十分方便快捷。
到这里为止 Docker 的环境部署就十分完美了,在绑定的主机目录加入相应网页即可通过 localhost 访问。