之前项目通过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提交部署试试。
项目运行正常,部署时间大幅缩减。