docker新建php镜像,Docker-- 构建nginx-php镜像

1. 概述

最近在研究wordpress,需要在多台机器上部署php服务,使用Docker构建环境是一个不错的选择;

具体是采用dockerfile单独构建nginx以及php镜像;

基础镜像采用alpine;

比较折腾的是nginx容器与php容器之间的互连,需要注意配置;

2. 为什么采用Docker?

切换服务器/本地机器方便;

应用之间隔离,不污染宿主机;

方便切换PHP版本;

3. 站点目录结构

1707b24cefc5

image.png

4. 构建php镜像

⚠️注意事项

需要在php-fpm.conf中配置deamonize=no,使php服务在前台运行保证容器不会退出;

通常,nginx与php-fpm是在同一台机器上运行的,可以将listen定义为:127.0.0.1:9000,这样nginx可以直接找到本机上的9000端口找到php-fpm服务;

但现在是独立的容器运行,我们需要将listen定义为0.0.0.0:9000或[::]:9000,表示任何IP都可以访问;

php-fpm.conf:

deamonize=no

listen = [::]:9000

以下是dockerfile内容,

由于我需要更改php上传文件限制以及log级别还有php运行用户等,所以使用自己的配置文件,务必更改deamonize以及listen!

FROM alpine

MAINTAINER for_ly@foxmail.com

# 环境变量

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 \

# 设置时区,删除文件

&& cp /usr/share/zoneinfo/${TIMEZONE} /etc/localtime \

&& echo "${TIMEZONE}" > /etc/timezone \

&& apk del tzdata \

&& rm -rf /var/cache/apk/* \

# 创建自定义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. 构建nginx镜像

FROM alpine

MAINTAINER for_ly@foxmail.com

# 环境变量

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. 构建镜像、启动容器

# 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指定容器与宿主机目录映射关系

docker run -d --name php -v /xxx/my-site/wordpress:/xxx/my-site/wordpress php:zion

# 4. 启动nginx容器,映射80端口以及网站目录,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

1707b24cefc5

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服务

fastcgi_param SCRIPT_FILENAME /xxx/my-site/wordpress/$fastcgi_script_name;

include fastcgi_params;

}

8. 测试服务是否能正常访问

此时php与nginx服务已正常启动:

1707b24cefc5

image.png

前面已经通过-v映射宿主机与容器共用同一网站目录

我们在网站目录下增加index.php

echo '<?php phpinfo(); ?>' > index.php

输入服务器公网IP访问nginx,直接展示php信息

1707b24cefc5

image.png

ps:以上操作花了一整天时间总结出来,大家有问题或者有建议可私信我指出,一起交流~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值