Docker 部署 nginx php 应用
最近在学习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数据用户,重启。
最后!😊
相关文章
使用 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 容器中日志的不同方法。日志是应用程序在特定事件或状态发生时记录的信息,它们帮助我们监控应用程序并采取必要的措施。