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数据用户,重启。

最后!????

本文转载自:迹忆客(https://www.jiyik.com)

以上是 Docker 部署 nginx php 应用 的全部内容, 来源链接: utcz.com/z/290256.html

回到顶部