目录

一、前言:

二、dockerfile创建nginx-php容器镜像

三、用docker-compose去运行容器,在docker-compose.yml里设置挂载目录。


一、前言:

        由于上一遍的<<dockerfile创建lnmp镜像>>讲到,当nginx与php分两个容器布署时,php容器里运行php-fpm的用户是nobody,虽然可正常跑到phpinf()函数,也可以验证mysql数据库是否连接正常的代码。但是在生产环境中,nginx和mysql容器跑某些项目时,会因某些用户权限问题,导致nginx访问不到php-fpm服务!因此,nginx和php最好放在同一个docker容器里,关联性好,简洁。

二、dockerfile创建nginx-php容器镜像

1、文件目录结构

[root@docker-test nginx-php]# pwd
/root/nginx-php
[root@docker-test nginx-php]# ls
dockerfile  nginx-1.15.7.tar.gz

2、dockerfile配置文件

FROM centos:latest
MAINTAINER https://blog.csdn.net/lituxiu
ENV TIME_ZOME Asia/Shanghai
ARG WJ="nginx-1.15.7"
#wget http://nginx.org/download/nginx-1.15.7.tar.gz

#COPY nginx.conf /usr/local/nginx/
ADD $WJ.tar.gz /tmp
RUN yum -y install gcc gcc-c++ make openssl-devel pcre-devel zlib-devel \
        && useradd -s /sbin/nologin nginx  \    #创建nginx用户关联nginx和php-fpm程序 
        && mkdir -p /usr/local/nginx \
        && cd /tmp/$WJ \
        && ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-stream --with-http_ssl_module --with-http_stub_status_module \
        && make -j 4 \
        && make install \
        && echo "${TIME_ZOME}" > /etc/timezone \
        && ln -sf /usr/share/zoneinfo/${TIME_ZOME} /etc/localtime \
        && rm -rf /tmp/nginx* \
        && ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx  \
 
        #php是直接用第三方yum源epel安装的,指定安装7.2版本
        && yum install -y epel-release  \
        && rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-7.rpm \
        && yum -y install yum-utils  \
        && yum-config-manager --enable remi-php72  \
        && yum -y install php php72-php-opcache  php72-php-ldap php72-php-odbc php72-php-pear php72-php-xml php72-php-xmlrpc php72-php-soap curl curl-devel  php72-php-mbstring php72-php-mysqlnd  php72-php-fpm  php72-php-gd \
        && sed -i "s/apache/nginx/g"  /etc/opt/remi/php72/php-fpm.d/www.conf \  #把php-fpm的www.conf配置里的user和group都nginx
        && yum clean all \
        && yum -y remove gcc gcc-c++ make \
        && chmod -R 777 /var/opt/remi/php72/lib/php/session/  #设置权限php的session目录权限,否则跑项目里,会提示"Permission denied"
  

WORKDIR /usr/local/nginx/
EXPOSE 80
CMD /opt/remi/php72/root/sbin/php-fpm  && nginx -g "daemon off;"   

#上一行CMD同时启动php-fpm服务,不过最后一个服务一定要前台运行,要不创建的镜像后台会启动不起来(docker容器运行的原理)

3、创建镜像

[root@docker-test nginx-php]# docker build -t nginx1.15.7p:latest ./

4、验证:查看php-fpm和nginx的进程

三、用docker-compose去运行容器,在docker-compose.yml里设置挂载目录。

        (注意:先运行容器时挂载一些临时目录(如/tmp目录),再在把你要挂载的目录、配置文件拉进去,那么宿主主机本地会同步保存到了,最后在本地创建对应的目录挂载到容器目录即可。否则,空白目录或配置错误会导致容器启动失败,报错 )

version: '2'
services:
  nginx:
    image: 7849c6cf185e
    container_name: 'nginx'
    restart: 'always'
    ports:
      - "80:80"
    volumes:  #这一项为挂载的目录(左为本地,右为窗口目录)
      - "/data/nginx/html:/usr/local/nginx/html"
      - "/data/nginx/logs/:/usr/local/nginx/logs/"
      - "/data/nginx/conf/:/usr/local/nginx/conf/"
      - "/data/php/php-fpm.d:/usr/php/etc/php-fpm.d"
    networks:
      dangjian:
        ipv4_address: 172.19.0.2

...
中还有其它的容器,类似tomcat、redis和mongodb等
...

networks:
   dangjian:
      ipam:
         config:
         - subnet: 172.19.0.0/16
           gateway: 172.19.0.1

配置基本如上所示!!!

项目展示图

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐