Docker的仓库主要分两类:
共有仓库只要在官方注册用户,登录即可使用。但对于仓库的使用,企业还是会有自己的专属镜像,所以私有库的搭建也是很有必要的存在。
对于原生的仓库,Docker提供了Registry,它能帮助我们组建属于自己的私有库,但是缺点也比较明显,就是难管理,无法进行复杂的操作
1)拉取相关的镜像
$ docker pull registry:2.7.1
$ docker pull joxit/docker-registry-ui:latest # 非必须,简单的界面
2)进行 Registry的相关yml文件配置(docker-compose)
其中有两个文件需要进行配置,一个为config.yml,另一个为docker-compose.yml
$ mkdir -p /etc/docker/registry
$ cat > /etc/docker/registry/config.yml < docker-compose.yaml <
3)镜像推送
$ docker tag nginx 192.168.73.105:5000/nginx:latest
$ docker push 192.168.73.105:5000/nginx:latest
The push refers to repository [192.168.80.200:5000/nginx]
Get "https://192.168.73.105:5000/v2/": http: server gave HTTP response to HTTPS client
# 开启非安全认证
vim /etc/docker/daemon.json
{
"insecure-registries" : [ "192.168.73.105:5000" ]
}
$ systemctl restart docker
#通web进入http://192.168.73.105。
Harbor 是 VMware 公司开源的企业级 Docker Registry 项目,其目标是帮助用户迅速搭建一个企业级的 Docker Registry 服务。
Harbor以 Docker 公司开源的 Registry 为基础,提供了图形管理 UI 、基于角色的访问控制(Role Based AccessControl) 、AD/LDAP 集成、以及审计日志(Auditlogging) 等企业用户需求的功能,同时还原生支持中文。
Harbor 的每个组件都是以 Docker 容器的形式构建的,使用 docker-compose 来对它进行部署。用于部署 Harbor 的 docker-compose 模板位于 harbor/docker-compose.yml。
Harbor 在架构上主要有 Proxy、Registry、Core services、Database(Harbor-db)、Log collector(Harbor-log)、Job services 六个组件。
Harbor 的每个组件都是以 Docker 容器的形式构建的,因此,使用 Docker Compose 来对它进行部署。
总共分为7个容器运行,通过在docker-compose.yml所在目录中执行 docker-compose ps 命令来查看, 名称分别为:
其中 harbor-adminserver 主要是作为一个后端的配置数据管理,并没有太多的其他功能。harbor-ui 所要操作的所有数据都通过 harbor-adminserver 这样一个数据配置管理中心来完成。
本次演示环境,我是在虚拟机 Linux RedHat 7.2 上操作,以下是安装的软件及版本:
//下载或者上传 Docker-Compose
$ curl -L https://github.com/docker/compose/releases/download/2.8.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose
$ docker-compose -v
#下载或上传 Harbor 安装程序
Harbor的压缩包下载地址:https://github.com/goharbor/harbor/releases
$ wget http://harbor.orientsoft.cn/harbor-1.9.4/harbor-offline-installer-v1.2.2.tgz
$ tar zxvf harbor-offline-installer-v1.2.2.tgz -C /usr/local/
#修改harbor安装的配置文件
$ vim /usr/local/harbor/harbor.cfg
--5行--修改,设置为Harbor服务器的IP地址或者域名
$ hostname = 192.168.73.107
--59行--指定管理员的初始密码,默认的用户名/密码是admin/Harbor12345
$ harbor_admin_password = Harbor12345
$ cd /usr/local/harbor/
在配置好了 harbor.cfg 之后,执行
$ ./prepare #为 harbor 启动的容器生成一些必要的文件(环境)
$ ./install.sh # 以 pull 镜像并启动容器
$ cd /usr/local/harbor/
$ docker-compose ps
##以下命令均在在habor的配置目录下运行
$ docker-compose up -d #启动
$ docker-compose stop #停止
$ docker-compose restart #重新启动
浏览器访问:http://192.168.73.107 登录 Harbor WEB UI 界面
关于 Harbor.cfg 配置文件中有两类参数:
这些参数需要在配置文件 Harbor.cfg 中设置。如果用户更新它们并运行 install.sh 脚本重新安装 Harbor, 参数将生效。具体参数如下:
这些参数对于更新是可选的,即用户可以将其保留为默认值,并在启动 Harbor 后在 Web UI 上进行更新。如果进入 Harbor.cfg,只会在第一次启动 Harbor 时生效,随后对这些参数的更新,Harbor.cfg 将被忽略。
注意:如果选择通过 UI 设置这些参数,请确保在启动 Harbor 后立即执行此操作。具体来说,必须在注册或在 Harbor 中创建任何新用户之前设置所需的 auth_mode。当系统中有用户时(除了默认的 admin 用户), auth_mode 不能被修改。
具体参数如下:
默认情况下,Harbor 将镜像存储在本地文件系统上。在生产环境中,可以考虑 使用其他存储后端而不是本地文件系统,如 S3、Openstack Swif、Ceph 等对象存储。但需要更新 common/templates/registry/config.yml 文件。
Harbor的默认镜像存储路径在 /data/registry 目录下,映射到docker容器里面的 /storage 目录下。
这个参数是在 docker-compose.yml 中指定的,在 docker-compose up -d 运行之前修改。
如果希望将 Docker 镜像存储到其他的磁盘路径,可以修改这个参数。
访问http://10.12.5.60,登录harbor。
默认的管理员用户名和密码是 admin/Harbor12345。
项目名称:小写字符、数字和._-组成,且至少一个字符,并以数字或字符开头。
访问级别:默认不选择,选择则表示当前项目公开后,任何人都有此项目下镜像的读权限,命令行用户不需要执行"docker login"就可以拉取此项目下的镜像。
存储数量:-1表示不设上限。
存储容量:-1表示无上限。
# docker login 10.12.5.60
Username: admin
Password:
Error response from daemon: Get https://10.12.5.60/v2/: dial tcp 10.12.5.60:443: getsockopt: connection refused
因为 docker1.3.2 版本开始默认 docker registry 使用的是 https,我们设置 Harbor 默认 http 方式,所以当执行用 docker login、pull、push 等命令操作非 https 的 docker regsitry 的时就会报错。解决办法:
$ vim /etc/docker/daemon.json
{
"insecure-registries": ["10.12.5.60"] #如果要与别的仓库配置共用,中间要用“,”隔开
}
$ systemctl daemon-reload
$ systemctl restart docker
# docker login 10.12.5.60
Username: admin
Password:
Login Succeeded
$ docker login 10.12.5.60
Username: admin
Password:
Login Succeeded
$ docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
578acb154839: Pull complete
e398db710407: Pull complete
85c41ebe6d66: Pull complete
7170a263b582: Pull complete
8f28d06e2e2e: Pull complete
6f837de2f887: Pull complete
c1dfc7e1671e: Pull complete
Digest: sha256:86e53c4c16a6a276b204b0fd3a8143d86547c967dc8258b3d47c3a21bb68d3c6
Status: Downloaded newer image for nginx:latest
$ docker tag nginx:latest 10.12.5.60/sre/nginx:v1
$ docker push 10.12.5.60/sre/nginx:v1
The push refers to repository [10.12.5.60/sre/nginx]
505f49f13fbe: Pushed
9920f1ebf52b: Pushed
768e28a222fd: Pushed
715b32fa0f12: Pushed
e503754c9a26: Pushed
609f2a18d224: Pushed
ec983b166360: Pushed
v1: digest: sha256:d2e65182b5fd330470eca9b8e23e8a1a0d87cc9b820eb1fb3f034bf8248d37ee size: 1778
$ docker tag nginx:latest 10.12.5.60/sre/nginx:v2
$ docker push 10.12.5.60/sre/nginx:v2
The push refers to repository [10.12.5.60/sre/nginx]
505f49f13fbe: Layer already exists
9920f1ebf52b: Layer already exists
768e28a222fd: Layer already exists
715b32fa0f12: Layer already exists
e503754c9a26: Layer already exists
609f2a18d224: Layer already exists
ec983b166360: Layer already exists
v2: digest: sha256:d2e65182b5fd330470eca9b8e23e8a1a0d87cc9b820eb1fb3f034bf8248d37ee size: 1778