使用 docker 容器部署 PHPHub 论坛
一、启动 docker 容器
在前文中,用来运行 docker 容器的镜像文件已经下载完成,接下来就在此基础上,启动一个后台运行的容器,在当前的系统 shell 下执行命令:
$ docker run -itd -h phphub5 --name phphub5 -p 9999:80 andreisusanu/nginx-php5.6 bash
其中,-itd
这几个参数用来指定容器通过模拟 shell 的方式在后台运行,-p 9999:80
表示将生成的容器“系统”的80端口映射到宿主主机的9999端口,这样是为了将来能够在容器外部通过127.0.0.1:9999这一地址访问容器中的nginx(监听80端口)服务。
查看正在在后台运行的容器:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
364d8fac9529 andreisusanu/nginx-php5.6 "bash" 3 seconds ago Up 4 seconds 443/tcp, 0.0.0.0:8888->8888/tcp phphub5
可以看到已经在后台运行的容器信息,364d8fac9529
就是这一容器的全局唯一 ID,接下来使用 exec
命令进入这一容器的交互终端:
$ docker exec -it 364d8fac9529 bash
可以发现,shell 终端已经更换成了容器 shell,接下来就可以在容器的 shell 中配置部署 phphub 了。
二、配置容器环境
1、php 5.6+
首先看一下容器中的 php 版本是否符合要求:
$ php -v
PHP 5.6.25-1+deb.sury.org~trusty+1 (cli)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies
with Xdebug v2.4.0, Copyright (c) 2002-2016, by Derick Rethans
发现当前容器中的 php 版本已经是 5.6 以上,非常好,继续启动 nginx 和 fpm 服务:
$ sudo service nginx restart
$ sudo service php5.6-fpm restart
2、mysql 5.7+
由于容器中没有集成 mysql5.7 的环境,接下来还需要按照官方文档提供的方法来部署 mysql5.7 到容器中,官方文档:http://dev.mysql.com/doc/refman/5.7/en/linux-installation-debian.html
下载 mysql5.7 系列的 debian 安装包:
$ wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-server_5.7.14-1ubuntu14.04_amd64.deb-bundle.tar
下载完成之后解压,准备一些库文件:
$ tar xvf mysql-server_5.7.14-1ubuntu14.04_amd64.deb-bundle.tar
$ sudo apt-get install libaio1
$ sudo dpkg-preconfigure mysql-community-server_*.deb
以上命令执行时候会出现配置 mysql root 密码的步骤,接下来安装 debian 包文件,需要注意安装顺序:
$ sudo dpkg -i mysql-{common,community-client,client,community-server,server}_*.deb
完成以后,启动 mysql 服务:
$ sudo service mysql restart
$ mysql --version
mysql Ver 14.14 Distrib 5.7.14, for Linux (x86_64) using EditLine wrapper
如果能够成功输出上述 mysql 版本信息,说明 mysql5.7 已经成功安装。
3、redis 和 memcached
关键的 php 和 mysql 版本达到要求以后,为了快速部署 phphub, 采用远程安装的方式来部署 redis 和 memcached:
$ apt-get install redis-server
$ apt-get install memcached
安装完成以后,启动各自服务:
$ sudo service redis-server restart
$ sudo service memcached restart
默认情况家,redis 服务监听6379端口,memcached 服务监听11211端口,执行命令:
$ netstat -tnpl
可以查看到相应的端口已经被 redis 和 memcached 服务监听。
4、composer 工具安装
composer 工具是 laravel 官方推荐的 php 包管理工具,phphub 部署过程中需要 composer 的支持,首先下载 composer 安装脚本:
$ php -r "readfile('https://getcomposer.org/installer');" > composer-setup.php
执行脚本:
$ php composer-setup.php
执行完成以后,可以发现当前目录已经生成了 composer.phar 可执行文件,为了可以全局使用 composer ,将 composer.phar 移动到 PATH
变量的指定目录:
$ sudo mv composer.phar /usr/local/bin/composer
这样就可以在全局使用 composer 命令来安装 php 包了,此外,和配置 docker 加速器相同的原因,composer 使用的镜像源同样需要切换到国内镜像源,否则安装扩展包的过程会相当漫长!
$ sudo composer config -g repo.packagist composer https://packagist.phpcomposer.com
5、安装 node.js 和 npm
phphub 源代码的前端包管理工具需要用到 npm,npm 是 node.js 采用的包管理工具,接下来通过编译安装的方式,来部署最新版本的 node.js v6.4
$ wget https://nodejs.org/dist/v6.4.0/node-v6.4.0.tar.gz
$ tar zxvf node-v6.4.0.tar.gz
$ cd node-v6.4.0
$ ./configure
$ make & make install
安装 node.js 时,npm 工具也会自动安装,执行完成之后,查看 node.js 和 npm 的安装版本:
$ node -v
v6.4.0
$ npm -v
3.10.3
如果能成功查看到 nodejs 和 npm 的版本,说明两者已经成功安装。同样的, npm 官方镜像源的安装速度再国内会相当慢,因此需要切换 npm 官方镜像到国内,推荐使用淘宝提供的镜像服务:
$ npm install -g cnpm --registry=https://registry.npm.taobao.org
执行成功以后,就可以使用淘宝镜像提供的 cnpm 命令代替 npm 命令来安装前端包了,cnpm 安装时候,会自动使用速度较快的国内镜像源。
6、gulp
gulp 是一个用 node.js 编写的的前端自动化工具,phphub 前端代码的编译和压缩需要用到 gulp,使用 cnpm 全局安装 gulp 工具:
$ cnpm install --global gulp
三、部署 phphub 代码:
1、克隆源代码
必须的环境已经配置完成,接下来就可以在容器中部署 phphub 代码了,使用 git 克隆项目源代码到目录 /home/html:
$ cd /home/html
$ git clone https://github.com/summerblue/phphub5.git
2、nginx 配置
由于采用 nginx 作为 web 服务器,因此需要指定网站的根目录到 phphub 代码源文件的所在目录。受限编辑 nginx 配置文件:
$ sudo vim /etc/nginx/sites-available/default
编辑内容为:
server {
listen 80;
root /home/html/phphub5/public;
index index.php index.html index.htm index.nginx-debian.html;
server_name localhost;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass 127.0.0.1:9000;
}
}
保存退出,重新加载 nginx 配置:
$ sudo service nginx reload
3、phphub 依赖包准备:
首先将目录切换到下载的 phphub 代码所在目录:
$ cd /home/html/phphub5
配置 laravel 环境变量:
$ cp .env.example .env
$ sudo vim .env
将配置文件中的 mysql 数据库配置信息修改成当前容器中的 mysql 配置信息(主机、用户和密码等)。然后开始安装依赖的 php 包:
$ sudo composer install
依赖包安装完成以后,利用 laravel 提供的 artisan 工具执行命令:
$ sudo php artisan est:install
安装 npm 前端依赖包:
$ sudo cnpm install
前端依赖安装完成以后,使用 gulp 编译之:
$ gulp
此外,还需要给 laravel 的缓存目录加入读写权限,方便 laravel 框架读写缓存文件:
$ sudo chmod 777 storage -R
$ sudo chmod 777 bootstrap/cache -R
至此,整个 phphub 项目就在容器中成功部署了,由于在最初启动容器的时候,已经将容器的80端口映射到了外部的9999端口,所以,可以在外部宿主机中通过127.0.0.1:9999来访问容器的80端口,容器中 nginx 服务会将来自80端口的请求转发到已经配置好的 phphub 目录中,整个项目就可以成功运行了,perfect!
浏览器运行的最终结果: