教你怎么用Docker 部署前端

越来越多的前端团队选择用 Docker 部署前端项目,方法是将项目打包成一个镜像,然后在服务端直接拉镜像启动项目。这种方式可以忽略服务器环境差异,更容易做版本管理。

但我们平常使用 Docker 拉取镜像时,默认会从 Docker Hub 这个公共仓库拉取。虽然 Docker Hub 也可以上传自己的镜像,但是上传后会对所有人开放,这对公司项目来说显然是不允许的。

为此,Docker 官方提供了工具 registry 来帮助我们搭建私有镜像仓库,用于管理自己的镜像。后续所有的项目更新、升级、回滚,都要用到这个镜像仓库。

下面详细介绍如何使用registry 搭建私有镜像仓库。

创建镜像仓库

首先确保在你要搭建私有仓库的服务器上,已经安装好了 Docker(如何安装 Docker 这里不介绍)。

(1)使用命令拉取 registry 镜像:

$ docker pull registry

(2)建立要存储私有镜像的目录,如 /data/docker/registry

$ mkdir -vp /data/docker/registry

(3)使用以下命令,基于 registry 镜像运将容器运行起来:

$ docker run -d \-p 5000:5000 \--restart=always \--name registry \-v /data/docker/registry:/var/lib/registry \registry

容器运行后会占用 5000 端口,该端口是访问镜像仓库的入口。

(4)运行成功后,使用以下命令测试连接情况:

$ curl http://localhost:5000/v2/_catalog

如果返回以下结果:

{"repositories":[]}

则表示镜像仓库创建成功。此时仓库内没有镜像,所以是一个空数组。

(5)配置 Nginx 转发

一般情况下,需要配置一个域名来转发 5000 端口。假设域名为 docker.test.com,添加一个配置文件,代码如下:

server {listen 80;server_name docker.test.com;charset utf-8;location / {proxy_pass http://127.0.0.1:5000;proxy_set_header Host $host:$server_port;proxy_set_header X-Forwarded-For $remote_addr;proxy_set_header X-Forwarded-Proto $scheme;}
}

配置后,使用 nginx -s reload 命令重载配置文件,即可通过该域名访问镜像仓库。

添加登录授权验证

上一节我们创建了私有仓库,允许客户端将自定义镜像上传到这里。不过,私有仓库不允许公开上传、更不允许公开下载,所以还要做授权验证。

和用户登录的逻辑一样,我们需要为私有仓库创建账号和密码,登录之后的客户端才能推送镜像。我们使用文件的方式存储账号密码,使用 httpd:2 这个镜像来创建账号密码。

(1)在数据目录(/data/docker/registry)下新建 auth 文件夹:

$ cd /data/docker/registry && mkdir auth

(2)添加用户 testuser、密码 testpass,命令如下:

$ docker run \--entrypoint htpasswd \httpd:2 -Bbn testuser testpass > auth/htpasswd

此时会创建一个 htpasswd 文件,该文件中存储了已添加的用户账号和密码。

(3)停止之前运行的容器,然后重新运行:

$ docker stop registry
$ docker run -d \-p 5000:5000 \--restart=always \--name registry \-v /data/docker/registry:/var/lib/registry \-v /data/docker/registry/auth:/auth \-e "REGISTRY_AUTH=htpasswd" \-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \registry:2

运行成功后,假设仓库域名是 docker.test.com,那么在浏览器中访问 http://docker.test.com/v2/_catalog,如果弹出登录框,让你输入账号密码,表示授权验证已生效。

2023-09-16-08-49-12.png

添加 Web UI 管理镜像仓库

上一步通过域名访问仓库,登录后只能看到列出的镜像名字。然而我们需要管理镜像,比如查看版本、查看链接、删除无用镜像等,此时就需要一个 Web UI 界面来管理镜像仓库。

使用开源项目 docker-registry-ui 可以快速为镜像仓库搭建 Web UI。我们选择最简单的静态部署方式,使用 docker-compose 将 docker-registry-ui 与 registry 关联在一起。官方 demo 可以查看 这里。

参考 demo 中的 simple.yml,我们写一个 registry.yml,作为 docker-compose 的配置:

version: '2.0'
services:registry:image: registry:2environment:- REGISTRY_AUTH=htpasswd- REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm- REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswdvolumes:- /data/docker/registry:/var/lib/registry- /data/docker/registry/auth:/authnetworks:- registry-ui-netui:image: joxit/docker-registry-ui:latestports:- 5000:80environment:- REGISTRY_TITLE=My Private Docker Registry- NGINX_PROXY_PASS_URL=http://registry:5000- SINGLE_REGISTRY=truedepends_on:- registrynetworks:- registry-ui-net
networks:registry-ui-net:

这个配置将 registry 和 ui 两个服务绑成了一个应用容器,我们可以同时启动和停止它们。执行启动命令:

$ docker-compose -f registry.yml -d

启动后,访问 5000 端口即可 web 界面,同时 5000 也代理了 registry。也就是说。可以同时使用 5000 端口访问 web 界面和推送/拉取镜像。

2023-09-16-08-51-01.png

设置允许删除镜像

默认 registry 的镜像是不允许删除的,registry-ui 也没有提供删除的按钮。

Registry 的配置是一个 YAML 文件,它提供了非常多的默认配置(文档参考这里),是否允许删除就是一个配置项,默认如下:

storage:delete:enabled: false

因为我们是用 docker-compose 运行的,没有 registry 配置文件,只有 registry.yml 文件,所以允许删除的配置要在 registry.yml 里定义。

registry 提供了一个配置规则,可以将配置字段大写并且用_连接起来,组成一个环境变量,使配置生效。

所以允许删除的配置转换成环境变量是:

REGISTRY_STORAGE_DELETE_ENABLED=true

将该环境变量写入 registry.yml 文件中即完成了配置。如下:

services:registry:environment:- REGISTRY_STORAGE_DELETE_ENABLED=true

修改配置文件后重新启动容器,就可以在页面中看到删除按钮了。

最后,不管在电脑本地还是在 CI 工具中,上传镜像到该仓库时都需要登录。使用上面创建的用户名密码登录仓库,命令如下:

$ docker login -u testuser docker.test.com

其中 testuser 是用户名,docker.test.com 是镜像仓库域名,执行后输入密码即可登录成功。之后便可以向该仓库中上传镜像了。

技术前沿拓展

前端开发,你的认知不能仅局限于技术内,需要发散思维了解技术圈的前沿知识。细心的人会发现,开发内部工具的过程中,大量的页面、场景、组件等在不断重复,这种重复造轮子的工作,浪费工程师的大量时间。

介绍一款程序员都应该知道的软件JNPF快速开发平台,很多人都尝试用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。

这是一个基于 Java Boot/.Net Core 构建的简单、跨平台快速开发框架。前后端封装了上千个常用类,方便扩展;集成了代码生成器,支持前后端业务代码生成,实现快速开发,提升工作效率;框架集成了表单、报表、图表、大屏等各种常用的 Demo 方便直接使用;后端框架支持 Vue2、Vue3。如果你有闲暇时间,可以做个知识拓展。

看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~

今日分享就到这里,感谢阅读!

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

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

相关文章

PWM调光 降压恒流LED芯片FP7127:为照明系统注入新能量(台灯、GBR、调光电源、汽车大灯)

目录 一、降压恒流LED芯片FP7127 二、降压恒流LED芯片FP7127具有以下特点: 三、降压恒流LED芯片FP7127应用领域: LED照明和调光的新纪元随着LED照明技术的不断发展,人们对于照明调光的需求也越来越高。PWM调光技术作为一种常用的调光方法&…

一、认识 JVM 规范(JVM 概述、字节码指令集、Class文件解析、ASM)

1. JVM 概述 JVM:Java Virtual Machine,也就是 Java 虚拟机 所谓虚拟机是指:通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的计算机系统。 即:虚拟机是一个计算机系统。这种计算机系统运行在完全隔离的环境中…

【心得】java反序列化漏洞利用启蒙个人笔记

目录 前置基础概念 java的反序列化利用概念baby题 例题1 例题2 java反序列化启蒙小结: URLDNS链 一句话总结: 简单分析: 利用点: 示例: 前置基础概念 序列化 类实例->字节流 反序列化 字节流->类实…

卡尔曼滤波器原理By_DR_CAN 学习笔记

DR_CAN卡尔曼滤波器 Kalman Filter Recursive Algorithm迭代过程 数学基础正态分布和6-SigmaData FusionCovariance MatrixState Space Representation离散化推导 linearizationTaylor Series2-DSummary Step by Step Derivation of Kalman Gain矩阵求导公式 Prior / Posterio…

如何在Docker上运行Redis

环境: 1.windows系统下的Docker deckstop 1.Pull Redis镜像 2.运行Redis镜像 此时,Redis已经启动,我们登录IDEA查看下是否连接上了 显示连接成功,证明已经连接上Docker上的Redis了

积分梳状滤波器CIC原理与实现

CIC(Cascade Intergrator Comb):级联积分梳状滤波器,是由积分器和梳状滤波器级联而得。滤波器系数为1,无需对系数进行存储,只有加法器、积分器和寄存器,资源消耗少,运算速率高&#…

如何基于 ESP32 芯片测试 WiFi 连接距离、获取连接的 AP 信号强度(RSSI)以及 WiFi吞吐测试

测试说明: 测试 WiFi 连接距离,是将 ESP32 作为 WiFi Station 模式来连接路由器,通过在开阔环境下进行拉距来测试。另外,可以通过增大 WiFi TX Power 来增大连接距离。 获取连接的 AP 信号强度,一般可以通过 WiFi 扫描…

Java应用崩溃的排查流程

目录 分析问题 hs_err_pid.log 上周排查了一个java应用的崩溃问题,在这里记录一下。 分析问题 首先是排查到/tmp目录下有很多的core文件,形式类似: core-18238-java-1705462412 1.3 GB 程序崩溃数据 2024-01-17 11:33:44 core-18108…

Leetcode28-合并相似的物品(2363)

1、题目 给你两个二维整数数组 items1 和 items2 ,表示两个物品集合。每个数组 items 有以下特质: items[i] [valuei, weighti] 其中 valuei 表示第 i 件物品的 价值 ,weighti 表示第 i 件物品的 重量 。 items 中每件物品的价值都是 唯一…

语义分割常用评价指标

在图像处理领域中,语义分割是很重要的一个任务。在实际项目开发中,评估模型预测效果以及各指标的含义对于优化模型极为重要。 本文将主要评价指标的计算算法进行了详细说明,并加上注释解释每个指标的含义。这对理解各指标背后的数学原理以及能否在实践中应用或许有…

GPS位置虚拟软件 AnyGo mac激活版

AnyGo for Mac是一款一键将iPhone的GPS位置更改为任何位置的强大软件!使用AnyGo在其iOS或Android设备上改变其GPS位置,并在任何想要的地方显示自己的位置。这对那些需要测试应用程序、游戏或其他依赖于地理位置信息的应用程序的开发人员来说非常有用&…

Python - SnowNLP 情感分析与自定义训练

目录 一.引言 二.SnowNLP 情感分析 1.安装 SnowNLP 2.测试 SnowNLP 三.SnowNLP 自定义训练 1.数据集准备 2.训练与保存 3.模型替换 4.模型测试 5.SnowNLP 原理 ◆ Bayes 公式 ◆ 先验概率 ◆ 后验概率 ◆ 情感模型 四.总结 一.引言 SnowNLP 是一个基于 Python …

Android双指缩放ScaleGestureDetector检测放大因子大图移动到双指中心点ImageView区域中心,Kotlin

Android双指缩放ScaleGestureDetector检测放大因子大图移动到双指中心点ImageView区域中心,Kotlin 在 Android双击图片放大移动图中双击点到ImageView区域中心,Kotlin-CSDN博客 基础上,这次使用ScaleGestureDetector检测两根手指的缩放动作&a…

Python如何叠加两张图片

我这里有如下两张图片,需要把他们叠加在一起,进行查看。这两张图片的大小都是300 300。不拼接在一起就不方便查看。需要把左边的小图,放到右边大图的中间。 一、拼接两个图片的代码 要解决这个问题,你可以使用fromarray()方法将…

JoyRL Actor-Critic算法

策略梯度算法的缺点 这里策略梯度算法特指蒙特卡洛策略梯度算法,即 REINFORCE 算法。 相比于 DQN 之类的基于价值的算法,策略梯度算法有以下优点。 适配连续动作空间。在将策略函数设计的时候我们已经展开过,这里不再赘述。适配随机策略。由…

MATLAB数据处理: 每种样本类型随机抽样

tn5;% 每种类型随机抽样数 indextrain[];% 训练样本序号集 for i1:typenumber index301 find(typemat i); n2length(index301); index302randperm(n2); index401index301(index302(1:tn)); indextrain[indextrain; index401]; end 该代码可以对大样…

java进阶

文章目录 一、Java进阶1.注解(Annotation)a.内置注解b.元注解c.自定义注解 2.对象克隆3. Java设计模式(Java design patterns)a.软件设计模式概念b.建模语言(UML)c.面向对象设计原则d.设计模式 总结面向对象…

项目工程下载与XML配置文件下载:EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(十)

XPCIE1032H功能简介 XPCIE1032H是一款基于PCI Express的EtherCAT总线运动控制卡,可选6-64轴运动控制,支持多路高速数字输入输出,可轻松实现多轴同步控制和高速数据传输。 XPCIE1032H集成了强大的运动控制功能,结合MotionRT7运动…

深度解析Oladance、韶音、南卡开放式耳机:选购指南与天花板级推荐

​随着开放式耳机在日常生活中越来越受欢迎,许多品牌纷纷降低材料品质以迎合大众需求,导致耳机的性能和音质严重下滑。这让消费者在选择优质开放式耳机时感到困惑。作为一名专业的耳机评测人员,我近期对多款热门开放式耳机进行了深入的测评&a…

Leetcode—92.反转链表II【中等】

2023每日刷题(八十一) Leetcode—92.反转链表II 算法思想 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), n…