迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 操作系统 >

Docker 部署 nginx php 应用

作者:迹忆客 最近更新:2022/07/21 浏览次数:

最近在学习docker。 通过搭建nginx+php的开发环境实例来学习。 这里我记录了构建过程。 首先给出一份docker-compose.yml部署配置文件

version: '3'
services:
  nginx:
    container_name: myweb
    image: nginx
    ports:
      - '80:80'
    volumes:
      - '/etc/nginx/:/etc/nginx' # 配置文件
      - '/var/log/nginx/:/var/log/nginx/' # 日志
      - '/data/php/yxyy/html:/data/php/yxyy/html' # 项目目录
  php:
    container_name: myphp
    image: php:7.2-fpm
    volumes:
      - '/data/php/yxyy/html/:/data/php/yxyy/html/'
      - '/usr/local/php7.2/:/usr/local/etc/'

以下是搭建的整个过程。 不会记录dockers的安装。 下面记录nginx+php的搭建过程

部署 nginx

先安装一个临时的nginx容器

$ docker run --name tmpweb -d -p 80:80  nginx

在浏览器中输入127.0.0.1显示熟悉的界面,进入 tmpweb 容器

$ docker exec -it tmpweb /bin/bash

搜索配置文件位置

$ find / -name nginx.conf  
# 在 /ect/nginx 中找到配置文件

复制一份容器中nginx配置到宿主机/ect/nginx

$ docker cp tmpweb:/ect/nginx /ect/nginx

修改nginx配置,如站点根目录/etc/nginx/conf.d/default.conf。 我的项目在/data/php/yxyy/html

删除 tmpweb 容器,启动一个容器挂载自定义配置文件

docker run --name myweb -d -p 80:80 \
           -v /ect/nginx:/ect/nginx \ 
           -v /var/log/nginx/:/var/log/nginx/ \
           -v /data/php/yxyy/html/:/data/php/yxyy/html/   nginx

在浏览器输入127.0.0.1验证是否正常

部署 PHP

php的安装过程也和nginx类似。 我使用的镜像是 php:7.2-fpm。 下面是我的安装过程:

$ docker run --name tmpphp -d -p 80:80  php:7.2-fpm  # 安装临时php:7.2-fpm镜像
$ docker exec -it tmpphp /bin/bash # 进入容器
$ find / -name php-fpm.conf  
#在 /usr/local/etc/ 中找到配置文件
$ docker cp tmpphp:/usr/local/etc/ /usr/local/php7.2/  # 拷贝一份容器内的配置到宿主机
$ docker run --name myphp -d -p 9000:9000 \
           -v /usr/local/php7.2/:/usr/local/etc/ \ 
           -v /data/php/yxyy/html/:/data/php/yxyy/html/   php:7.2-fpm 

在这一点上,我认为还可以。 浏览器进行访问,结果显示502

解决 502

查看nginx日志如下:

 *19 connect() failed (111: Connection refused) while connecting to upstream, client: 172.17.0.1, server: localhost, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "localhost"

连接有问题。 检查PHP容器是否启动:

$ docker ps 
# 结果显示php容器是启动的

查看php容器日志:

$ docker logs myphp 
# 也没有错误

查看主机进程:

$ ps -ef | grep php  
# php 主进程和worker 进程都在运行

既然这些进程已经有了,那么问题就只回出现在它们之间的通信上。 主机上的telnet:

$ telnet 127.0.0.1 9000  
# 可以正常的链接

容器不能相互通信吗? 查找资料说是不能通信,但我想验证一下:

# 首先进入myweb容器telnet 127.0.0.1 9000,没有telnet

# OK,然后安装。 安装后,telnet 127.0.0.1 9000 拒绝。 来这里确认无法直接通信

重新运行nginx容器并添加 --link myphp

$ docker run --name myweb -d -p 80:80 --link myphp \
           -v /ect/nginx:/ect/nginx \ 
           -v /var/log/nginx/:/var/log/nginx/ \
           -v /data/php/yxyy/html/:/data/php/yxyy/html/   nginx

理想是美好的,现实是残酷的,还是无法沟通。 根据资料,link 将被放弃。 我安装的docker比较新。 我想这可能是原因。 使用 docker compose 集群管理启动它。 这是 docker-compose.yml 配置:

version: '3'
services:
  nginx:
    container_name: myweb
    image: nginx
    ports:
      - '80:80'
    volumes:
      - '/etc/nginx/:/etc/nginx' # 配置文件
      - '/var/log/nginx/:/var/log/nginx/' # 日志
      - '/data/php/yxyy/html:/data/php/yxyy/html' # 项目目录
  php:
    container_name: myphp
    image: php:7.2-fpm
    volumes:
      - '/data/php/yxyy/html/:/data/php/yxyy/html/'
      - '/usr/local/php7.2/:/usr/local/etc/'

一顿操作猛如虎,一看结果250,我仍然看不到。 这时候就想砸电脑,进入容器:

$ telnet 127.0.0.1 9000  
# 还是连接不上? 如果将 127.0.0.1 更改为容器名称会发生什么?
$ telnet myphp 9000  
# 没想到,就在这个时候,一种幸福的感觉从容不迫的袭来。 幸福来得太突然

修改nginx配置,将127.0.0.1改成myphp(容器名),重启, 高光时刻到了。但是,其实是我想的太多了。 502解决,404意外出现。

解决 404

File not found

看到404,第一反应是路径不对。 反复确认后,路径就OK了。 我认为这只能是权限问题。 查看nginx日志:

*32 FastCGI sent in stderr: "Primary script unknown" while reading response header

ls -l 你真的没有查看权限。 当你看到你没有获得权限时,你会微笑。 这有点有趣。 给我 777 权限。 不幸的是,我仍然不能。 使用 root 用户执行。

  • 修改php FMP的配置 www.conf: user=root,group=root;
  • 修改nginx.conf:user=root。重启容器查看。

查看容器日志 docker logs phpxxx 显示

ERROR: [pool www] please specify user and group other than root

php 不能被 root 执行。 都改成nginx了。 结果还是不好,

cat /etc/passwd 检查没有这个用户,只有php的WWW数据用户。 修改nginx和php配置,改成WWW数据用户,重启。

最后!😊

本站文章均为原创或翻译,转载请发邮件至 1244347461@qq.com 进行申请,未经许可,禁止转载。经作者同意之后,转载请以链接形式注明出处

本文地址:

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

热门文章

教程更新

热门标签

扫码一下
查看教程更方便