同福

使用php:7.4-apache-buster镜像部署PHP7+Apache环境

介绍

介绍

前面福哥已经教给大家使用Dockerfile制作自己的镜像的方法了,今天我们使用Dockerfile制作一个PHP7+Apache的运行环境的镜像,用来部署PHP应用程序和服务。

福哥选择的基础镜像是php:7.4-apache-buster,这个镜像可以从官方拉取。

环境

镜像版本
php:7.4-apache-buster
操作系统CentOS 7 x86_64 2009
服务器TFCentOS7x64
IP192.168.168.68
端口80

安装

Dockerfile

基础镜像

福哥选择的是php:7.4-apache-buster这个基础镜像,因为这个镜像包含了apache服务,我们可以直接拿来用。

https://hub.docker.com/_/php/tags?page=1&name=7.4-apache-buster

home/topic/2023/0302/10/2bfb67f9ec07f157f529cd6251fdf0de.png

目前hub.docker.com应该已经无法打开了!大家直接docker pull就可以了!

拉取镜像php:7.4-apache-buster,添加到registry.tongfu.net:5000私有仓库里面。

docker pull php:7.4-apache-buster
docker tag php:7.4-apache-buster registry.tongfu.net:5000/php:7.4-apache-buster
docker rmi php:7.4-apache-buster
docker images | grep php

home/topic/2023/0710/22/6358d0e55f80a5248d149af9d4316152.png

创建镜像目录

创建镜像目录php7.4apache并切换到php7.4apache目录下面。

mkdir /tongfu.net/data/dockerfile/tfphp7.4apache
cd /tongfu.net/data/dockerfile/tfphp7.4apache

home/topic/2023/0710/22/16e852ba30bdd79563a59792fdf6c696.png

依赖镜像

第一行写上依赖镜像php:7.4-apache-buster。

FROM registry.tongfu.net:5000/php:7.4-apache-buster

维护者信息

这是福哥写的维护者信息。

# for MAINTAINER
MAINTAINER Author: Andy Bogate
MAINTAINER Email: tongfu@tongfu.net
MAINTAINER Home page: https://tongfu.net
MAINTAINER Datetime: 2023/03/08
MAINTAINER Version: v1.0

暴露端口

提供服务的端口通常情况下是80和443,我们把它们暴露出来。

# for EXPOSE
EXPOSE 80 443

主目录

福哥设置镜像的主目录是/tongfu.net/web。

# for WORKDIR
WORKDIR /tongfu.net/web

设置时区

默认时区是UTC,我们把它改成CST,也就是中国标准时间。

# for timezone
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone

安装工具和依赖库

后面的制作过程需要用到wget工具,这个需要通过apt-get安装一下。除此之外还要安装一些依赖库,包括图形库、zip和xml等等。

# install wget
RUN apt-get update \
&& apt-get -y install wget vim
RUN apt-get -y install libwebp-dev libjpeg-dev libpng-dev libfreetype6-dev
RUN apt-get -y install libzip-dev
RUN apt-get -y install libc-client-dev libkrb5-dev
RUN apt-get -y install libxml2-dev

释放PHP源码

这个php:7.4-apache-buster包含了PHP的源码,因为后面需要使用PHP源码安装PHP扩展,所以先要释放PHP源码。

# extract PHP source
RUN docker-php-source extract

GD图形库扩展

GD图形库可以让我们通过PHP直接加工各种图片文件,这个库可以用来实现图片验证码、照片加工等等功能的。

# gd extension
RUN docker-php-ext-configure gd \
--with-jpeg=/usr/include \
--with-freetype=/usr/include/ \
&& docker-php-ext-install gd \
&& docker-php-ext-enable gd

MySQL扩展

福哥是使用PDO来连接MySQL数据库,而MySQL的PDO库PHP资源包里包含了,只要安装起来就行了。

# extension of mysqli for MySQL
RUN docker-php-ext-install mysqli \
&& docker-php-ext-enable mysqli

# extension of PDO for MySQL
RUN docker-php-ext-install pdo_mysql \
&& docker-php-ext-enable pdo_mysql

Memcached扩展

memcached库需要从PECL下载,福哥选择的是3.1.5版本,这里直接通过phpize编译后就可以通过make安装了。

memcached库依赖libmemcached库,福哥选择的是1.0.18版本,尽量不要改避免版本冲突~

# library of Memcached
RUN wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz \
&& tar -xzvf libmemcached-1.0.18.tar.gz \
&& cd libmemcached-1.0.18 \
&& sed -i 's/opt_servers \=\= false/\!opt_servers/g' clients/memflush.cc \
&& ./configure \
&& make && make install \
&& cd ../ \
&& rm -f libmemcached-1.0.18.tar.gz \
&& rm -rf libmemcached-1.0.18

# extension of Memcached
RUN wget http://pecl.php.net/get/memcached-3.1.5.tgz \
&& tar -xzvf memcached-3.1.5.tgz \
&& cd memcached-3.1.5 \
&& /usr/local/bin/phpize \
&& ./configure --with-php-config=/usr/local/bin/php-config \
--disable-memcached-sasl \
&& make && make install \
&& cd ../ \
&& rm -f memcached-3.1.5.tgz \
&& rm -rf memcached-3.1.5 \
&& docker-php-ext-enable memcached

Redis扩展

redis库需要从PECL下载,福哥选择的是4.1.0版本,这里直接通过phpize编译后就可以通过make安装了。

# extension of Redis
RUN wget http://pecl.php.net/get/redis-4.1.0.tgz \
&& tar -xzvf redis-4.1.0.tgz \
&& cd redis-4.1.0 \
&& /usr/local/bin/phpize \
&& ./configure --with-php-config=/usr/local/bin/php-config \
&& make && make install \
&& cd ../ \
&& rm -f redis-4.1.0.tgz \
&& rm -rf redis-4.1.0 \
&& docker-php-ext-enable redis

MongoDB扩展

MongoDB库需要从PECL下载,福哥选择的是1.7.4版本,这里直接通过phpize编译后就可以通过make安装了。

# extension of MongoDB
RUN wget http://pecl.php.net/get/mongodb-1.7.4.tgz \
&& tar -xzvf mongodb-1.7.4.tgz \
&& cd mongodb-1.7.4 \
&& /usr/local/bin/phpize \
&& ./configure --with-php-config=/usr/local/bin/php-config \
&& make && make install \
&& cd ../ \
&& rm -f mongodb-1.7.4.tgz \
&& rm -rf mongodb-1.7.4 \
&& docker-php-ext-enable mongodb

其他扩展

除了前面安装的几个扩展之外,福哥还安装了imap、zlib、soap、bcmath这些扩展,建议大家也把这些安装上。

# imap extension
RUN docker-php-ext-configure imap \
--with-kerberos \
--with-imap-ssl \
&& docker-php-ext-install imap \
&& docker-php-ext-enable imap

# zlib extension
RUN mv /usr/src/php/ext/zlib/config0.m4 /usr/src/php/ext/zlib/config.m4 \
&& docker-php-ext-install zlib \
&& docker-php-ext-enable zlib

# soap extension
RUN docker-php-ext-install soap \
&& docker-php-ext-enable soap

# bcmath extension
RUN docker-php-ext-install bcmath \
&& docker-php-ext-enable bcmath

清理PHP源码

现在PHP的扩展都按照好了,已经不需要源码了,清理掉吧。

# source delete
RUN docker-php-source delete

php配置文件

php.ini

php.ini的存放目录是/usr/local/etc/php/,镜像提供了php-ini-development、php.ini-production两个配置文件模板,我们可以根据使用场景选择开发版本还是生产版本。

启动临时容器,从容器里复制php.ini-development出来放到镜像目录下。

docker run -tid --name ttt -h ttt registry.tongfu.net:5000/php:7.4-apache-buster
docker cp ttt:/usr/local/etc/php/php.ini-development php.ini
docker rm -f ttt

home/topic/2023/0710/22/13a1d3a7d2c9f5aa92c8bc4eb50ea4e7.png设置错误日志路径,将PHP的执行错误存起来。

error_log = /tmp/php_errors.log

home/topic/2023/0710/22/094ee7f036cb6e39db397c15a9dfbf83.png

修改php.ini设置时区为Asia/Shanghai。

date.timezone = Asia/Shanghai

home/topic/2023/0718/00/42fbec3603f677cc5e43de7876eb247b.png

复制php.ini覆盖镜像里面的php.ini配置文件。

# php.ini
COPY php.ini /usr/local/etc/php/php.ini

apache配置文件

模块配置

镜像安装的apache2包括/etc/apache2/mods-available和/etc/apache2/mods-enabled两个模块配置目录,mods-available里面包含全部的可用模块配置文件,mods-enabled里面是启用的模块配置文件。

要启用模块就从mods-available选择模块配置文件建立符号链接到mods-enabled下面。

要停用模块就将mods-enabled下面的模块配置文件的符号链接删除掉。

福哥这里把rewrite.load模块给打开了,这个使用场景还是非常多的,最起码实现PHP的伪静态就需要它。

# apache modules
RUN cd /etc/apache2/mods-enabled/ \
&& ln -s ../mods-available/rewrite.load

站点配置

镜像安装的apache2包括/etc/apache2/sites-available和/etc/apache2/sites-enabled两个站点配置目录,sites-available里面包含全部的可用站点配置文件,sites-enabled里面是启用的站点配置文件。

要启用站点就从sites-available选择站点配置文件建立符号链接到sites-enabled下面。

要停用站点就将sites-enabled下面删除站点配置文件的符号链接。

启动临时容器,从容器里复制000-default.conf出来放到镜像目录下。

docker run -tid --name ttt -h ttt registry.tongfu.net:5000/php:7.4-apache-buster
docker cp ttt:/etc/apache2/sites-available/000-default.conf 000-default.conf
docker rm -f ttt

home/topic/2023/0710/22/3bb84d737fa9195802900e82613de9e9.png

福哥在默认站点的虚拟主机里面利用rewrite模块实现了一个PHP的伪静态重定向配置,可以将各种html请求转交给htmlRouteMap.php处理。

在000-default.conf的VirtualHost节点里面添加如下配置信息。

        # For route static requests
        RewriteEngine On
        RewriteRule (.*)\.html /htmlRouteMap.php?tfphp_static_name=$1 [L]

home/topic/2023/0710/22/e42379c59f7680ba8e11a67dae903972.png复制000-default.conf覆盖镜像里面的000-default.conf配置文件。

# apache sites
COPY 000-default.conf /etc/apache2/sites-available/000-default.conf

创建镜像

使用下面的命令创建tfphp:7.4-apache-1.0.0镜像。

docker build -f Dockerfile \
-t registry.tongfu.net:5000/tfphp:7.4-apache-1.0.0 ./

home/topic/2023/0718/00/d59e86bf01d0bb439120405754209d57.png

查看镜像

看看新的镜像。

docker images | grep tfphp

home/topic/2023/0718/00/1e4ee3ca00386beee49952a4629eb565.png

测试

宿主机程序目录

在宿主机建立一个用来存放php程序的目录,它将被映射到容器的apache主目录上面。

mkdir -p /tongfu.net/data/docker/data/tfphp/html/
cd /tongfu.net/data/docker/data/tfphp/html/

宿主机程序文件

在刚刚建立的目录下面建立一个php程序文件index.php,写入下面的代码。

<?php

phpinfo();

再建立一个php程序文件htmlRouteMap.php,写入下面的代码。

<?php

var_dump(date("Y-m-d H:i:s"), $_GET['tfphp_static_name']. ".html");

启动容器

使用下面的命令基于tfphp:7.4-apache-1.0.0镜像启动一个容器,将80端口和443端口映射到宿主机上面,将/var/www/html这个apache主目录映射到前面建立的目录上面。

docker run -tid \
--name tfphp \
-h tfphp \
-p 80:80 \
-p 443:443 \
-v /tongfu.net/data/docker/data/tfphp/html:/var/www/html \
registry.tongfu.net:5000/tfphp:7.4-apache-1.0.0

home/topic/2023/0718/00/efb8699542d83a76622f4b193459b796.png

浏览器访问

打开浏览器访问http://192.168.168.68/index.php,可以看到PHP系统信息。

home/topic/2023/0718/00/5d6fcc9e55983532799095df42cca843.png

输入网址http://192.168.168.68/tongfu.net/docker/tfphp.html,可以看到请求html资源路径被htmlRouteMap.php打印出来了。

home/topic/2023/0718/00/e3130834886598124fdcb2db6487e88a.png

总结

今天福哥在TFCentOS7x64服务器上面通过Dockerfile创建了一个镜像tfphp:7.4-apache-1.0.0,并且通过这个新创建的镜像tfphp:7.4-apache-1.0.0启动了一个容器,这个镜像用来运行基于PHP语言开发的应用程序。

后面福哥会在这个镜像tfphp:7.4-apache-1.0.0基础之上进行二次扩展制作新的镜像,然后根据镜像的用途针对apache和php进行自定义的配置,敬请期待~