网站服务器租用价格,汕头最新新闻消息,wordpress 文章图片链接,用模板做网站需要懂代码吗NodeJS#xff08;Vue#xff09;项目也可以通过打包成Docker镜像的方式进行部署#xff0c;原理是先将项目打包成静态页面#xff0c;然后再将静态页面直接copy到Nginx镜像中运行。
一、服务器环境配置 前面说明了服务器Nginx的安装和配置#xff0c;这里稍微有些不同Vue项目也可以通过打包成Docker镜像的方式进行部署原理是先将项目打包成静态页面然后再将静态页面直接copy到Nginx镜像中运行。
一、服务器环境配置 前面说明了服务器Nginx的安装和配置这里稍微有些不同但是因为此文是用Nginx镜像和前端镜像页面同时部署的方式来打包发布的所以这里不再需要建立/data/container/nginx/html目录因为要发布的静态页面已经在Nginx镜像中的/nginx/html目录了。这里也减少了手动部署安装Nginx的步骤而是在Jenkins任务中调用shell命令自动执行安装。
1. 新建Dockerfile文件用于定义Nginx镜像及将打包成功的静态文件复制到镜像中此文件放在前端项目的根目录下Jenkins打包时会从此处查找Dockerfile文件。
FROM nginx:latest
# 维护者信息
MAINTAINER gitegg
# 将生成的静态页面文件复制到nginx的/usr/share/nginx/html/目录
COPY dist/ /usr/share/nginx/html/
# 容器启动时运行的命令
CMD [nginx, -g, daemon off;]2. 部署及备份目录准备
新建 /opt/tmp 目录用于Jenkins打包后通过 Publish Over SSH插件将包传输到服务器的临时目录如果前面创建过这里无需再创建。新建 /opt/bak 目录用于存储所有部署过的包备份方便后续版本回滚。此目录可能会占用很大空间所以需要选择一个磁盘空间大的挂载目录如果前面创建过这里无需再创建。新建 /opt/script 目录用于Jenkins将包传输完成之后执行安装、备份操作的相关命令脚本如果前面创建过这里无需再创建。新建 /data/container/nginx/www映射Nginx容器内的/var/www目录。新建 /data/container/nginx/logs映射Nginx容器内的/var/log/nginx目录存放nginx运行日志。新建 /data/container/nginx/etc映射Nginx容器内的/etc/nginx目录新建 /data/container/nginx/etc/nginx.conf映射Nginx容器内的/etc/nginx/nginx.conf配置文件
mkdir -p /opt/tmp /opt/bak /opt/script /data/container/nginx/www /data/container/nginx/logs /data/container/nginx/etc
chmod -R 777 /opt/tmp /opt/bak /opt/script /data/container/nginx/www /data/container/nginx/logs /data/container/nginx/etc3.根据系统部署要求编写Nginx配置文件nginx.conf以下是简单的配置方法正常情况下https请求还需要配置ssl证书还有ipv6配置等后面详细讲解Nginx配置。一定要将修改后的nginx.conf文件放到/data/container/nginx/etc/目录下否则nginx启动时会报错找不到配置文件。 server {listen 80;server_name 域名;gzip on;gzip_buffers 32 4K;gzip_comp_level 6;gzip_min_length 100;gzip_types application/javascript text/css text/xml text/plain application/x-javascript image/jpeg image/gif image/png;gzip_disable MSIE [1-6]\.; gzip_vary on;#charset koi8-r;access_log /var/log/nginx/portal.access.log main;location / {root /nginx/html/gitegg_portal;try_files $uri $uri/ /index.html;index index.html index.htm;}location /gitegg-api/ {proxy_set_header Host $http_host; proxy_set_header X-Real-Ip $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://172.17.0.1:8080/;}}4. 部署脚本编写说明
定义入参可以通过Jenkins任务将参数传入脚本中我们定义了下面7个参数 container_nameportal-server 容器名称 image_nameportal-server 镜像名称 versionlatest 镜像版本 portal_port80 宿主主机端口映射 server_port80 容器内服务端口 portal_ssl_port443 宿主主机端口映射 serve_sslr_port443 容器内服务端口对参数进行检查是否未传入参数这里根据自己的实际情况判断比如必须传入哪些参数就设置参数的个数不能小于几。
echo param validate
if [ $# -lt 1 ]; thenecho you must use like this : ./publish_docker_portal.sh container_name image_name version [portal port] [server port] [portal ssl port] [server ssl port] exit
fi入参赋值如果有参数传入则取服务参数如果没有参数传入则取默认值
if [ $1 ! ]; thencontainer_name$1
fi
echo container_name $container_name
if [ $2 ! ]; thenimage_name$2
fi
if [ $3 ! ]; thenversion$3
fi
echo version $version
if [ $4 ! ]; thenportal_port$4
fi
echo portal_port $portal_port
if [ $5 ! ]; thenserver_port$5
fi
echo server_port $server_port
if [ $6 ! ]; thenportal_ssl_port$6
fi
echo portal_ssl_port $portal_ssl_port
if [ $7 ! ]; thenserve_sslr_port$7
fi
echo serve_sslr_port $serve_sslr_port停止并删除容器
echo 执行docker ps
docker ps
if [[ $(docker inspect $container_name 2 /dev/null | grep $container_name) ! ]];
then echo $container_name 容器存在停止并删除echo docker stop $container_namedocker stop $container_nameecho docker rm $container_namedocker rm $container_name
else echo $container_name 容器不存在
fi停止并删除镜像
# 删除镜像
echo 执行docker images
docker images
if [[ $(docker images -q $image_name 2 /dev/null) ! ]];
then echo $image_name 镜像存在删除镜像docker rmi $(docker images -q $image_name 2 /dev/null) --force
else echo $image_name 镜像不存在
fi备份本次安装镜像包
#bak image
echo bak image $image_name
BAK_DIR/opt/bak/docker/$image_name/date %Y%m%d
mkdir -p $BAK_DIR
cp /opt/tmp/portal-image.tar $BAK_DIR/$image_name_date %H%M%S.tar执行安装镜像包命令
echo docker load $image_name
docker load --input /opt/tmp/portal-image.tar执行运行命令
echo docker run $image_name
docker run -d -p $portal_port:$server_port -p $portal_ssl_port:$server_ssl_port --name$container_name -e TZAsia/Shanghai --restartalways -v /data/container/nginx/www:/var/www -v /data/container/nginx/logs:/var/log/nginx -v /data/container/nginx/etc:/etc/nginx -v /data/container/nginx/etc/nginx.conf:/etc/nginx/nginx.conf -v /etc/localtime:/etc/localtime -v /usr/share/zoneinfo/Asia/Shanghai:/etc/timezone -v /bxl/container/nginx/ssl:/nginx/ssl $image_name删除安装文件因为前面已经备份过了所以这里将临时安装文件删除
echo remove tmp $image_name
rm -rf /opt/tmp/portal-image.tar打印执行完成的命令
echo Docker Portal is starting,please try to access $container_name conslone url完整的安装部署脚本
container_nameportal-server
image_nameportal-server
versionlatest
portal_port80
server_port80
portal_ssl_port443
serve_sslr_port443
echo param validate
if [ $# -lt 1 ]; then echo you must use like this : ./publish_docker_portal.sh container_name image_name version [portal port] [server port] [portal ssl port] [server ssl port] exit
fi
if [ $1 ! ]; thencontainer_name$1
fi
echo container_name $container_name
if [ $2 ! ]; thenimage_name$2
fi
if [ $3 ! ]; thenversion$3
fi
echo version $version
if [ $4 ! ]; thenportal_port$4
fi
echo portal_port $portal_port
if [ $5 ! ]; thenserver_port$5
fi
echo server_port $server_port
if [ $6 ! ]; thenportal_ssl_port$6
fi
echo portal_ssl_port $portal_ssl_port
if [ $7 ! ]; thenserve_sslr_port$7
fi
echo serve_sslr_port $serve_sslr_portecho 执行docker ps
docker ps
if [[ $(docker inspect $container_name 2 /dev/null | grep $container_name) ! ]];
then echo $container_name 容器存在停止并删除echo docker stop $container_namedocker stop $container_nameecho docker rm $container_namedocker rm $container_name
else echo $container_name 容器不存在
fi
# 删除镜像
echo 执行docker images
docker images
if [[ $(docker images -q $image_name 2 /dev/null) ! ]];
then echo $image_name 镜像存在删除镜像docker rmi $(docker images -q $image_name 2 /dev/null) --force
else echo $image_name 镜像不存在
fi#bak image
echo bak image $image_name
BAK_DIR/opt/bak/docker/$image_name/date %Y%m%d
mkdir -p $BAK_DIR
cp /opt/tmp/portal-image.tar $BAK_DIR/$image_name_date %H%M%S.tarecho docker load $image_name
docker load --input /opt/tmp/portal-image.tarecho docker run $image_name
docker run -d -p $portal_port:$server_port -p $portal_ssl_port:$server_ssl_port --name$container_name -e TZAsia/Shanghai --restartalways -v /data/container/nginx/www:/var/www -v /data/container/nginx/logs:/var/log/nginx -v /data/container/nginx/etc:/etc/nginx -v /data/container/nginx/etc/nginx.conf:/etc/nginx/nginx.conf -v /etc/localtime:/etc/localtime -v /usr/share/zoneinfo/Asia/Shanghai:/etc/timezone -v /bxl/container/nginx/ssl:/nginx/ssl $image_nameecho remove tmp $image_name
rm -rf /opt/tmp/portal-image.tarecho Docker Portal is starting,please try to access $container_name conslone url二、新建Jenkins配置打包任务打包部署NodeJSVue镜像
1. 新建任务前安装Docker Pipeline插件使用Pipeline流水线任务构建部署安装Jenkins插件相关内容请查看前面部署Jenkins相关文章。 2. 安装完插件之后新建一个流水线任务。 3. 和之前的任务一样选择“丢弃旧的构建”设置保持构建的最大个数为5。 4. 下拉到“流水线”配置选择Pipeline script 流水线脚本如下
node {# 从gitlab下载代码stage(Preparation) { // for display purposes// Get some code from a GitHub repositoryecho checkout from GitLabcheckout scmGit(branches: [[name: */main]], extensions: [], userRemoteConfigs: [[credentialsId: git_username, url: http://127.0.0.1:9091/test/test.git]])}# NodeJS打包stage(Build NodeJS Vue) {echo build nodejs codenodejs(Node17) {sh echo $PATHsh node -vsh pnpm -vsh pnpm installsh pnpm run build}}# 此处判断本机打包是否有容器如果有的话需要删除stage(Delete Old Docker Container) {echo delete docker containersh if [[ $(docker inspect $container_name 2 /dev/null | grep $container_name) ! ]]; then echo $container_name 容器存在停止并删除echo docker stop $container_namedocker stop $container_nameecho docker rm $container_namedocker rm $container_nameelse echo $container_name 容器不存在fi}# 此处判断本机打包是否有镜像如果有的话需要删除stage(Delete Old Docker Image) {echo delete docker imagesh if [[ $(docker images -q gitegg-portal 2 /dev/null) ! ]]; then echo gitegg-portal \镜像存在删除镜像\docker rmi $(docker images -q gitegg-portal 2 /dev/null) --forceelse echo gitegg-portal \镜像不存在创建镜像\fi}# Docker打包镜像并保存为tarstage(Build Docker Image) {echo start docker build portal code// Run the docker builddocker.build gitegg-portalecho save docker images tarsh docker save -o portal-image.tar gitegg-portal}# 删除安装在本机的Docker镜像非tar包stage(Delete New Docker Image) {echo delete docker imagesh if [[ $(docker images -q gitegg-portal 2 /dev/null) ! ]]; then echo gitegg-portal \镜像存在删除镜像\docker rmi $(docker images -q gitegg-portal 2 /dev/null) --forceelse echo gitegg-portal \镜像不存在创建镜像\fi}# 将Docker镜像tar包发送到服务器并执行部署命令stage(Send Docker Image) {echo send docker imagesshPublisher(publishers: [sshPublisherDesc(configName: Test, transfers: [sshTransfer(cleanRemote: false, excludes: , execCommand: /opt/script/publish_docker_portal.sh gitegg-portal gitegg-portal latest 8130 8130 4413 4413, execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: [, ], remoteDirectory: , remoteDirectorySDF: false, removePrefix: , sourceFiles: portal-image.tar)], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])}stage(Publish Results) {echo End Publish Portal}
}
12. 在任务左侧点击立即构建
立即构建 流水线任务可以在右侧显示阶段视图 查看构建日志点击立即构建之后下方会出现进度条点击进度条就可以进入构建日志界面。
13. 构建成功后下方会给出构建成功提示。