怎么通过docker/portainer部署vue项目

这篇文章分享一下如何通过docker将vue项目打包成镜像文件,并使用打包的镜像在docker/portainer上部署运行,写这篇文章参考了vue-cli和docker的官方文档。

首先,阅读vue-cli关于docker部署的说明,上面提供了关键的几个步骤。

从上面的页面内容中,得出了以下结论:前端项目需要依赖http服务器来部署,比如tomcat、apache、nginx等。

接下来开始进入正题,通过自己的天天生鲜商城的前端vue项目,手把手教大家一步一步地构建自己的vue项目的前端镜像,并在docker上启动起来。

目录

第一步、通过git拉取vue前端项目

第二步、下载项目依赖

第三步、创建Dockerfile

安装npm

下载nginx的镜像

下载node.js的镜像

第四步、创建.dockerignore文件

第五步:修改项目里使用的ip地址

第六步、编译项目

第七步、构建前端镜像

第八步、在docker/portainer上部署

docker上部署

portainer上部署

第九步:挂载nginx配置文件

确认挂载路径

创建挂载路径

复制挂载文件

开启文件挂载


第一步、通过git拉取vue前端项目

在ubuntu的任意目录下执行以下命令拉取git项目的代码,建议在ubuntu的根目录/下操作。

1、切换到根目录

cd /

 2、克隆项目

git clone https://gitee.com/he-yunlin/ttsx.git

第二步、下载项目依赖

进入项目的根目录下

cd /ttsx

下载项目依赖

npm install

第三步、创建Dockerfile

在ttsx项目的根目录下创建一个Dockerfile文件,文件内容如下:

FROM node:14.16.0 as build-stage
WORKDIR /app
COPY package*.json ./
COPY ./ .
​
FROM nginx as production-stage
RUN mkdir /app/
COPY --from=build-stage /app/dist /app
COPY nginx.conf /etc/nginx/nginx.conf

这个Dockerfile文件做了以下几件事:

  • 基于node.js构建一个docker容器A,在这个容器内部创建工作目录/app
  • 把项目ttsx的根目录下的文件复制到容器内部工作目录/app下
  • 基于nginx构建一个容器B,在这个容器内部创建工作目录/app
  • 把容器A的/app/dist目录下的文件复制到容器B的/app目录下
  • 把项目ttsx根目录下的nginx.conf复制为容器B的/etc/nginx/nginx.conf文件

接下来需要下载Dockerfile文件里要用到的命令和docker镜像:

安装npm

需要安装node.js或者npm工具,因为构建前端镜像的时候要用到。

apt install npm

下载nginx的镜像

下载最新版本的即可

docker pull nginx

下载node.js的镜像

docker pull node:14.16.0

第四步、创建.dockerignore文件

在项目根目录下创建名为.dockerignore的文件。

.dockerignore文件配置在Dockerfile中执行COPY命令时忽略的文件,比如COPY ./ .这条命令会把当前项目根目录下的所有文件(除了配置在了.dockerignore文件里的)都复制到docker容器内部。

注意:上面的Dockerfile会从容器A中复制/app/dist,所以这里不能忽略/dist,否则就找不到了,镜像会构建失败。

**/node_modules
README.md
.gitignore
.dockerignore
Dockerfile
.idea

第五步:修改项目里使用的ip地址

既然是在服务器上运行,就不能再用localhost了,应该改成对应的服务器ip地址。修改项目里用到的ip地址及端口号。

第六步、编译项目

npm run build

编译完成后,生成了一个dist目录

第七步、构建前端镜像

docker build . -t ttsx:20231003hyl

第八步、在docker/portainer上部署

docker上部署

只需要通过docker的run命令运行刚刚打包的镜像,命令如下:

docker run ttsx:20231003hyl

portainer上部署

在portainer中添加一个应用程序栈stack,填写docker-compose.yml

version: "3"
​
services:ttsx:container_name: ttsximage: ttsx:20231003hylports:- 8088:80

填写完成后页面下拉,找到并点击Depoly the stack按钮,portainer就会帮我们通过指定的镜像和端口信息创建并运行一个docker容器。

第九步:挂载nginx配置文件

一般情况下,nginx.conf是可能被频繁修改的,为了能够方便地修改前端镜像中的nginx.conf,需要让其和宿主机的文件简历一个挂载关系。

注意:以下操作的前提是你没有在docker的宿主机ubuntu上面安装nginx,如果安装了nginx,需要考虑需要修改一下挂载路径,否则从容器内部复制出来的配置文件会覆盖原来的nginx.conf的内容。

确认挂载路径

第一步,就是要确认挂载路径,就是你要把docker容器内的nginx.conf放在什么路径下面。

比如就挂载在和docker容器内部的nginx.conf一样的位置

/etc/nginx/nginx.conf

创建挂载路径

如果你的ubuntu上如果没有安装过nginx的话,需要在宿主机ubuntu上面创建对应的挂载路径,路径没有要求。

mkdir -p /etc/nginx

然后要在这个目录下创建nginx.conf文件,内容为空

cd /etc/nginx
touch nginx.conf

复制挂载文件

接下来就是把nginx.conf文件从docker容器内部复制文件出来,使用docker的cp命令。

docker cp 容器ID/容器名:容器内的文件路径 宿主机的文件路径

所以这篇文章中,复制nginx.conf的命令为

docker cp ttsx:/etc/nginx/nginx.conf /etc/nginx/nginx.conf

如图,执行完以上命令之后,刷新/etc/nginx目录,nginx.conf文件变成了827B,复制成功。

开启文件挂载

这也是最后一步,在ttsx的stack的docker-compose.xml,添加挂载设置

version: "3"services:ttsx:container_name: ttsximage: ttsx:20231005hylports:- 8088:80volumes:- /etc/nginx/nginx.conf:/etc/nginx/nginx.conf

好了,docker部署vue前端项目的全部过程都介绍完了,看完不要忘了点赞+收藏哦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/150556.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

体会jdk17对于空指针的增强

jdk17 // 可以清楚的看出来a.b.c.num中由于c是空指针,所以导致异常 jdk11 // 只报第6行空指针了,但是因为哪个变量,不知道

Spring注册Bean系列--方法5:@Import+ImportBeanDefinitionRegistrar

原文网址:Spring注册Bean系列--方法5:ImportImportBeanDefinitionRegistrar_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Spring注册Bean的方法:ImportImportBeanDefinitionRegistrar。 注册Bean的方法我写了一个系列,见&#xff…

14:00面试,14:06就出来了,这问的过于变态了。。。

前言 刚从小厂出来,没想到在另一家公司我又寄了。 在这家公司上班,每天都要加班,但看在钱给的比较多的份上,也就不太计较了。但万万没想到9月一纸通知,所有人不准加班了,不仅加班费没有了,薪资…

秒验:可以自定义UI的一键登录服务

一键登录如今成为越来越多移动应用的首选,但千篇一律的登陆界面在引发用户担忧其安全性的同时,也容易让用户在不同APP切换时产生误解。因此,由国内知名移动应用开发服务商MobTech打造的一键登录工具——秒验,通过允许开发者自定义…

Qt之QDial(表盘)

简介 QDial类提供了一个四舍五入的范围控制&#xff08;如速度计或电位计&#xff09;&#xff0c;非常适合需要循环计数的情况&#xff0c;例如角度等。 头文件&#xff1a;#include <QDial> qmake&#xff1a;QT widgets 继承&#xff1a;QAbstractSlider …

FPGA设计时序约束三、设置时钟组set_clock_groups

目录 一、背景 二、时钟间关系 2.1 时钟关系分类 2.2 时钟关系查看 三、异步时钟组 3.1 优先级 3.2 使用格式 3.3 asynchronous和exclusive 3.4 结果示例 四、参考资料 一、背景 Vivado中时序分析工具默认会分析设计中所有时钟相关的时序路径&#xff0c;除非时序约束…

Flink学习笔记(一):Flink重要概念和原理

文章目录 1、Flink 介绍2、Flink 概述3、Flink 组件介绍3.1、Deploy 物理部署层3.2、Runtime 核心层3.3、API&Libraries 层3.4、扩展库 4、Flink 四大基石4.1、Checkpoint4.2、State4.3、Time4.4、Window 5、Flink 的应用场景5.1、Event-driven Applications【事件驱动】5.…

docker数据管理和网络通信

docker数据管理 管理 Docker 容器中数据主要有两种方式&#xff1a; 数据卷&#xff08;Data Volumes&#xff09;和数据卷容器&#xff08;DataVolumes Containers&#xff09;。 1&#xff0e;数据卷 数据卷是一个供容器使用的特殊目录&#xff0c;位于容器中。可将宿主机…

轻量级MobileSAM:比FastSAM快4倍,处理一张图像仅需10ms(附源代码)

论文地址&#xff1a;https://arxiv.org/pdf/2306.14289.pdf 代码地址&#xff1a;https://github.com/ChaoningZhang/MobileSAM 一、概要简介 SAM是一种prompt-guided的视觉基础模型&#xff0c;用于从其背景中剪切出感兴趣的对象。自Meta研究团队发布SA项目以来&#xff0c…

浅析如何在抖音快速通过新手期并积累粉丝

抖音是一款非常受欢迎的短视频分享平台&#xff0c;它提供了一个快速成名和积累粉丝的机会。对于新手来说&#xff0c;通过四川不若与众总结的以下几个步骤可以帮助你快速通过抖音的新手期。 首先&#xff0c;确定你的内容定位。在抖音上&#xff0c;有各种各样的内容类型&…

解决报错:模块“react-redux“没有导出的成员“TypedUseSelectorHook”

在react整合typescript,redux时&#xff0c;写hook.ts时报这个错&#xff1a;模块"react-redux"没有导出的成员“TypedUseSelectorHook” 现象如下&#xff1a; 原因&#xff1a;react-redux版本太低&#xff0c;至少要升级到7.2.3以后才能包含TypedUseSelectorHook…

用 Pytorch 自己构建一个Transformer

一、说明 用pytorch自己构建一个transformer并不是难事,本篇使用pytorch随机生成五千个32位数的词向量做为源语言词表,再生成五千个32位数的词向量做为目标语言词表,让它们模拟翻译过程,transformer全部用pytorch实现,具备一定实战意义。 二、论文和概要 …

Pytorch目标分类深度学习自定义数据集训练

目录 一&#xff0c;Pytorch简介&#xff1b; 二&#xff0c;环境配置&#xff1b; 三&#xff0c;自定义数据集&#xff1b; 四&#xff0c;模型训练&#xff1b; 五&#xff0c;模型验证&#xff1b; 一&#xff0c;Pytorch简介&#xff1b; PyTorch是一个开源的Python机…

15经验模态分解及其改进程序,EMD,EEMD, CEEMDAN,三合一程序,已调试完成,替换自己数据可直接跑。

经验模态分解及其改进程序&#xff0c;EMD&#xff0c;EEMD, CEEMDAN,三合一程序&#xff0c;已调试完成&#xff0c;替换自己数据可直接跑。

Altium Designer培训 | 1 - 软件安装新建工程篇

目录 写在开头 工作环境 软件安装 心得 中英文切换 更改系统设置 快速启动AD 禁止AD收集个人信息 设置工程文件路径 不检查更新 禁止联网 防火墙的入站出站规则 新建入站规则 新建出站规则 工程的组成及创建 工程组成 创建工程 1.创建工程文件 2.创建原理图…

JavaScript系列从入门到精通系列第十九篇:JavaScript中的this关键字

文章目录 前言 一&#xff1a;什么是this 二&#xff1a;this的灵活妙用 前言 function fun(a,b){console.log(a b); }fun(1,2); 我们通过形参的形式往参数中添加了参数。浏览器也会默默的给我们传递一个参数过去&#xff0c;这个参数被称为this。传递的节点就是在调用函…

基于知识蒸馏的两阶段去雨去雪去雾模型学习记录(三)之知识测试阶段与评估模块

去雨去雾去雪算法分为两个阶段&#xff0c;分别是知识收集阶段与知识测试阶段&#xff0c;前面我们已经学习了知识收集阶段&#xff0c;了解到知识阶段的特征迁移模块&#xff08;CKT)与软损失&#xff08;SCRLoss&#xff09;,那么在知识收集阶段的主要重点便是HCRLoss(硬损失…

Unity可视化Shader工具ASE介绍——2、ASE的Shader创建和输入输出

大家好&#xff0c;我是阿赵&#xff0c;这里继续介绍Unity可视化写Shader的ASE插件的用法。上一篇介绍了ASE的安装和编辑器界面分布&#xff0c;这一篇主要是通过一个简单的例子介绍shader的创建和输入输出。 一、ASE的Shader创建 这里先选择Surface类型的Shader&#xff0c;…

Java高级之反射

关于反射的举例&#xff1a; 示例代码&#xff1a;Fan.java package testFanShe;/*** author: Arbicoral* Description: 测试反射&#xff1a;* 成员变量&#xff1a;2个public&#xff0c;2个private* 构造器&#xff1a;4个public&#x…

Glide源码分析

一&#xff0c;Glide一次完整的加载流程 下面的流程图是一次完整的使用Glide加载图片流程,时序图 二&#xff0c;Glide重要的类图 三&#xff0c;Glide加载图片 流程图