前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >后端Laravel项目Docker构建

后端Laravel项目Docker构建

原创
作者头像
无忧366
修改2022-02-14 17:19:04
1.4K0
修改2022-02-14 17:19:04
举报
文章被收录于专栏:Hello worldHello world

一直在忙着做前端,后端有一段时间没碰过了,正好前段时间把一个小程序的后端重新部署了下,需要把老旧的部署方式换成新的Docker部署,新接触docker,在这里记录下。

没使用过docker,为了完成这个功能,周末两天刷了后盾人关于docker的视频和bilibili上的一些视频。

之前一直都是直接手动部署到服务器上,现在来看下新旧部署方式的对比:

新旧部署方式对比
新旧部署方式对比

最终想要的结果是一个docker镜像,里边包含所有的运行环境和代码

看下之前的目录结构

api和后台部署在同一台服务器上,通过nginx区分,nginx文件在nginx文件夹下

我经过了几个方案不同的探索,最后成功实现预期,先看下三个方案对比:

方案1: laradock

想要将laravel做成一个docker,第一个想到的是laradock这,用laravel的人应该没有不知道这个的。

laradock很方便就能创建一个新的laradock项目。

但我要做的是将一个老旧项目改成docker形式,这就和新建不同,但也不是没有办法。我做了下面几个步骤

1. 使用laradock新建项目

2. 将就项目拷贝到新建项目下

3. 构建镜像

非常轻松的就能构建出项目镜像,但是这时候有出现了一个问题,我想要的是一个镜像,但是生成出来是:PHP镜像+Nginx镜像+Redis镜像+...

一堆镜像完全不符合一个镜像的要求。

这时我想的是能不能将这一堆镜像合并成一个镜像,经过查找,发现了docker 的save命令,能将所有镜像打包成一个tar保存到本地。

但预期的是能在远端构建一个镜像并推送,save成一个这种方式完全无法满足要求

到这里我就放弃了这种方式,去寻找其他的方式。

当我用另一种方式实现之后,有时间静下来在仔细研究才发现,原来使用这种方式也可以实现,只是要修改docker-compose.yml这个文件

方案2:docker-compose

docker-compose是一个用来定义和运行复杂应用的Docker工具。

compose 通过一个配置文件来管理多个Docker容器,使用docker-compose脚本来启动,停止和重启应用。

这种方式很轻易的在本地实现了镜像构建,但是有两个问题

1. 生成多个镜像

2. 远端运行docker-compose

最后发现laradock就是使用的docker-compose,这两个没有什么区别,最后无奈放弃

方案3:直接使用Dockerfile配置

使用这种方式过程中碰到很多问题:

1. 文件权限

2. 文件夹名

3. nginx配置

4. 证书

5. 安装解压redis

看下最后的文件

这里边有一个问题就是php->ext->redis-5.3.4.tar这个文件,这个是先下载到本地,再copy到镜像里,如果直接在镜像里下载,一直都不成功。

直接上Dockerfile代码

代码语言:javascript
复制
FROM php:7.3-fpm-alpine3.11
ADD repositories /etc/apk/repositories
ADD /nginx/config/default.conf /
ADD /nginx/crt/api.crt /
ADD /nginx/crt/api.key /
ADD www /www
ADD wwwlogs /wwwlogs 
ADD index.html /
ADD run.sh /
ADD /php/config/php.ini /usr/local/etc/php/
COPY /php/ext/redis-5.3.4.tar /

RUN apk update && apk add --no-cache php7-gd

RUN apk add --no-cache freetype libpng libjpeg-turbo freetype-dev libpng-dev libjpeg-turbo-dev && \
  docker-php-ext-configure gd \
    --with-gd \
    --with-freetype-dir=/usr/include/ \
    --with-png-dir=/usr/include/ \
    --with-jpeg-dir=/usr/include/ && \
  NPROC=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || 1) && \
  docker-php-ext-install -j${NPROC} gd && \
  apk del --no-cache freetype-dev libpng-dev libjpeg-turbo-dev

RUN apk add nginx && \
    apk add m4 autoconf make gcc g++ linux-headers && \
    docker-php-ext-install pdo_mysql opcache mysqli && \
    apk add redis && \
    mkdir /run/nginx && \
    mv /default.conf /etc/nginx/conf.d/default.conf && \
    mv /api.crt /etc/nginx/api.crt && \
    mv /api.key /etc/nginx/api.key && \
    mv /www /var/www && \
    mv /wwwlogs /var/www && \
    mv /index.html /var/www/html && \
    touch /run/nginx/nginx.pid && \
    chmod 755 /run.sh && \
    chmod 777 -R /var/www/www/api/bootstrap/cache && \
    chmod 777 -R /var/www/www/admin/bootstrap/cache && \
    chmod 777 -R /var/www/www/api/storage && \ 
    chmod 777 -R /var/www/www/admin/storage && \
    chmod 777 -R /var/www/html && \
    chmod 777 -R /var/www/wwwlogs && \
    pecl install /redis-5.3.4.tar && \
    docker-php-ext-enable redis && \
    apk del m4 autoconf make gcc g++ linux-headers

EXPOSE 80
EXPOSE 9000

ENTRYPOINT ["/run.sh"]

下边的是run.sh

代码语言:javascript
复制
#!/bin/sh

# 后台启动
php-fpm -D

nginx

redis-server

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 方案1: laradock
  • 方案2:docker-compose
  • 方案3:直接使用Dockerfile配置
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档