美文网首页
Docker-- 构建nginx-php镜像

Docker-- 构建nginx-php镜像

作者: 岸久233 | 来源:发表于2019-12-29 23:58 被阅读0次

    1. 概述

    最近在研究wordpress,需要在多台机器上部署php服务,使用Docker构建环境是一个不错的选择;
    具体是采用dockerfile单独构建nginx以及php镜像;
    基础镜像采用alpine;
    比较折腾的是nginx容器与php容器之间的互连,需要注意配置;

    2. 为什么采用Docker?

    1. 切换服务器/本地机器方便;
    2. 应用之间隔离,不污染宿主机;
    3. 方便切换PHP版本;

    3. 站点目录结构

    image.png

    4. 构建php镜像

    ⚠️注意事项

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

    2. 通常,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
    
    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服务已正常启动:


    image.png

    前面已经通过-v映射宿主机与容器共用同一网站目录
    我们在网站目录下增加index.php

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

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


    image.png

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

    相关文章

      网友评论

          本文标题:Docker-- 构建nginx-php镜像

          本文链接:https://www.haomeiwen.com/subject/rnkuoctx.html