docker 部署php+nginx

需求:

  • 有一份现成的php代码,需要通过docker 部署到一个新的服务上

进程:

  • 创建php 的Dockerfile
  • 使用官方的php  并安装相应的依赖
    FROM php:7.2-fpm
    
    RUN mkdir /usr/local/etc/php/pool.d/ && mkdir /www/
    
    RUN apt-get update  && \
        apt-get install -y libpng-dev && \
        apt-get install -y gdb && \
        apt-get install -y git && \
        apt-get install -y liblapack-dev
    
    RUN docker-php-ext-install pdo_mysql && \
        docker-php-ext-install mysqli && \
        docker-php-ext-install gd && \
        docker-php-ext-install zip && \
        docker-php-ext-install pcntl && \
        docker-php-ext-install posix && \
        docker-php-ext-install exif
  • 使用官方的nginx  
    FROM nginx
    
    COPY nginx.conf /etc/nginx/nginx.conf
    
    COPY ./site-enabled /etc/nginx/conf.d
    
    RUN mkdir /var/www/ 
    
    COPY ./trunk /var/www
  •  创建对应的docker-compose.yml
    version: "3"
    networks:
      backend:
        driver: bridge
    
    services:
      php-fpm-de:
        build:
          context: ./php
        container_name: php-fpm-de
        ports:
          - "9101:9000"
        networks: 
          - backend
    
      nginx:
        build: ./nginx
        container_name: nginx
        ports:
          - "8010:8011"
        links:
          - "php-fpm-de"
        depends_on:
          - "php-fpm-de"
        networks:
          - backend
    
  • 开始启动docker-compose up
  • 前端部分顺利启动,但是和php 相关的部分php 那边报错 502 getaway
  • 查看nginx 对应的conf 文件配置
    server {
        root /var/www/public;
        index index.html index.php;
        listen 8011;
        client_max_body_size 8M;
        server_tokens off;
    
        location /admin {
            try_files $uri /admin/index.html$is_args$args;
        }
    
        #使用的是 laravel 框架
        location ~ \.php$ {
            try_files $uri = 404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param SCRIPT_NAME $fastcgi_script_name;
            fastcgi_index index.php;
            # fastcgi_pass php-fpm-de:9101;  #error
            fastcgi_pass php-fpm-de:9000;  #success
        }
    }
  • 因为两个docker 用桥接链接了所以不应该使用 9101 而应该使用 9000 
  • 修改了之后,错误信息变成了  file not found
  • 一脸懵逼然后再本地做调试,发现本地调试的时候会在php 那边也挂载一个代码文件,修改php 的 Dockerfile 加上一行
    COPY ./trunk /var/www
  • 重新build 并启动 docker-compose 在运行的时候报错了 nginx 报错  permission denied  
  • 反应过来  php 和 nginx 需要使用相同的用户,或者更高级的用户,修改nginx.conf 文件  
    user  www-data;
  • 修改php-fpm 的启动用户,  修改www.conf 文件下的user 和group
    user = www-data
    group = www-data
  • 重启docker-compose,在运行的时候php 报错,loadFile failed permission denied
  • 看起来是www-data 没有权限读取拷贝进去的文件修改Dockerfile 拷贝代码逻辑
    COPY --chown=www-data:www-data ./trunk /var/www
     
  • 重启成功

结论:

  •  如果使用的是docker-compose 对两个容器做桥接,需要直接使用内部的端口号,例如php 的9000,mysql 的3306,而不是使用映射到宿主机的端口号
  • php 和nginx 分开部署但是理论上还是一个服务,需要使用相同的user 来做启动者
  • php 和nginx 分开部署,在nginx 需要有一份代码,不然nginx 下的conf 文件读取会失败,在php 下也需要有一份代码,不然在nginx 使用php 做转发解析的时候会file not found
  • 拷贝到php 下的代码,需要有足够宽的权限,有两种方式:1:、将文件的创建者修改为php一样的user。2、将文件的权限放大 chmod -R 777。不然会 permission denied
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值