使用 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!

浏览器运行的最终结果:

screen