天天看點

使用php:7.4-apache-buster鏡像部署PHP7+Apache環境

1. 介紹

1.1 介紹

前面福哥已經教給大家使用Dockerfile制作自己的鏡像的方法了,今天我們使用Dockerfile制作一個PHP7+Apache的運作環境的鏡像,用來部署PHP應用程式和服務。

福哥選擇的基礎鏡像是php:7.4-apache-buster,這個鏡像可以從官方拉取。

2. 安裝

2.1 Dockerfile

2.1.1 基礎鏡像

福哥選擇的是php:7.4-apache-buster這個基礎鏡像,因為這個鏡像包含了apache服務,我們可以直接拿來用。

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

使用php:7.4-apache-buster鏡像部署PHP7+Apache環境

2.1.2 維護者資訊

這是福哥寫的維護者資訊。

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

2.1.3 暴露端口

提供服務的端口通常情況下是80和443,我們把它們暴露出來。

# for EXPOSE
EXPOSE 80 443           

2.1.4 主目錄

福哥設定鏡像的主目錄是/tongfu.net/web。

# for WORKDIR
WORKDIR /tongfu.net/web           

2.1.5 安裝工具

後面的制作過程需要用到wget工具,這個需要通過apt-get安裝一下。

# 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           

2.1.6 釋放PHP源碼

這個php:7.4-apache-buster包含了PHP的源碼,因為後面需要使用PHP源碼安裝PHP擴充,是以先要釋放PHP源碼。

# extract PHP source
RUN docker-php-source extract           

2.1.7 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           

2.1.8 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           

2.1.9 Memcached擴充

memcached庫需要從PECL下載下傳,福哥選擇的是3.1.5版本,這裡直接通過phpize編譯後就可以通過make安裝了。

memcached庫依賴libmemcached庫,福哥選擇的是1.0.18版本,盡量不要改避免版本沖突~

# extension of Memcached
RUN wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz \
&& wget http://pecl.php.net/get/memcached-3.1.5.tgz \
&& 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 \
&& 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           

2.1.10 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 \
&& docker-php-ext-enable redis \
&& cd ../ \
&& rm -f redis-4.1.0.tgz \
&& rm -rf redis-4.1.0           

2.1.11 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 \
&& docker-php-ext-enable mongodb \
&& cd ../ \
&& rm -f mongodb-1.7.4.tgz \
&& rm -rf mongodb-1.7.4           

2.1.12 其他擴充

除了前面安裝的幾個擴充之外,福哥還安裝了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           

2.1.13 清理PHP源碼

現在PHP的擴充都按照好了,已經不需要源碼了,清理掉吧。

# source delete
RUN docker-php-source delete           

2.2 php配置檔案

2.2.1 php.ini

php.ini的存放目錄是/usr/local/etc/php/,鏡像提供了php-ini-development、php.ini-production兩個配置檔案模闆,我們可以根據使用場景選擇開發版本還是生産版本。

使用php:7.4-apache-buster鏡像部署PHP7+Apache環境

2.3 apache配置檔案

2.3.1 子產品配置

鏡像安裝的apache2包括mods-available和mods-enabled兩個子產品配置目錄,mods-available裡面包含全部的可用子產品配置檔案,mods-enabled裡面是啟用的子產品配置檔案。

要啟用子產品就從mods-available選擇子產品配置檔案建立符号連結到mods-enabled下面。

要停用子產品就将mods-enabled下面删除子產品配置檔案的符号連結。

使用php:7.4-apache-buster鏡像部署PHP7+Apache環境

福哥這裡把rewrite.load子產品給打開了,這個使用場景還是非常多的,最起碼實作PHP的僞靜态就需要它。

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

2.3.2 站點配置

鏡像安裝的apache2包括sites-available和sites-enabled兩個站點配置目錄,sites-available裡面包含全部的可用站點配置檔案,sites-enabled裡面是啟用的站點配置檔案。

要啟用站點就從sites-available選擇站點配置檔案建立符号連結到sites-enabled下面。

要停用站點就将sites-enabled下面删除站點配置檔案的符号連結。

使用php:7.4-apache-buster鏡像部署PHP7+Apache環境

福哥在預設站點的虛拟主機裡面利用rewrite子產品實作了一個PHP的僞靜态重定向配置,可以将各種html請求轉交給htmlRouteMap.php處理。

如果要修改配置檔案就需要先啟動一個容器,然後把需要修改的配置檔案複制出來一份,在外面改好了在通過COPY指令導入進去。

下面是福哥修改過的預設站點000-default.conf配置檔案的内容。

<VirtualHost *:80>
    # The ServerName directive sets the request scheme, hostname and port that
    # the server uses to identify itself. This is used when creating
    # redirection URLs. In the context of virtual hosts, the ServerName
    # specifies what hostname must appear in the request's Host: header to
    # match this virtual host. For the default virtual host (this file) this
    # value is not decisive as it is used as a last resort host regardless.
    # However, you must set it for any further virtual host explicitly.
    #ServerName www.example.com

    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html

    # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
    # error, crit, alert, emerg.
    # It is also possible to configure the loglevel for particular
    # modules, e.g.
    #LogLevel info ssl:warn

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

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    # For most configuration files from conf-available/, which are
    # enabled or disabled at a global level, it is possible to
    # include a line for only one particular virtual host. For example the
    # following line enables the CGI configuration for this host only
    # after it has been globally disabled with "a2disconf".
    #Include conf-available/serve-cgi-bin.conf
</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet           

在建立新的鏡像的時候把000-default.conf配置檔案拷貝進去。

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

2.4 建立鏡像

使用下面的指令建立tfphp:7.4-apache-1.0.0鏡像。

docker build -f Dockerfile \
-t registry.tongfu.net:5000/tfphp:7.4-apache-1.0.0 ./           
使用php:7.4-apache-buster鏡像部署PHP7+Apache環境

2.5 檢視鏡像

看看新的鏡像。

docker images | grep tfphp           
使用php:7.4-apache-buster鏡像部署PHP7+Apache環境

3. 測試

3.1 主控端程式目錄

在主控端建立一個用來存放php程式的目錄,它将被映射到容器的apache主目錄上面。

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

3.2 主控端程式檔案

在剛剛建立的目錄下面建立一個php程式檔案index.php,寫入下面的代碼。

<?php

phpinfo();           

再建立一個php程式檔案htmlRouteMap.php,寫入下面的代碼。

<?php

var_dump($_GET['tfphp_static_name']. ".html");           

3.3 啟動容器

使用下面的指令基于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           
使用php:7.4-apache-buster鏡像部署PHP7+Apache環境

3.4 浏覽器通路

打開浏覽器通路http://192.168.168.68/index.php,可以看到PHP系統資訊。

使用php:7.4-apache-buster鏡像部署PHP7+Apache環境

輸入網址http://192.168.168.68/tongfu.net/docker/tfphp.html,可以看到請求html資源路徑被htmlRouteMap.php列印出來了。

使用php:7.4-apache-buster鏡像部署PHP7+Apache環境

4. 總結

今天福哥在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進行自定義的配置,敬請期待~

https://m.tongfu.net/home/35/blog/513977.html