Docker部署php运行环境(php-fpm+nginx)

前言

如果使用docker去部署一套php的运行环境,我们需要构建出nginx、php-fpm两个容器,nginx通过fast_cgi协议去转发php-fpm中的端口,从而实现web server的搭建,接下来以php的laravel框架为演示例子。

部署php-fpm

第一步 编写php-fpm镜像的Dockerfile:

./Dockerfile

#根据你自身业务需求来选择官方的php基础镜像
FROM php:7.4-fpm-alpine# 设置时区
ENV TZ Asia/Shanghai# 创建supervisor进程管理器相关数据存在的文件夹
RUN mkdir -p "/var/log/supervisor" && mkdir -p "/var/run"# 设置源,提高下载效率
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories# 安装系统依赖
RUN apk update && apk --no-cache add \autoconf \g++ \make \openssl-dev \libzip-dev \unzip \tzdata \supervisor# 安装Redis扩展
RUN pecl install redis && docker-php-ext-enable redis# 安装PDO MySQL扩展
RUN docker-php-ext-install pdo_mysql && docker-php-ext-enable pdo_mysql# 安装opcache扩展
RUN docker-php-ext-install opcache && docker-php-ext-enable opcache# 安装Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer#工作目录
WORKDIR /app# 定义容器启动时运行的命令
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/supervisord.conf"]
第二步 配置Crontab定时任务:

./cronJob

* * * * * /usr/local/bin/php /app/www/laravel8/artisan schedule:run >> /var/log/laravel8-crontab-task.log 2>&1
第三步 配置supervisor进程管理器:

./supervisord/supervisord.conf

; supervisor config file[unix_http_server]
file=/var/run/supervisor.sock   ; (the path to the socket file)
chmod=0700                       ; sockef file mode (default 0700)[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
childlogdir=/var/log/supervisor            ; ('AUTO' child log dir, default $TEMP); the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface[supervisorctl]
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL  for a unix socket; The [include] section can just contain the "files" setting.  This
; setting can list multiple files (separated by whitespace or
; newlines).  It can also contain wildcards.  The filenames are
; interpreted as relative to this file.  Included files *cannot*
; include files themselves.[include]
files = /etc/supervisor/conf.d/*.conf

supervisord/conf.d/supervisord.conf

[supervisord]
nodaemon=true[program:php-fpm]
command=/usr/local/sbin/php-fpm -F
autostart=true
autorestart=true
startretries=3
priority=1
stdout_logfile=/var/log/php-fpm.log
redirect_stderr=true[program:crond]
command=/usr/sbin/crond -f
autostart=true
autorestart=true
stdout_logfile=/var/log/crond.log
redirect_stderr=true
priority=2
第四步 编写docker-compose.yml:

docker-compose.yml

version: '3.8'services:php7.4fpm:build:dockerfile: Dockerfileimage: php7.4fpmcontainer_name: php7.4fpmrestart: alwaysvolumes:# 映射应用程序目录- /Users/king/Code/laravel8:/app/www/laravel8# 映射Crontab定时任务配置- ./cronJob:/etc/crontabs/root# 映射supervisor配置文件- ./supervisord:/etc/supervisor# 映射php扩展配置 ps:首次构建时需要注释,否则容器内该目录会为空#- ./extensions:/usr/local/etc/php/conf.d# 映射fpm配置文件 ps:首次构建时需要注释,否则容器内该目录会为空#- ./fpm-conf:/usr/local/etc/php-fpm.d
networks:default:external: truename: frontend
第五步 构建镜像和容器:
  • 拉去基础镜像
docker pull php:7.4-fpm-alpine
  • 创建网络
docker network create frontend
  • 容器编排
docker-compose up -d --build
  • 查看容器状态

  • 同步文件

#同步php扩展配置文件夹,后续可以直接在宿主机变更相关参数配置
docker cp php7.4fpm:/usr/local/etc/php/conf.d ./extensions#同步fpm配置文件夹,后续可以直接在宿主机变更相关参数配置
docker cp php7.4fpm:/usr/local/etc/php-fpm.d ./fpm-conf

  • 查看当前目录结构

部署nginx

第一步 编写Dockerfile:

./Dockerfile

FROM nginx:alpine# 安装时区工具
RUN set -ex \&& sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \&& apk --update add tzdata \&& cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeEXPOSE 80 443# 定义容器启动时运行的命令
CMD ["nginx", "-g", "daemon off;"]
第二步 编写配置文件以及站点vhost:

./nginx.conf

user  nginx;
worker_processes  auto;error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;events {worker_connections  1024;
}http {include       /etc/nginx/mime.types;default_type  application/octet-stream;log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log  main;sendfile        on;keepalive_timeout  65;#压缩配置gzip on;gzip_comp_level 5;gzip_min_length 1k;gzip_buffers 4 16k;gzip_proxied any;gzip_vary on;gzip_typesapplication/javascriptapplication/x-javascripttext/javascripttext/csstext/xmlapplication/xhtml+xmlapplication/xmlapplication/atom+xmlapplication/rdf+xmlapplication/rss+xmlapplication/geo+jsonapplication/jsonapplication/ld+jsonapplication/manifest+jsonapplication/x-web-app-manifest+jsonimage/svg+xmltext/x-cross-domain-policy;gzip_static on;  gzip_disable "MSIE [1-6]\.";include /etc/nginx/conf.d/*.conf;
}

./conf.d/default.conf

server {listen 80;server_name localhost;root /app/www/laravel8/public;index index.php index.html;location / {try_files $uri $uri/ /index.php?$query_string;}location ~ \.php$ {include fastcgi_params;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;fastcgi_pass php7.4fpm:9000;  # PHP-FPM 容器的地址和端口fastcgi_index index.php;}location ~ /\.ht {deny all;}error_log  /var/log/nginx/error-php7.4fpm.log;access_log /var/log/nginx/access-php7.4fpm.log;
}
第三步 编写docker-compose.yml:

./docker-compose.yml

version: '3.8'services:nginx:build:dockerfile: Dockerfileimage: nginxcontainer_name: nginxvolumes:- ./nginx.conf:/etc/nginx/nginx.conf- ./conf.d:/etc/nginx/conf.d- ./log:/var/log/nginxrestart: alwaysports:- "80:80"
networks:default:external: truename: frontend
第四步 构建镜像和容器:
  • 拉去基础镜像
docker pull nginx:alpine
  • 容器编排
docker-compose up -d --build
  •  查看容器状态

  • 目录结构

 验证

如果以上步骤顺利操作,浏览器访问 http://127.0.0.1或http://localhost看响应结果。

大功告成!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/101252.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一、数学建模之线性规划篇

1.定义 2.例题 3.使用软件及解题 一、定义 1.线性规划(Linear Programming,简称LP)是一种数学优化技术,线性规划作为运筹学的一个重要分支,专门研究在给定一组线性约束条件下,如何找到一个最优的决策&…

Prometheus 监控系统---你值得拥有

目录 一:Prometheus 1、Prometheus 概述 2、应用场景 3、Prometheus 的特点 4、Prometheus 的生态组件 (1)Prometheus server:服务核心组件 (2)Client Library: 客户端库 (3&#xff0…

前端开发怎么解决前端安全性的问题? - 易智编译EaseEditing

前端安全性是保护前端应用程序免受恶意攻击和数据泄露的重要方面。以下是一些解决前端安全性问题的关键方法: 输入验证与过滤: 对所有用户输入进行验证和过滤,防止恶意用户通过注入攻击等手段破坏应用程序或获取敏感信息。 跨站点脚本&#…

安卓移动应用开发实训室建设方案

一 、系统概述 安卓移动应用开发作为新一代信息技术的重点和促进信息消费的核心产业,已成为我国转变信息服务业的发展新热点:成为信息通信领域发展最快、市场潜力最大的业务领域。互联网尤其是移动互联网,以其巨大的信息交换能力和快速渗透能…

k8s 自身原理之高可用

说到高可用,咱们在使用主机环境的时候(非 k8s),咱做高可用有使用过这样的方式: 服务器做主备部署,当主节点和备节点同时存活的时候,只有主节点对外提供服务,备节点就等着主节点挂了…

logstash配置文件

input { kafka { topics > “xxxx” bootstrap_servers > “ip:port” auto_offset_reset > “xxxx” group_id > “xxxx” consumer_threads > 3 codec > “json” } } filter { grok { match > { “message” > ‘%{IP:client_ip} - - [%{HTTPDATE:…

PostgreSQL父子建表查询所有的子数据-利用自定义函数查询

pgsql 函数查询代码 select find_space_tree_list_by_nodeid(1,1) 查询结果示意图 获取子集函数代码 CREATE OR REPLACE FUNCTION "public"."find_space_tree_list_by_nodeid"("nodeid" varchar, "viewid" varchar)RETURNS "…

电脑远程接入软件可以进行文件传输吗?快解析内网穿透

电脑远程接入软件的出现,让我们可以在两台电脑之间进行交互和操作。但是,很多人对于这些软件能否进行文件传输还存在一些疑问。下面的文章将解答这个问题。 1.电脑远程接入软件可以进行文件传输。传统上,我们可能会通过传输线或者移动存储设…

【图论】Floyd算法

一.简介 Floyd算法,也称为Floyd-Warshall算法,是一种用于解决所有节点对最短路径问题的动态规划算法。它可以在有向图或带权图中找到任意两个节点之间的最短路径。 Floyd算法的基本思想是通过中间节点逐步优化路径长度。它使用一个二维数组来存储任意两…

mongodb 数据库管理(数据库、集合、文档)

目录 一、数据库操作 1、创建数据库 2、删除数据库 二、集合操作 1、创建集合 2、删除集合 三、文档操作 1、创建文档 2、 插入文档 3、查看文档 4、更新文档 1)update() 方法 2)replace() 方法 一、数据库操作 1、创建数据库 创建数据库…

钛合金为何成为iPhone 15 Pro材料首选?

多年来,iPhone Pro一直采用厚重的钢框架,但不会持续太久。 有了iPhone 15 Pro,苹果可能会从钢框架转向钛框架,这不仅仅是因为它听起来更酷。钛比钢有很多优点,尤其是它更轻,这将解决iPhone Pro与普通iPhon…

Python爬虫——scrapy_日志信息以及日志级别

日志级别(由高到低) CRITICAL: 严重错误 ERROR: 一般错误 WARNING: 警告 INFO: 一般警告 DEBUG: 调试信息 默认的日志等级是DEBUG 只要出现了DEBUG或者DEBUG以上等级的日志,那么这些…

哪些人适合参加大数据培训班?

互联网加速职场变革,大数据浪潮席卷全球。日前,Python、大数据、人工智能是当今最热门的话题。大数据存储、大数据分析、 人工智能等开发人才需求旺盛。 大数据培训班有大数据分析培训班、大数据开发培训班,JAVA培训班 大数据班适学人群…

vite4+vue3+electron23.3+ts桌面应用bs端开发 打包windows、linux、max三个系统的安装包

vite4vue3electron23.3ts桌面应用bs端开发 打包windows、linux、max三个系统的安装包 主要包依赖 "electron-store": "^8.1.0", //全局数据状态管理,可选择性安装"electron": "23.3.8","electron-builder": &q…

【服务器】Strace显示后台进程输出

今天有小朋友遇到一个问题 她想把2331509和2854637这两个进程调到前台来,以便于在当前shell查看这两个python进程的实时输出 我第一反应是用jobs -l然后fg (参考这里) 但是发现jobs -l根本没有输出: 原因是jobs看的是当前ses…

测试框架pytest教程(4)运行测试

运行测试文件 $ pytest -q test_example.py 会运行该文件内test_开头的测试方法 该-q/--quiet标志使输出保持简短 测试类 pytest的测试用例可以不写在类中,但如果写在类中,类名需要是Test开头,非Test开头的类下的test_方法不会被搜集为用…

html动态爱心代码【一】(附源码)

前言 七夕马上就要到了,为了帮助大家高效表白,下面再给大家带来了实用的HTML浪漫表白代码(附源码)背景音乐,可用于520,情人节,生日,表白等场景,可直接使用。 效果演示 文案修改 var loverNam…

IT运维:使用数据分析平台监控 Linux 节点

监控目标 监控 Linux 服务器的基本信息以及各项性能指标,包括: CPU 内存、Swap 网络 文件系统、磁盘 IO 解决方案 使用 Node exporter 收集硬件以及操作系统内核的指标数据,并通过 HTTP API 提供数据 使用 Vector agent 通过 Node export…

神经网络为什么可以学习

本资料转载于B站up主:大模型成长之路,仅用于学习和讨论,如有侵权请联系 动画解析神经网络为什么可以学习_哔哩哔哩_bilibilis 1、一个神经网络是由很多神经元形成的 1.1 也可以是一层,也可以是多层 2 层和层之间的连接就跟一张网一样 2.1 每…