当前位置: 首页 > news >正文

【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.lryc.cn/news/283662.html

相关文章:

  • 【MATLAB源码-第118期】基于matlab的蜘蛛猴优化算法(SMO)无人机三维路径规划,输出做短路径图和适应度曲线。
  • 【计算机组成与体系结构Ⅱ】Tomasulo 算法模拟和分析(实验)
  • Nginx 简介
  • C++入门学习(一)写一个helloworld
  • ChatGPT 股市知识问答
  • uniapp多端评价页
  • 行为树(Behavior Trees)
  • opensssl BIO方式https客户端
  • JavaScript之判断是否整数、取余、取整、进制、位或、ES6
  • 【打造你自己的Shell:编写定制化命令行体验】
  • PGSQL主键序列
  • pg14.2迁移至KingbaseV8R6后部分表记录数为空
  • 【Spring 篇】深入解析SpringMVC的组件魅力
  • HPsocket 在 C# 中的运用:一款优秀的 socket 通信框架
  • 黑豹程序员-MyBatisPlus封装SQL的where条件的对象 QueryWrapper
  • 每日一题——LeetCode1252.奇数值单元格的数目
  • C#学习笔记3-函数与单元测试
  • osg屏幕事件处理器和状态集操控器学习
  • 中国泛娱乐出海视频字幕解决方案
  • iOS原生应用屏幕适配完整流程
  • 【征服redis8】Redis的AOF持久化
  • 【动态规划】【二分查找】【C++算法】730. 统计不同回文子序列
  • android 和 opencv 开发环境搭建
  • elasticsearch[一]-索引库操作(轻松创建)、文档增删改查、批量写入(效率倍增)
  • tp6框架中Http类 请求的header、body参数传参 及post、file格式
  • 基于极限学习机的图像处理,基于ELM的图像分割,基于极限学习机的细胞分割
  • ELAU C400/A8/1/1/1/00嵌入式系统中的模块动态加载技术
  • github clone Failed to connect to github.com port 443 after xxx ms
  • ARM的一些基础知识
  • 零售的数字化转型,利用AWS云服务资源如何操作?