背景
随着Docker的不断成熟,越来越多的站长以及运维人员选择Docker构建程序运行环境,另外由于国内的云服务厂商通常在新购主机时会给较大的优惠,而续费则优惠很少,本着尽量节省成本的原则,借助Docker自动构建运行环境,成为一个比较好的选择。本文针对的场景是一台云主机上运行多个版本的PHP的情况,LNMP架构。
宿主机配置
这里把运行Docker服务的服务器叫宿主机,目前Docker对于宿主机的系统是有要求的,简单来说,Centos 需要7以上,Ubuntu需要16以上。所以在购买或者升级云主机的系统时,需要注意系统的版本,通常选最新的版本是没错的,除非有特殊的需求。接下去以Centos为例,安装Docker的步骤如下:
- 删除旧版本
sudo yum remove docker \
docker-common \
docker-selinux \
docker-engine
- 安装对应的包
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
- 只选择稳定版本的包
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
- 安装 Docker (这里选择的社区版本,有钱的可以选择企业版)
sudo yum install docker-ce
- 启动Docker
sudo systemctl start docker
- 测试Docker
sudo docker run hello-world
这个命令将拉去hello-world镜像并运行,将输出hello world消息 7. 让Docker随系统启动
sudo systemctl enable docker
- 安装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
- 使用国内镜像 因为你懂得原因,直接从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启动所有服务啦。