后端Laravel项目Docker构建

2022-02-14 17:19:04 浏览数 (1)

一直在忙着做前端,后端有一段时间没碰过了,正好前段时间把一个小程序的后端重新部署了下,需要把老旧的部署方式换成新的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

0 人点赞