过节之前来一发,又是许久没整理笔记了,今天跟大家聊聊Docker如何搭建私有仓库的几种方式。首先我们来回顾一下之前讲到的Doker 平台的基本构成。
Doker 平台的基本构成
Docker 平台基本上由三部分组成:
- 客户端:用户使用 Docker 提供的工具(CLI 以及 API 等)来构建,上传镜像并发布命令来创建和启动容器
- Docker 主机:从 Docker registry 上下载镜像并启动容器
- Docker registry:Docker 镜像仓库,用于保存镜像,并提供镜像上传和下载
- 后面的文章会具体分析。
搭建方式
与Mavan的管理一样,Docker不仅提供了一个中央仓库,同时也允许我们使用registry搭建本地私有镜像仓库。
使用私有仓库有许多优点:
- 节省网络带宽,针对于每个镜像不用每个人都去中央仓库上面去下载,只需要从私有仓库中下载即可;
- 提供镜像资源利用,针对于公司内部使用的镜像,推送到本地的私有仓库中,以供公司内部相关人员使用。
方式一(registry镜像)
环境:为了测试安装方便,这里准备了一台装有Docker的云服务器。
搭建私有仓库:
# 下载registry镜像
$ sudo docker pull registry
# 通过该镜像启动一个容器
$ sudo docker run -d -p 8082:8082 registry
# 映射镜像路径至宿机器、放置容器删除、镜像丢失:
$ sudo docker run -d -p 8082:8082 -v /opt/data/registry:/tmp/registry registry
修改配置并重启Docker
vi /etc/docker/daemon.json
{
"registry-mirrors": ["172.17.120.102:8082"],
"insecure-registries":["172.17.120.102:8082"]
}
# 重启 docker 服务
systemctl restart docker
测试仓库Push/Pull:
# 首先pull一个比较小的镜像(busybox)来测试
docker pull busybox
# 修改一下该镜像的tag
$ docker tag busybox 172.17.120.102:8080/busybox
# 上传镜像到私有仓库。
$ docker push 172.17.120.102:8082/busybox
到此就搭建好了Docker私有仓库,但是如上搭建的仓库是不需要加密认证的,当然你可以通过证书或者Nginx实现认证访问。下面介绍一下基于Nexus 3搭建的Docker私有仓库。
方式二(Nexus 3)
Nexus简介
Nexus是一个多功能的仓库管理系统,是企业常用的私有仓库服务器软件。目前常被用来作为Maven私服、Docker私服。
优点
- 安装简单,并且有官方Docker镜像
- 用户界面,并提供REST API
- 支持浏览、检索以及检查机制
- 支持npm与bower以及Raw repositories、NuGet repositories
总之Nexus物美价廉,又提供功能全面的oss版,加之支持种类众多的依赖管理,又可以统一管理docker镜像。
安装
参考之前写的一篇博客:本地私服仓库nexus3.3.1使用手册 。当然,这里我们有更简洁的安装方式,由于nexus3+依赖于JDK1.8,可能有不少企业系统上安装的还是1.7甚至是1.6版本,这里我们选择使用Docker镜像安装。
下载安装:
# 下载nexus3镜像(pull前请更换镜像加速器,否则可能无法下载)
$ sudo docker pull sonatype/nexus3
# 通过该镜像启动一个容器
$ sudo docker run -d -p 8081:8081 -p 8082:8082 --name nexus sonatype/nexus3
# 可能需要一些时间(2-3分钟)才能在新容器中启动该服务。一旦Nexus准备就绪,您可以确定日志以确定结果:
$ sudo docker logs -f nexus
# 测试 如果出现pong说明启动成功
$ curl -u admin:admin123 http://localhost:8081/service/metrics/ping
注意事项:
- 可能会出现无法启动的问题,由于云服务器只有1G内存,剩余也有几十MB的样式,显然是无法跑起来的。
- Nexus的安装是/opt/sonatype/nexus。
- 持久目录,/nexus-data用于配置,日志和存储。该目录需要由作为UID 200运行的Nexus进程写入。
- 环境变量用于将JVM参数传递给启动脚本
$ docker run -d -p 8081:8081 --name nexus -e INSTALL4J_ADD_VM_PARAMS="-Xms2g -Xmx2g -XX:MaxDirectMemorySize=3g -Djava.util.prefs.userRoot=/some-other-dir" sonatype/nexus3
- 控制Nexus访问目录,NEXUS_CONTEXT,默认为/
docker run -d -p 8081:8081 --name nexus -e NEXUS_CONTEXT=nexus sonatype/nexus3
- 持久数据
$ mkdir /opt/data/nexus-data && chown -R 200 /opt/data/nexus-data
$ docker run -d -p 8081:8081 --name nexus -v /opt/data/nexus-data:/nexus-data sonatype/nexus3
创建本地仓库:
Nexus配置:
项目 | 地址端口 |
---|---|
Nexus UI | 8081 |
private repo | 8082 |
URL | http://192.168.1.180:8081/ |