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