【Docker】实战多阶段构建 Laravel 镜像

在这里插入图片描述

作者主页: 正函数的个人主页
文章收录专栏: Docker
欢迎大家点赞 👍 收藏 ⭐ 加关注哦!


本节适用于 PHP 开发者阅读。Laravel 基于 8.x 版本,各个版本的文件结构可能会有差异,请根据实际自行修改。

准备

新建一个 Laravel 项目或在已有的 Laravel 项目根目录下新建 Dockerfile .dockerignore laravel.conf 文件。

.dockerignore 文件中写入以下内容。

.idea/
.git/vendor/node_modules/public/js/
public/css/
public/mix-manifest.jsonyarn-error.logbootstrap/cache/*
storage/# 自行添加其他需要排除的文件,例如 .env.* 文件

laravel.conf 文件中写入 nginx 配置。

server {listen 80 default_server;root /app/laravel/public;index index.php index.html;location / {try_files $uri $uri/ /index.php?$query_string;}location ~ .*\.php(\/.*)*$ {fastcgi_pass   laravel:9000;include        fastcgi.conf;# fastcgi_connect_timeout 300;# fastcgi_send_timeout 300;# fastcgi_read_timeout 300;}
}

前端构建

第一阶段进行前端构建。

FROM node:alpine as frontendCOPY package.json /app/RUN set -x ; cd /app \&& npm install --registry=https://registry.npmmirror.comCOPY webpack.mix.js webpack.config.js tailwind.config.js /app/
COPY resources/ /app/resources/RUN set -x ; cd /app \&& touch artisan \&& mkdir -p public \&& npm run production

安装 Composer 依赖

第二阶段安装 Composer 依赖。

FROM composer as composerCOPY database/ /app/database/
COPY composer.json composer.lock /app/RUN set -x ; cd /app \&& composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ \&& composer install \--ignore-platform-reqs \--no-interaction \--no-plugins \--no-scripts \--prefer-dist

整合以上阶段所生成的文件

第三阶段对以上阶段生成的文件进行整合。

FROM php:7.4-fpm-alpine as laravelARG LARAVEL_PATH=/app/laravelCOPY --from=composer /app/vendor/ ${LARAVEL_PATH}/vendor/
COPY . ${LARAVEL_PATH}
COPY --from=frontend /app/public/js/ ${LARAVEL_PATH}/public/js/
COPY --from=frontend /app/public/css/ ${LARAVEL_PATH}/public/css/
COPY --from=frontend /app/public/mix-manifest.json ${LARAVEL_PATH}/public/mix-manifest.jsonRUN set -x ; cd ${LARAVEL_PATH} \&& mkdir -p storage \&& mkdir -p storage/framework/cache \&& mkdir -p storage/framework/sessions \&& mkdir -p storage/framework/testing \&& mkdir -p storage/framework/views \&& mkdir -p storage/logs \&& chmod -R 777 storage \&& php artisan package:discover

最后一个阶段构建 NGINX 镜像

FROM nginx:alpine as nginxARG LARAVEL_PATH=/app/laravelCOPY laravel.conf /etc/nginx/conf.d/
COPY --from=laravel ${LARAVEL_PATH}/public ${LARAVEL_PATH}/public

构建 Laravel 及 Nginx 镜像

使用 docker build 命令构建镜像。

$ docker build -t my/laravel --target=laravel .$ docker build -t my/nginx --target=nginx .

启动容器并测试

新建 Docker 网络

$ docker network create laravel

启动 laravel 容器, --name=laravel 参数设定的名字必须与 nginx 配置文件中的 fastcgi_pass laravel:9000; 一致

$ docker run -dit --rm --name=laravel --network=laravel my/laravel

启动 nginx 容器

$ docker run -dit --rm --network=laravel -p 8080:80 my/nginx

浏览器访问 127.0.0.1:8080 可以看到 Laravel 项目首页。

也许 Laravel 项目依赖其他外部服务,例如 redis、MySQL,请自行启动这些服务之后再进行测试,本小节不再赘述。

生产环境优化

本小节内容为了方便测试,将配置文件直接放到了镜像中,实际在使用时 建议 将配置文件作为 configsecret 挂载到容器中,请读者自行学习 Swarm modeKubernetes 的相关内容。

由于篇幅所限本小节只是简单列出,更多内容可以参考 https://github.com/khs1994-docker/laravel-demo 项目。

附录

完整的 Dockerfile 文件如下。

FROM node:alpine as frontendCOPY package.json /app/RUN set -x ; cd /app \&& npm install --registry=https://registry.npmmirror.comCOPY webpack.mix.js webpack.config.js tailwind.config.js /app/
COPY resources/ /app/resources/RUN set -x ; cd /app \&& touch artisan \&& mkdir -p public \&& npm run productionFROM composer as composerCOPY database/ /app/database/
COPY composer.json /app/RUN set -x ; cd /app \&& composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ \&& composer install \--ignore-platform-reqs \--no-interaction \--no-plugins \--no-scripts \--prefer-distFROM php:7.4-fpm-alpine as laravelARG LARAVEL_PATH=/app/laravelCOPY --from=composer /app/vendor/ ${LARAVEL_PATH}/vendor/
COPY . ${LARAVEL_PATH}
COPY --from=frontend /app/public/js/ ${LARAVEL_PATH}/public/js/
COPY --from=frontend /app/public/css/ ${LARAVEL_PATH}/public/css/
COPY --from=frontend /app/public/mix-manifest.json ${LARAVEL_PATH}/public/mix-manifest.jsonRUN set -x ; cd ${LARAVEL_PATH} \&& mkdir -p storage \&& mkdir -p storage/framework/cache \&& mkdir -p storage/framework/sessions \&& mkdir -p storage/framework/testing \&& mkdir -p storage/framework/views \&& mkdir -p storage/logs \&& chmod -R 777 storage \&& php artisan package:discoverFROM nginx:alpine as nginxARG LARAVEL_PATH=/app/laravelCOPY laravel.conf /etc/nginx/conf.d/
COPY --from=laravel ${LARAVEL_PATH}/public ${LARAVEL_PATH}/public

作者主页: 正函数的个人主页
文章收录专栏: Docker
在这里插入图片描述

在这里插入图片描述

欢迎大家点赞 👍 收藏 ⭐ 加关注哦!
如果你认为这篇文章对你有帮助,请给正函数点个赞吧,如果发现什么问题,欢迎评论区留言!!

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

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

相关文章

webpack面试题学习

说说你对webpack的理解?解决了什么问题? 说说webpack的构建流程? 说说webpack中常见的Loader?解决了什么问题? 说说webpack中常见的Plugin?解决了什么问题? 说说Loader和Plugin的区别?编写Load…

leetcode 013二维区域和检索---矩阵不可变

给定一个二维矩阵 matrix,以下类型的多个请求: 计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2) 。 实现 NumMatrix 类: NumMatrix(int[][] matrix) 给定整数矩阵 matrix 进…

Failed to connect to github.com

链接github超时 hosts文件夹下加上

Python使用HTTP代理实现网络请求的自动化

随着网络技术的发展,网络请求成为了许多应用的重要组成部分。然而,手动发送网络请求不仅效率低下,而且容易出错。为了解决这个问题,我们可以使用Python来实现网络请求的自动化。而HTTP代理可以帮助我们更好地控制和管理这些请求。…

【小笔记】时序数据分类算法最新小结

2024.1.15 最近基于时序数据训练分类算法,对其进行了一番了解,主要围绕以下几点: 时序数据算法有哪些细分类?时序数据分类算法经典模型?当下时序分类算法模型强baseline?有没有现成的工具? 1…

二、VTK 最简单的示例代码-创建圆柱体

今天来使用VS2019 CMake 项目 测试VTK 9.0.0 的环境是否配置好 来测试一段简单的代码 // 1.cpp: 定义应用程序的入口点。 //#include <vtkActor.h> #include <vtkCamera.h> #include <vtkCylinderSource.h> #include <vtkNamedColors.h> #include &l…

【FPGA Modsim】序列检测

实验题目&#xff1a; 序列检测器设计 实验目的&#xff1a; 掌握应用数字逻辑设计集成开发环境进行序列检测器设计的方法&#xff1b;掌握时序逻辑电路设计的过程。 实验内容&#xff1a; 1、设计一个序列检测器…

Talk|香港中文大学高瑞元:MagicDrive - 基于3D几何控制的自动驾驶街景数据生成

本期为TechBeat人工智能社区第565期线上Talk。 北京时间1月18日(周四)20:00&#xff0c;香港中文大学博士生—高瑞元的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “MagicDrive - 基于3D几何控制的自动驾驶街景数据生成”&#xff0c;介绍了他的…

湛江涡轮壳工件实物扫描三维测绘广州抄数公司造型stl转面3d打印

湛江涡轮壳上门实物三维扫描及抄数打印案例&#xff08;CASAIM中科广电&#xff09;&#xff1a; 涡轮壳三维扫描及逆向设计技术是一种基于计算机辅助设计&#xff08;CAD&#xff09;和逆向工程&#xff08;RE&#xff09;的方法&#xff0c;用于对涡轮壳进行精确的三维测量和…

基于小波多普勒变换的回波信号检测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1小波变换基础 4.2 多普勒效应与多普勒变换 4.3 小波多普勒变换 4.4 回波信号检测 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 %回波…

解决打开 json 文件中文乱码的问题

如下图&#xff0c;pycharm 打开是下面的样子 右下角的编码尝试了好久&#xff0c;依然打不开 用代码打开就成功了 import jsonwith open(./Mydata/garbage_classification.json,encodingutf8,moder) as f:data json.load(f) print(data)控制台结果&#xff1a;

时序分解 | Matlab实现SMA-CEEMDAN利用黏菌优化算法优化CEEMDAN时间序列信号分解

时序分解 | Matlab实现SMA-CEEMDAN利用黏菌优化算法优化CEEMDAN时间序列信号分解 目录 时序分解 | Matlab实现SMA-CEEMDAN利用黏菌优化算法优化CEEMDAN时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 SMA-CEEMDAN利用黏菌优化算法优化CEEMDAN Matlab语言…

JVM性能调优-垃圾收集器G1详解

目录 G1收集器(-XX:UseG1GC) G1垃圾收集分类 YoungGC MixedGC Full GC G1收集器参数设置 G1垃圾收集器优化建议 什么场景适合使用G1 G1收集器(-XX:UseG1GC) G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足…

VSCode 插件推荐

前言 关于开发用的插件就不做赘述了&#xff0c;网上面有很多文章都做了推荐&#xff0c;本文推荐几个好看的插件。 文件图标主题 Vscode icons Material Icon Theme 字体主题 推荐 One Dark Pro 其他 推荐一个生成好看代码的网址 https://carbon.now.sh/

智能小程序真机调试教程

概述 Tuya MiniApp Tools 真机调试通过网络连接实现 kit 插件调试功能&#xff0c;帮助开发者更好地排查定位问题。区别于模拟调试&#xff0c;真机调试将使用用户的真实环境。 功能 发起调试 在 Tuya MiniApp Tools 中登录并打开项目&#xff0c;单击上述图片红框内按钮后&…

【前沿技术杂谈:智能对话的未来】深入比较ChatGPT与文心一言

【前沿技术杂谈&#xff1a;智能对话的未来】深入比较ChatGPT与文心一言 引言主体智能回复语言准确性知识库丰富度 深入分析&#xff1a;ChatGPT与文心一言的技术对比技术架构和算法数据处理和隐私用户界面和体验 应用场景分析未来展望技术进步的趋势潜在的挑战对社会的影响 结…

【mars3d】 graphic.bindPopup(inthtml).openPopup()无需单击小车,即可在地图上自动激活弹窗的效果。

实现效果&#xff1a;new mars3d.graphic.FixedRoute({无需单击小车&#xff0c;即可在地图上实现默认打开弹窗的激活效果。↓↓↓↓↓↓↓↓ 相关链接说明&#xff1a; 1.popup的示例完全开源&#xff0c;可参考&#xff1a;功能示例(Vue版) | Mars3D三维可视化平台 | 火星科…

Python使用HTTP代理实现网络请求的调试和日志记录

在Python中&#xff0c;使用HTTP代理可以实现网络请求的调试和日志记录。通过HTTP代理&#xff0c;我们可以拦截、修改或记录网络请求和响应的数据&#xff0c;以便更好地了解和调试网络请求。 下面是一个使用Python和httplib2库实现HTTP代理的示例&#xff0c;同时对请求和响…

水经微图Web版1.5.0发布

让每一个人都有自己的地图&#xff01; 水经微图&#xff08;简称“微图”&#xff09;新版已上线&#xff0c;在该版本中主要新增了撤销、重做、截图、视频气泡、绘制时捕捉节点和属性导出选择等功能。 现在&#xff0c;为你分享一下本轮迭代上新主要功能&#xff0c;以及部…

安卓Android studio读写EM4305卡源码

本示例使用的发卡器&#xff1a; https://item.taobao.com/item.htm?id718720660087&spma1z10.5-c.w4002-21818769070.15.57dc6f89txUhXE <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xml…