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
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兩個配置檔案模闆,我們可以根據使用場景選擇開發版本還是生産版本。
2.3 apache配置檔案
2.3.1 子產品配置
鏡像安裝的apache2包括mods-available和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
2.3.2 站點配置
鏡像安裝的apache2包括sites-available和sites-enabled兩個站點配置目錄,sites-available裡面包含全部的可用站點配置檔案,sites-enabled裡面是啟用的站點配置檔案。
要啟用站點就從sites-available選擇站點配置檔案建立符号連結到sites-enabled下面。
要停用站點就将sites-enabled下面删除站點配置檔案的符号連結。
福哥在預設站點的虛拟主機裡面利用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 ./
2.5 檢視鏡像
看看新的鏡像。
docker images | grep tfphp
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
3.4 浏覽器通路
打開浏覽器通路http://192.168.168.68/index.php,可以看到PHP系統資訊。
輸入網址http://192.168.168.68/tongfu.net/docker/tfphp.html,可以看到請求html資源路徑被htmlRouteMap.php列印出來了。
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