[PHP]Docker部署优化,以体积换速度

之前项目通过Docker部署时都是在dockerfile指定官方的基础镜像源然后再添加自己项目需要用到的基础库,导致每次部署需要3-10分钟才能部署,最近项目着急在等部署过程漫长又煎熬,所以进行优化。

通过部署日志可以发现,在拉取三方库或安装基础库时因镜像不稳定速度不固定。基本需要3分钟以上。

然后公司有自己的内网私有仓库,所以以体积换速度的方案是最优解,且像PHP基础库安装完后基本不怎么改动,所以通过这个方案进行优化。

首先先从官方拉取一个基础镜像源:

docker pull docker pull php:7.4-fpm-alpine3.16

并且创建一个容器并运行

docker create --name 容器名 基础镜像tag
docker start 容器名

然后就可以在容器内塞入你需要用到的命令。如下是之前用的比较多的一份dockefile

FROM registry.k8s.clicki.cn/common/php-fpm:7.4-fpm-alpine3.16

COPY --chown=www-data:www-data . /var/www/html

ARG IDC_FLAG
ENV IDC_FLAG=${IDC_FLAG:+"$IDC_FLAG"/}

RUN apk add -X https://mirrors.cloud.tencent.com/alpine/v3.11/main -u alpine-keys --allow-untrusted
RUN echo "https://mirrors.cloud.tencent.com/alpine/v3.11/main/" > /etc/apk/repositories && \
    echo "https://mirrors.cloud.tencent.com/alpine/v3.11/community/" >> /etc/apk/repositories && \
    apk update && \
    apk add -U tzdata && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime

COPY deploy/tx/default.conf / 
COPY deploy/tx/php.ini /usr/local/etc/php/
COPY deploy/tx/nginx.conf /etc/nginx/
COPY deploy/tx/run.sh /

RUN apk update && apk add nginx && \
    apk add m4 autoconf make gcc g++ linux-headers libffi-dev openssl-dev libmemcached-dev&& \
	  mkdir -p /usr/src/php/ext/memcached && \
    mkdir -p /usr/src/php/ext/redis && \
	  mkdir -p /var/lib/lxc/lxcfs/proc && \
	  tar -C /usr/src/php/ext/memcached -zxvf deploy/memcached-3.1.5.tgz --strip 1 && \
    tar -C /usr/src/php/ext/redis -zxvf deploy/phpredis-5.3.7.tar.gz --strip 1 && \
    docker-php-ext-install pdo_mysql opcache mysqli memcached redis zip gd && \
    mv /default.conf /etc/nginx/conf.d && \
    chmod u+x /run.sh && \
    apk del m4 autoconf make gcc g++ linux-header

EXPOSE 80

WORKDIR /var/www/html

ENTRYPOINT ["/run.sh"]

然后可以把里面的以下命令在容器下执行:

RUN apk add -X https://mirrors.cloud.tencent.com/alpine/v3.11/main -u alpine-keys --allow-untrusted
RUN echo "https://mirrors.cloud.tencent.com/alpine/v3.11/main/" > /etc/apk/repositories && \
    echo "https://mirrors.cloud.tencent.com/alpine/v3.11/community/" >> /etc/apk/repositories && \
    apk update && \
    apk add -U tzdata && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime

RUN apk update && apk add nginx && \
    apk add m4 autoconf make gcc g++ linux-headers libffi-dev openssl-dev libmemcached-dev && \
	  mkdir -p /usr/src/php/ext/memcached && \
    mkdir -p /usr/src/php/ext/redis && \
	  mkdir -p /var/lib/lxc/lxcfs/proc && \
    tar -C /usr/src/php/ext/memcached -zxvf deploy/memcached-3.1.5.tgz --strip 1 && \
    tar -C /usr/src/php/ext/redis -zxvf deploy/phpredis-5.3.7.tar.gz --strip 1 && \   
    docker-php-ext-install pdo_mysql opcache mysqli memcached redis zip gd && \
    apk del m4 autoconf make gcc g++ linux-headers

如上的memcached属于外部文件写入容器,所以在执行命令前需要把文件拷贝进容器

docker cp 宿主机文件 容器名:容器目录

上传到私有仓库

在容器内打包完后,回到宿主机终端。进行标签打包

docker commit 容器名 目标镜像名:目标版本号

再tag到私有仓库。并发布

docker tag 镜像名:版本号 私有仓库地址(不带协议头)/[目录]/镜像:版本号
docker push 私有仓库地址(不带协议头)/[目录]/镜像:版本号

发布完成后,修改项目的dockerfile source提交部署试试。

项目运行正常,部署时间大幅缩减。