Docker + Verdaccio 搭建Npm私有仓库

1,620 阅读9分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

安装 Docker

linux服务器使用curl下载快速安装的shell脚本

curl -fsSL get.docker.com -o get-docker.sh
复制代码

下载完成后,可以ls命令查看一下。已经存在的话,使用sh命令执行这个脚本

sh get-docker.sh
复制代码

注意如果不是root用户,需要使用sudo su获取超级管理员权限。

安装完成后启动一下Docker Server

systemctl start docker
复制代码

使用docker version命令能看到ClientServer就启动成功了。

docker 安装 Verdaccio

1. 配置文件准备

mkdir /home/verdaccio
cd /home/verdaccio
mkdir conf && mkdir storage && mkdir plugins
cd conf
touch htpasswd
vi config.yaml
复制代码

上面的命令,每行都要依次执行下,然后在config.yaml写入配置

# 存放软件所有软件包的目录
storage: ../storage
# 存放所有插件的目录
plugins: ../plugins

web:
  # 网站Title
  title: Verdaccio
  # 禁用Gravatar头像
  # gravatar: false
  # 排序方式 asc|desc
  # sort_packages: asc
  # 是否启用暗黑模式
  # darkMode: true
  # logo地址
  # logo: http://somedomain/somelogo.png
  # favicon地址
  # favicon: http://somedomain/favicon.ico | /path/favicon.ico

# i18n翻译配置
# i18n:
# 可用列表见:https://github.com/verdaccio/ui/tree/master/i18n/translations
#   web: en-US

auth:
  htpasswd:
    file: ./htpasswd
    # 最大注册用户数,默认为 "+inf".
    # 可用通过设置为-1禁止注册
    # max_users: 1000

# 上游npm库,这里可用设置为淘宝
uplinks:
  npmjs:
    url: https://registry.npmjs.org/

packages:
  # 作用域包
  '@*/*':  
    # 允许所有人访问
    access: $all
    # 注册用户可访问
    publish: $authenticated
    # 注册用户可访问
    unpublish: $authenticated
    proxy: npmjs

  '**':
    # 默认情况下所有用户 (包括未授权用户) 都可以查看和发布任意包
    # 你可以指定 用户名/分组名 (取决于你使用什么授权插件,默认的授权插件是内置的 htpasswd)
    # 访问权限有三个关键词: "$all", "$anonymous", "$authenticated"
    # $all 表示不限制,任何人可访问;
    # $anonymous 表示未注册用户可访问;
    # $authenticated 表示只有注册用户可访问
    access: $all

    # 允许所有注册用户发布/撤销已发布的软件包
    # (注意:默认情况下任何人都可以注册)
    publish: $authenticated
    unpublish: $authenticated

    # 如果私有包服务不可用在本地,则会代理请求到'npmjs'
    proxy: npmjs

# 您可以指定传入连接的HTTP /1.1服务器保持活动超时(以秒为单位)。
# 值为0会使http服务器的行为类似于8.0.0之前的Node.js版本,后者没有保持活动超时。
# 解决方法:通过给定的配置可以解决以下问题
server:
  keepAliveTimeout: 60
# 中间件 表示 npm audit 可以使用
middlewares:
  audit:
    enabled: true

# 日志设置
logs: { type: stdout, format: pretty, level: http }

# 开放远程访问,允许所有IP
listen:
  - 0.0.0.0:4873
复制代码

2. 一键安装运行 verdaccio

V_PATH=/home/verdaccio; docker run -d -it --name verdaccio \
  -p 4873:4873 \
  -v $V_PATH/conf:/verdaccio/conf \
  -v $V_PATH/storage:/verdaccio/storage \
  -v $V_PATH/plugins:/verdaccio/plugins \
  verdaccio/verdaccio
复制代码

运行成功后就可以通过http://服务器ip:4873访问npm私有库了。

指令拆解:

  1. V_PATH=/home/verdaccio: 这个就是给后面 $V_PATH 使用的

  2. docker run -d -it --name verdaccio:

    • -d 守护进程 之前可能是使用PM2来管理;
    • -it 是 -i 与 -t 的缩写;
    • -i: 以交互模式运行容器,通常与 -t 同时使用;
    • -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
    • --name verdaccio: 为容器指定一个名称;
    • \ : 换行;
    • -p: 指定端口映射,格式为:主机(宿主)端口:容器端口。当然还有-P 随机端口映射,容器内部端口随机映射到主机的端口
    • --volume , -v: 绑定一个卷 : /verdaccio/conf —> /home/verdaccio/conf 等等
  1. verdaccio/verdaccio 启动 verdaccio

3. 给软件包目录和用户记录文件目录授予权限

这一步必须要做,不然不能新增用户和上传软件包。Running Verdaccio using Docker

chown 10001:65533 /home/verdaccio/conf/htpasswd
chown 10001:65533 /home/verdaccio/storage
chown 10001:65533 /home/verdaccio/plugins

Docker 讲解

2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫“dotCloud”的公司。

img

这家公司主要提供基于PaaS的云计算技术服务。具体来说,是和LXC有关的容器技术。

imgLXC,就是Linux容器虚拟技术(Linux container)

后来,dotCloud公司将自己的容器技术进行了简化和标准化,并命名为——Docker

img

Docker技术诞生之后,并没有引起行业的关注。而dotCloud公司,作为一家小型创业企业,在激烈的竞争之下,也步履维艰。

正当他们快要坚持不下去的时候,脑子里蹦出了“开源”的想法。

什么是“开源”?开源,就是开放源代码。也就是将原来内部保密的程序源代码开放给所有人,然后让大家一起参与进来,贡献代码和意见。

imgOpen Source,开源

有的软件是一开始就开源的。也有的软件,是混不下去,创造者又不想放弃,所以选择开源。自己养不活,就吃“百家饭”嘛。

2013年3月,dotCloud公司的创始人之一,Docker之父,28岁的Solomon Hykes正式决定,将Docker项目开源。

img

不开则已,一开惊人。

越来越多的IT工程师发现了Docker的优点,然后蜂拥而至,加入Docker开源社区。

Docker的人气迅速攀升,速度之快,令人瞠目结舌。

开源当月,Docker 0.1 版本发布。此后的每一个月,Docker都会发布一个版本。到2014年6月9日,Docker 1.0 版本正式发布。

此时的Docker,已经成为行业里人气最火爆的开源技术,没有之一。甚至像Google、微软、Amazon、VMware这样的巨头,都对它青睐有加,表示将全力支持。

Docker火了之后,dotCloud公司干脆把公司名字也改成了Docker Inc. 。

Docker和容器技术为什么会这么火爆?说白了,就是因为它“轻”。

在容器技术之前,业界的网红是虚拟机。虚拟机技术的代表,是VMWareOpenStack

img

相信很多人都用过虚拟机。虚拟机,就是在你的操作系统里面,装一个软件,然后通过这个软件,再模拟一台甚至多台“子电脑”出来。

img
虚拟机,类似于“子电脑”

在“子电脑”里,你可以和正常电脑一样运行程序,例如开QQ。如果你愿意,你可以变出好几个“子电脑”,里面都开上QQ。“子电脑”和“子电脑”之间,是相互隔离的,互不影响。

虚拟机属于虚拟化技术。而Docker这样的容器技术,也是虚拟化技术,属于轻量级的虚拟化

虚拟机虽然可以隔离出很多“子电脑”,但占用空间更大,启动更慢,虚拟机软件可能还要花钱(例如VMWare)。

而容器技术恰好没有这些缺点。它不需要虚拟出整个操作系统,只需要虚拟一个小规模的环境(类似“沙箱”)。

img

沙箱

它启动时间很快,几秒钟就能完成。而且,它对资源的利用率很高(一台主机可以同时运行几千个Docker容器)。此外,它占的空间很小,虚拟机一般要几GB到几十GB的空间,而容器只需要MB级甚至KB级。

img容器和虚拟机的对比

正因为如此,容器技术受到了热烈的欢迎和追捧,发展迅速。

我们具体来看看Docker。

大家需要注意,Docker本身并不是容器,它是创建容器的工具,是应用容器引擎。

想要搞懂Docker,其实看它的两句口号就行。

第一句,是 “Build, Ship and Run”

img

也就是,“搭建、发送、运行”,三板斧。

举个例子:

我来到一片空地,想建个房子,于是我搬石头、砍木头、画图纸,一顿操作,终于把这个房子盖好了。

img

结果,我住了一段时间,想搬到另一片空地去。这时候,按以往的办法,我只能再次搬石头、砍木头、画图纸、盖房子。

但是,跑来一个老巫婆,教会我一种魔法。

这种魔法,可以把我盖好的房子复制一份,做成“镜像”,放在我的背包里。

img

等我到了另一片空地,就用这个“镜像”,复制一套房子,摆在那边,拎包入住。

img

怎么样?是不是很神奇?

所以,Docker的第二句口号就是: “Build once,Run anywhere(搭建一次,到处能用)”。

Docker技术的三大核心概念,分别是:

  • 镜像(Image)
  • 容器(Container)
  • 仓库(Repository)

我刚才例子里面,那个放在包里的“镜像”,就是Docker镜像。而我的背包,就是Docker仓库。我在空地上,用魔法造好的房子,就是一个Docker容器。(10分钟看懂Docker和K8S 的讲解)

个人理解: Docker镜像 就是一个对象, Docker容器 就是实例化了这个对象(Docker镜像)

说白了,这个Docker镜像,是一个特殊的文件系统。它除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(例如环境变量)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

也就是说,每次变出房子,房子是一样的,但生活用品之类的,都是不管的。谁住谁负责添置。

每一个镜像可以变出一种房子。那么,我可以有多个镜像呀!

也就是说,我盖了一个欧式别墅,生成了镜像。另一个哥们可能盖了一个中国四合院,也生成了镜像。还有哥们,盖了一个非洲茅草屋,也生成了镜像。。。

这么一来,我们可以交换镜像,你用我的,我用你的,岂不是很爽?

img

于是乎,就变成了一个大的公共仓库。

负责对Docker镜像进行管理的,是Docker Registry服务(类似仓库管理员)。

不是任何人建的任何镜像都是合法的。万一有人盖了一个有问题的房子呢?

所以,Docker Registry服务对镜像的管理是非常严格的。

最常使用的Registry公开服务,是官方的Docker Hub,这也是默认的 Registry,并拥有大量的高质量的官方镜像。

总结: 这里 verdaccio 是一个镜像,然后我们有做了一些资源的配置,配置文件访问我们自己的文件夹,创建出一个本地的容器,有点容器是我们对镜像进行封装出来的。

docker 常用指令

  • docker ps -a 查看所有容器

  • docker rm $(docker ps -a -q) 删除没在运行的容器

  • docker start name|id 启动容器

重启有个问题就是之前的库不存在了 I restart verdaccio, WebUI show packages are missing , but In filefolder packages are still there

管理 npm 源、注册用户、发布包

1. npm 源替换为私有库源

$ npm config set registry http://127.0.0.1:4873
复制代码

直接把默认的npm源替换为我们私有库,但是多个源的时候不太好管理。所以推荐使用nrm来管理我们的npm源。

2. nrm 管理 npm 源

# 全局安装nrm
$ npm install -g nrm
​
# 添加私有库
$ nrm add verdaccio http://{服务器ip}:4873
​
# 查看现有的npm源
$ nrm ls
* npm -------- https://registry.npmjs.org/
  yarn ------- https://registry.yarnpkg.com/
  cnpm ------- http://r.cnpmjs.org/
  taobao ----- https://registry.npm.taobao.org/
  nj --------- https://registry.nodejitsu.com/
  npmMirror -- https://skimdb.npmjs.com/registry/
  edunpm ----- http://registry.enpmjs.org/
  verdaccio -- http://{服务器ip}:4873/
# 设置npm源
$ nrm use verdaccio
复制代码

3. 注册私有库用户

# 注册用户
$ npm adduser
复制代码

4. 登陆私有库用户

# 登录用户
$ npm login# 查看当前登录用户
$ npm who am i
复制代码

5. 在私有库发布包

# 发布当前包 
$ npm publish

6. 删除之前发布的包

# 删除之前发布的包
$ npm unpublish xxxx --force

7. 发布前的版本修改

# 发布前的版本修改, 修改第一个 x.0.0
$ npm version major

# 发布前的版本修改, 修改第二个 1.x.0
$ npm version minor

# 发布前的版本修改, 修改第二个 1.0.x
$ npm version patch

verdaccio的issues

当你重启verdaccio后,发现 http://服务器ip:4873 的页面上面没有显示你之前部署上去的包了。

I restart verdaccio, WebUI show packages are missing , but In filefolder packages are still there

参考文章

verdaccio github

verdaccio

10分钟看懂Docker和K8S

基于 Docker + Verdaccio 搭建 Npm 私有库,实现在私有库上发布、下载npm包