用Docker打造多版本PHP运行环境

背景

随着Docker的不断成熟,越来越多的站长以及运维人员选择Docker构建程序运行环境,另外由于国内的云服务厂商通常在新购主机时会给较大的优惠,而续费则优惠很少,本着尽量节省成本的原则,借助Docker自动构建运行环境,成为一个比较好的选择。本文针对的场景是一台云主机上运行多个版本的PHP的情况,LNMP架构。

宿主机配置

这里把运行Docker服务的服务器叫宿主机,目前Docker对于宿主机的系统是有要求的,简单来说,Centos 需要7以上,Ubuntu需要16以上。所以在购买或者升级云主机的系统时,需要注意系统的版本,通常选最新的版本是没错的,除非有特殊的需求。接下去以Centos为例,安装Docker的步骤如下:

  1. 删除旧版本
sudo yum remove docker \
                  docker-common \
                  docker-selinux \
                  docker-engine
  1. 安装对应的包
sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2
  1. 只选择稳定版本的包
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo
  1. 安装 Docker (这里选择的社区版本,有钱的可以选择企业版)
sudo yum install docker-ce
  1. 启动Docker
sudo systemctl start docker
  1. 测试Docker
sudo docker run hello-world

这个命令将拉去hello-world镜像并运行,将输出hello world消息 7. 让Docker随系统启动

sudo systemctl enable docker
  1. 安装Docker compose
sudo curl -L https://github.com/docker/compose/releases/download/1.19.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
  1. 使用国内镜像 因为你懂得原因,直接从docker官方仓拉取镜像会很慢,经常失败,所以需要使用墙内镜像。以阿里云docker镜像为例,首先去注册一个阿里云帐户,然后登陆,找到容器镜像服务,找不到的话可以访问这个地址(地址可能会失效) 阿里云容器镜像服务 在镜像加速器菜单,可以看到专属加速地址,拷贝这个地址,然后使用以下命令:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["您的专属加速地址"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

至此,宿主机算配置完毕啦。

编写docker-composer.yml

docker composer 适合单主机的情况下进行多容器编排,代码已经全部放到马云了。 地址https://gitee.com/linwx/Docker-LNMP

几个关键点

PHP版本指定

不同版本的PHP,用不同的服务名来标志,如php-fpm,和php54-fpm. 然后在nginx里连接的时候,指定相应的名字:

  links:
    - php-fpm:fpm
    - php54-fpm:fpm54

在相应的配置文件中,如site1站点是运行在PHP7版本的,对应的fastcgi_pass参数是fpm:9000:

 location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass fpm:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_intercept_errors off;
        fastcgi_buffer_size 16k;
        fastcgi_buffers 4 16k;
    }

site2站点是运行在PHP5.4版本上的,对应的fastcgi_pass参数是fpm54:9000:

    location ~ \.php$ {
        root   /var/www/html/bbs;
        fastcgi_pass   fpm54:9000;
        fastcgi_index  index.php;
	    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
	    fastcgi_read_timeout 600;
    }

容器的时间

涉及到时间和日期的操作,需要关注容器的默认时区,比如nginx的日志输出的时间,php的计划任务运行的时间,因此需要在容器编译的时候,就指定好默认的时区,在nginx和cron的dockerfile里可以看到对应的命令:

RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

cron容器

本着每个容器运行一个服务的原则,本文把cron服务也单独成一个容器,为了让cron容器正常运行,需要注意2点,一是容器的时区,上文已经提过;二是计划任务的列表,需要让在编译的时候写入,相应的dockerfile如下:

ADD crontab /etc/cron.d/cron
RUN chmod 0644 /etc/cron.d/cron
RUN crontab /etc/cron.d/cron
CMD ["cron", "-f"]

使用cron -f 命令,让cron保持在前台运行

快速使用

如果不想了解那么多细节,可以在配置完宿主机后,直接git clone https://gitee.com/linwx/Docker-LNMP.git 然后配置相应的站点nginx配置文件,就可以使用docker-compose up -d --build启动所有服务啦。

猜你喜欢

转载自my.oschina.net/u/248080/blog/1622690