出于某些不可描述却又无可奈何的原因, 需要部署一个十年前的 PHP 老项目. 这个项目用到了 MySQL 5.5.54, PHP 5.3.10Apache 2.2.22, 最坑的是不知道是 PHP 牛逼还是这项目牛逼, 在 PHP 版本号上有一点差别网站就起不来了…

所以考虑祭出 Docker 这个配环境神器.

拉取基础镜像

Docker 中大多数镜像都是基于 Ubuntu 基础镜像进行了修改构建,但是如果我们也从 Ubuntu 开始构建,那么工作量可想而知. 因此选取一个合适的基础镜像可以加快配置速度,也能减少我们配置的工作量. Docker Hub 这时候就是个好东西了, 几乎你想要的都能找到. 根据需要,选取了两个镜像作为本次开发环境配置的基础镜像.

1
2
docker pull corvax19/php5.3.10-apache2.2.22-ubuntu14
docker pull mysql:5.5.54

拉取成功后可以通过 docker images 命令查看当前系统中的镜像:

Docker Imags

如果由于某些不可描述却又无可奈何的原因导致拉取速度过慢的话, 建议更换镜像站为七牛云, 阿里云和亚马逊(中国)的 Docker 镜像

启动 MySql 容器

MySQL 作为公共的基础服务, 这里配置的 MySQL 不仅可以供其他容器调用, 也可以使用本地连接后使用, 很方便调试程序.

1
docker run --name pbcls_mysql -e MYSQL_ROOT_PASSWORD=456123 -p 3306:3306 -d mysql:5.5.54

-d 表示以守护进程的模式启动一个名为 pbcls_mysql 的容器并且配置环境变量 MYSQL_ROOT_PASSWORD=456123, 就是设置 root 密码为 456123, 同时把容器的 3306 端口映射到本地的 3306 端口上(如果本地装有 MySQL 或者 MariaDB 等其他占用了 3306 端口的进程则可以映射到本地其他空闲端口上)

启动成功后就可以直接访问本地 3306 端口访问容器内的数据库了.

启动 PHP 和 Apache 容器

这个容器最主要的就是指定 /var/www/html 的位置方便启动网站, 同时为了能使用数据库, 还需要连接刚才已经启动的 MySQL 容器.

1
sudo docker run -d --name pbcls_webserver --link pbcls_mysql:db -p 81:80 -v /home/zhou/Documents/PHPProjects/sourcecode:/var/www -v /home/zhou/Documents/PHPProjects/sourcecode:/var/www/html corvax19/php5.3.10-apache2.2.22-ubuntu14

--link 用于把 Mysql 容器作为 db 组件链接到当前容器中, 这里在 /var/www/var/www/html 分别挂载了本地代码的位置 /home/zhou/Documents/PHPProjects/sourcecode.这样就方便修改代码, 每次在本地修改完代码, 直接刷新浏览器页面就可以看到生效的更改. 然后把 80 端口映射到 外部的 81 端口上.

如果一切正常, 现在访问 127.0.0.1:81 就可以看到这个十年祖传代码已经 run 起来了:

PBCLS WebServer

错误解决

WARNING: Error loading config file:

1
WARNING: Error loading config file: /home/zhou/.docker/config.json: stat /home/zhou/.docker/config.json: permission denied

其实可以忽略, 如果有强迫症的话, 可以考虑把这个文件加入用户组, 或者所有命令带上 sudo

数据库连接错误

  1. 首先检查这份祖传代码的 system/application/config/database.php 内的配置项;

  2. 打开容器的 shell, 查看 MySQL 数据库地址:

    1
    2
    docker exec -it pbcls_webserver bash
    env

    pbcls_webserner_env

  3. 把配置项的端口和地址修改为和容器环境变量一致, 然后刷新浏览器就 OKK 了:
    pbcls_webserver_set.png