迹忆客 专注技术分享

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

Docker 部署 nginx php 应用

作者:迹忆客 最近更新:2023/01/08 浏览次数:

最近在学习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 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

使用 PHP MySQLi 函数获取最后插入的 ID

发布时间:2023/05/09 浏览次数:85 分类:MySQL

本篇文章简要介绍了 PHP mysqli() 函数并演示了如何使用它从 MySQL 数据库中获取最后插入的 ID。它是一个名为 mysqli 的 MySQL 驱动程序扩展版本,

在 PHP 中使用 MongoDB 作为文件存储

发布时间:2023/04/20 浏览次数:133 分类:MongoDB

在为大文件创建可扩展存储方面,MongoDB 及其 GridFS(使用 MongoDB 查询语言 - MQL 编写)是市场上最好的文件存储解决方案之一。 在本教程中,您将学习如何在 PHP 中使用 MongoDB 作为文件存储。

在 Linux 中托管 Docker Internal

发布时间:2023/04/18 浏览次数:139 分类:Docker

Docker 允许开发人员通过将应用程序包装在称为容器的标准化单元中来高效地构建、测试和部署应用程序。 在使用 Docker 容器时,您可能会遇到需要将容器与主机连接的场景。

在 Docker 中设置工作目录

发布时间:2023/04/18 浏览次数:82 分类:Docker

在 Docker 中,我们可以通过编辑 Dockerfile 并添加密钥 WORKDIR 来设置我们的工作目录。本文将讨论在 Docker 中更改我们当前和默认的工作目录。

在 Docker 容器中公开多个端口

发布时间:2023/04/18 浏览次数:143 分类:Docker

Docker 容器使用端口来实现万维网上不同设备之间的通信。 在本篇文章中,我们将学习如何使用 Nginx 应用程序在 Docker 容器中公开多个端口。

将用户添加到 Docker 容器

发布时间:2023/04/18 浏览次数:187 分类:Docker

在本文中,我们将学习如何通过实现返回产品数组的 Express 应用程序将用户添加到 Docker 容器。

使用 Docker 网络主机命令

发布时间:2023/04/18 浏览次数:112 分类:Docker

在本文中,我们将学习如何使用 --network 命令将容器添加到主机网络。 如果我们不使用此命令指定网络,我们还将了解如何将容器添加到默认网络。

清除 Docker 容器日志

发布时间:2023/04/18 浏览次数:181 分类:Docker

本文介绍了我们可以用来清除 docker 容器中日志的不同方法。日志是应用程序在特定事件或状态发生时记录的信息,它们帮助我们监控应用程序并采取必要的措施。

Docker 中的守护进程日志位置

发布时间:2023/04/18 浏览次数:175 分类:Docker

本文将讨论守护进程事件以及我们通常可以在哪里找到每个操作系统 (OS) 的守护进程日志。

扫一扫阅读全部技术教程

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

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便