1. 概述
最近在研究wordpress,需要在多臺機器上部署php服務(wù)畏鼓,使用Docker構(gòu)建環(huán)境是一個不錯的選擇酱酬;
具體是采用dockerfile單獨構(gòu)建nginx以及php鏡像;
基礎(chǔ)鏡像采用alpine云矫;
比較折騰的是nginx容器與php容器之間的互連膳沽,需要注意配置;
2. 為什么采用Docker泼差?
- 切換服務(wù)器/本地機器方便贵少;
- 應(yīng)用之間隔離呵俏,不污染宿主機堆缘;
- 方便切換PHP版本;
3. 站點目錄結(jié)構(gòu)
image.png
4. 構(gòu)建php鏡像
??注意事項
需要在php-fpm.conf中配置deamonize=no,使php服務(wù)在前臺運行保證容器不會退出普碎;
通常吼肥,nginx與php-fpm是在同一臺機器上運行的,可以將listen定義為:127.0.0.1:9000,這樣nginx可以直接找到本機上的9000端口找到php-fpm服務(wù)麻车;
但現(xiàn)在是獨立的容器運行缀皱,我們需要將listen定義為0.0.0.0:9000或[::]:9000,表示任何IP都可以訪問动猬;
php-fpm.conf:
deamonize=no
listen = [::]:9000
以下是dockerfile內(nèi)容啤斗,
由于我需要更改php上傳文件限制以及l(fā)og級別還有php運行用戶等,所以使用自己的配置文件,務(wù)必更改deamonize以及l(fā)isten赁咙!
FROM alpine
MAINTAINER for_ly@foxmail.com
# 環(huán)境變量
ENV TIMEZONE Asia/Shanghai
# 安裝php及其拓展 更新alpine軟件源
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories \
&& apk update \
&& apk upgrade \
&& apk add \
curl \
tzdata \
php7-fpm\
php7 \
php7-dev \
php7-apcu \
php7-bcmath \
php7-xmlwriter \
php7-ctype \
php7-curl \
php7-exif \
php7-iconv \
php7-intl \
php7-json \
php7-mbstring\
php7-opcache \
php7-openssl \
php7-pcntl \
php7-pdo \
php7-mysqlnd \
php7-mysqli \
php7-pdo_mysql \
php7-pdo_pgsql \
php7-phar \
php7-posix \
php7-session \
php7-xml \
php7-simplexml \
php7-mcrypt \
php7-xsl \
php7-zip \
php7-zlib \
php7-dom \
php7-redis\
php7-tokenizer \
php7-gd \
php7-fileinfo \
php7-zmq \
php7-memcached \
php7-xmlreader \
# 設(shè)置時區(qū)钮莲,刪除文件
&& cp /usr/share/zoneinfo/${TIMEZONE} /etc/localtime \
&& echo "${TIMEZONE}" > /etc/timezone \
&& apk del tzdata \
&& rm -rf /var/cache/apk/* \
# 創(chuàng)建自定義log以及pid目錄
&& mkdir -p /usr/local/logs/php7/ \
&& mkdir -p /run/php-fpm/
# 加載自定義配置文件
COPY php.ini /etc/php7/
COPY php-fpm.conf /etc/php7/
COPY www.conf /etc/php7/php-fpm.d/
# 安裝libiconv
RUN apk add --no-cache --repository http://dl-3.alpinelinux.org/alpine/edge/testing gnu-libiconv
ENV LD_PRELOAD /usr/lib/preloadable_libiconv.so php
RUN rm -rf /var/cache/apk/*
# Install-Composer
RUN curl -sS https://getcomposer.org/installer | \
php -- --install-dir=/usr/bin/ --filename=composer
EXPOSE 9000
# 啟動
CMD ["/usr/sbin/php-fpm7", "-R"]
5. 構(gòu)建nginx鏡像
FROM alpine
MAINTAINER for_ly@foxmail.com
# 環(huán)境變量
ENV TIMEZONE Asia/Shanghai
RUN apk add nginx \
&& mkdir /run/nginx/
COPY nginx.conf /etc/nginx/
EXPOSE 80
# 運行nginx并保持在前臺運行
CMD ["/usr/sbin/nginx","-g","daemon off;"]
6. 構(gòu)建鏡像免钻、啟動容器
# 1. nginx
cd xx/my-site/docker-files/nginx
docker build --no-cache nginx:zion .
# 2. php
cd xx/my-site/docker-files/php
docker build --no-cache php:zion
# 3. 啟動php容器 -v指定容器與宿主機目錄映射關(guān)系
docker run -d --name php -v /xxx/my-site/wordpress:/xxx/my-site/wordpress php:zion
# 4. 啟動nginx容器,映射80端口以及網(wǎng)站目錄,nginx與php容器通過--link互連
docker run -d --name nginx -p 0.0.0.0:80:80 -v /xxx/my-site/wordpress:/xxx/my-site/wordpress --link php:php nginx:zion
image.png
7. nginx.conf 摘要
server {
listen 80;
root /xxx/my-site/wordpress;
index index.htm index.html index.php;
server_name www.zlld.top;
location / {
try_files $uri $uri/ /index.php?_url=$uri&$args;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php; # 劃重點崔拥,nginx通過link訪問php容器的php-fpm服務(wù)
fastcgi_param SCRIPT_FILENAME /xxx/my-site/wordpress/$fastcgi_script_name;
include fastcgi_params;
}
8. 測試服務(wù)是否能正常訪問
此時php與nginx服務(wù)已正常啟動:
image.png
前面已經(jīng)通過-v映射宿主機與容器共用同一網(wǎng)站目錄
我們在網(wǎng)站目錄下增加index.php
echo '<?php phpinfo(); ?>' > index.php
輸入服務(wù)器公網(wǎng)IP訪問nginx极舔,直接展示php信息
image.png
ps:以上操作花了一整天時間總結(jié)出來,大家有問題或者有建議可私信我指出链瓦,一起交流~