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 <<EOF
- version: 0.1
- log:
- accesslog:
- disabled: true
- level: debug
- formatter: text
- fields:
- service: registry
- environment: staging
- storage:
- delete:
- enabled: true
- cache:
- blobdescriptor: inmemory
- filesystem:
- rootdirectory: /var/lib/registry
- http:
- addr: :5000
- headers:
- X-Content-Type-Options: [nosniff]
- Access-Control-Allow-Origin: ['http://192.168.80.200']
- Access-Control-Allow-Methods: ['HEAD', 'GET', 'OPTIONS', 'DELETE']
- Access-Control-Allow-Headers: ['Authorization', 'Accept']
- Access-Control-Max-Age: [1728000]
- Access-Control-Allow-Credentials: [true]
- Access-Control-Expose-Headers: ['Docker-Content-Digest']
- http2:
- disabled: false
- health:
- storagedriver:
- enabled: true
- interval: 10s
- threshold: 3
- EOF
-
-
-
- $ cat > docker-compose.yaml <<EOF
- version: '2.0'
- services:
- registry:
- image: registry:2.7.1
- ports:
- - 5000:5000
- volumes:
- - /opt/registry:/var/lib/registry
- - /etc/docker/registry/config.yml:/etc/docker/registry/config.yml
- ui:
- image: joxit/docker-registry-ui:latest
- ports:
- - 80:80
- environment:
- - REGISTRY_TITLE=My Private Docker Registry
- - REGISTRY_URL=http://192.168.80.200:5000
- - SINGLE_REGISTRY=true
- depends_on:
- - registry
- EOF
-
- $ docker-compose up -d
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.9.4.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
harbor启动的容器如下:
- $ docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 7e0a81e4f771 hello-world "/hello" 5 days ago Exited (0) 5 days ago optimistic_turing
- 1503c467884b goharbor/nginx-photon:v1.9.4 "nginx -g 'daemon of…" 5 days ago Up 4 days (healthy) 0.0.0.0:80->8080/tcp nginx
- fa7e63632d4b goharbor/harbor-jobservice:v1.9.4 "/harbor/harbor_jobs…" 5 days ago Up 4 days (healthy) harbor-jobservice
- bcf82d24539a goharbor/harbor-core:v1.9.4 "/harbor/harbor_core" 5 days ago Up 4 days (healthy) harbor-core
- 06d5fffe7f3a goharbor/harbor-db:v1.9.4 "/docker-entrypoint.…" 5 days ago Up 4 days (healthy) 5432/tcp harbor-db
- e976d7cff566 goharbor/harbor-registryctl:v1.9.4 "/harbor/start.sh" 5 days ago Up 4 days (healthy) registryctl
- 667d6e93ba8d goharbor/registry-photon:v2.7.1-patch-2819-2553-v1.9.4 "/entrypoint.sh /etc…" 5 days ago Up 4 days (healthy) 5000/tcp registry
- 9ae54d9ce227 goharbor/redis-photon:v1.9.4 "redis-server /etc/r…" 5 days ago Up 4 days (healthy) 6379/tcp redis
- ba1edf954ecd goharbor/harbor-portal:v1.9.4 "nginx -g 'daemon of…" 5 days ago Up 4 days (healthy) 8080/tcp harbor-portal
- dce6228055c2 goharbor/harbor-log:v1.9.4 "/bin/sh -c /usr/loc…" 5 days ago Up 4 days (healthy) 127.0.0.1:1514->10514/tcp harbor-log
浏览器访问: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 镜像存储到其他的磁盘路径,可以修改这个参数。
- ##以下命令均在在habor的配置目录下运行
- $ docker-compose up -d #启动
- $ docker-compose stop #停止
- $ docker-compose restart #重新启动
1)停服;
- $ cd /usr/local/harbor
- $ docker-compose down -v
2)修改配置;
$ vim harbor.cfg
3)配置加载
$ ./prepare
4)启动;
$ docker-compose up -d
-
- 使用 docker-compose 管理 Harbor 时,必须在与 docker-compose.yml 相同的目录中运行。
- cd /usr/local/harbor
- docker-compose down -v
-
- vim harbor.cfg #只能修改可选参数
-
- ./prepare
-
- docker-compose up -d
- //如果有以下报错,需要开启防火墙 firewalld 服务解决
- Creating network "harbor_harbor" with the default driver
- ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait -t nat -I DOCKER -i br-b53c314f45e8 -j RETURN: iptables: No chain/target/match by that name.
- (exit status 1))
-
- systemctl restart firewalld.service
- docker-compose up -d
访问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
日志会记录各个用户的操作。可用于harbor的操作审计。
将sre1用户设置为harbor仓库的管理员。
提交即可。
角色 | 权限说明 |
访客 | 对于指定项目拥有只读权限 |
开发人员 | 对于指定项目拥有读写权限,但没用删除权限 |
维护人员 | 对于指定项目拥有读写权限,也能对修改其它配置,比如创建 Webhooks |
项目管理员 | 除了读写权限,同时拥有用户管理/镜像扫描等管理权限 |
- $ docker login 10.12.5.60
- Username: sre1
- Password:
- Login Succeeded
- $ docker tag goharbor/harbor-db:v1.9.4 10.12.5.60/sre/harbor-db:v1.9.4
- $ docker push 10.12.5.60/sre/harbor-db:v1.9.4
- The push refers to repository [10.12.5.60/sre/harbor-db]
- 69fab71b0bc5: Pushed
- 9dd11aa8e16a: Pushed
- ea3d1b630734: Pushed
- aa04ed1247cb: Pushed
- c91b8f37358e: Pushed
- 013a04104e87: Pushed
- 7108c9c351ce: Pushed
- b94d1cd23704: Pushed
- 62b223a46a15: Pushed
- v1.9.4: digest: sha256:e6056d0effd4dab7bd54d525e65127c84d07305934afbb769a077172dd7d33eb size: 2197
- $ docker pull 10.12.5.60/sre/nginx:v1
- v1: Pulling from sre/nginx
- Digest: sha256:d2e65182b5fd330470eca9b8e23e8a1a0d87cc9b820eb1fb3f034bf8248d37ee
- Status: Image is up to date for 10.12.5.60/sre/nginx:v1
源节点 | 目标节点 |
10.12.5.60 | 10.12.5.62 |
详细部署过程与源节点一致,部署完成后,访问目标节点web ui。
目标节点没有镜像。
- $ cat docker-compose.yml
- version: '2.3'
- services:
- .......
- registry:
- image: goharbor/registry-photon:v2.7.1-patch-2819-2553-v1.9.4
- container_name: registry
- restart: always
- cap_drop:
- - ALL
- cap_add:
- - CHOWN
- - SETGID
- - SETUID
- volumes:
- - /data/registry:/storage:z #镜像存储位置
- - ./common/config/registry/:/etc/registry/:z
- - type: bind
- source: /data/secret/registry/root.crt
- target: /etc/registry/root.crt
- networks:
- - harbor
- dns_search: .
- depends_on:
- - log
- logging:
- driver: "syslog"
- options:
- syslog-address: "tcp://127.0.0.1:1514"
- tag: "registry"
- ......
- postgresql:
- image: goharbor/harbor-db:v1.9.4
- container_name: harbor-db
- restart: always
- cap_drop:
- - ALL
- cap_add:
- - CHOWN
- - DAC_OVERRIDE
- - SETGID
- - SETUID
- volumes:
- - /data/database:/var/lib/postgresql/data:z #数据存储位置
- networks:
- harbor:
- dns_search: .
- env_file:
- - ./common/config/db/env
- depends_on:
- - log
- logging:
- driver: "syslog"
- options:
- syslog-address: "tcp://127.0.0.1:1514"
- tag: "postgresql"
- ......
- $ cd /data/registry/
- $ tar -cf new.tar.gz ./*
- $ cd /data/database/
- $ tar -cf new1.tar.gz ./*
- $ cd /data/registry/
- $ scp new.tar.gz 10.12.5.62:/data/registry/
- $ cd /data/database/
- $ scp new1.tar.gz 10.12.5.62:/data/database/
- $ cd /data/registry/
- $ tar -xvf new.tar.gz
- $ cd /data/database/
- $ tar -xvf new1.tar.gz
登录目标harbor web ui,刷新镜像仓库。
目标harbor上已存在镜像和数据。
客户端登录目标harbor。
- $ docker login -u admin -p Harbor12345 http://10.12.5.62
- WARNING! Using --password via the CLI is insecure. Use --password-stdin.
- Login Succeeded
- $ docker pull 10.12.5.62/sre/nginx:v1
- v1: Pulling from sre/nginx
- 578acb154839: Pull complete
- e398db710407: Pull complete
- 85c41ebe6d66: Pull complete
- 7170a263b582: Pull complete
- 8f28d06e2e2e: Pull complete
- 6f837de2f887: Pull complete
- c1dfc7e1671e: Pull complete
- Digest: sha256:d2e65182b5fd330470eca9b8e23e8a1a0d87cc9b820eb1fb3f034bf8248d37ee
- Status: Downloaded newer image for 10.12.5.62/sre/nginx:v1
- $ docker tag 10.12.5.62/sre/nginx:v1 10.12.5.62/sre/nginx:v2
- $ docker push 10.12.5.62/sre/nginx:v2
- The push refers to repository [10.12.5.62/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
- $ docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- 10.12.5.62/sre/nginx v1 c20060033e06 13 days ago 187MB
- 10.12.5.62/sre/nginx v2 c20060033e06 13 days ago 187MB
- goharbor/redis-photon v1.9.4 48c941077683 3 years ago 113MB
- goharbor/harbor-registryctl v1.9.4 7259026fb1bb 3 years ago 103MB
- goharbor/registry-photon v2.7.1-patch-2819-2553-v1.9.4 cf6269830837 3 years ago 85.7MB
- goharbor/nginx-photon v1.9.4 364c17f09df9 3 years ago 44MB
- goharbor/harbor-log v1.9.4 e0188c234aa2 3 years ago 82.3MB
- goharbor/harbor-jobservice v1.9.4 207acbcff6f5 3 years ago 141MB
- goharbor/harbor-core v1.9.4 a805deab5833 3 years ago 156MB
- goharbor/harbor-portal v1.9.4 cfd272546394 3 years ago 51.4MB
- goharbor/harbor-db v1.9.4 265c8c83954e 3 years ago 150MB
- goharbor/prepare v1.9.4 b2cded69458d 3 years ago 151MB
harbor同步功能主要应用于存储备份,以预防镜像存储异常时,可快速恢复。
节点1 | 节点2 |
10.12.5.60 | 10.12.5.62 |
如果远程仓库开启了登录认证功能,那么就需要配置账号密码。
状态检测Healthy。
策略是2分钟同步一次。
同步历史:
- $ docker tag goharbor/redis-photon:v1.9.4 10.12.5.62/sre/redis:v1
- $ docker push 10.12.5.62/sre/redis:v1
- The push refers to repository [10.12.5.62/sre/redis]
- 27609e3dd221: Pushed
- 694b3e7869d5: Pushed
- 5e76c79bec2e: Pushed
- 12f86854bc80: Pushed
- 62b223a46a15: Pushed
- v1: digest: sha256:0e4ef534b5ee2026237e75992a2f73a6169c11c1362333ee50f8e3e885e07104 size: 1366
源端仓库:
目标仓库:
参考文档:如何通过开源项目搭建私有云平台--第三步补充,harbor升级-CSDN博客
参考文档:Harbor高可用集群设计及部署(基于离线安装方式)_harbor高可用部署_太阳神LoveU的博客-CSDN博客
- $ docker-compose up -d
- //如果有以下报错,需要开启防火墙 firewalld 服务解决
- Creating network "harbor_harbor" with the default driver
- ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait -t nat -I DOCKER -i br-b53c314f45e8 -j RETURN: iptables: No chain/target/match by that name.
- (exit status 1))
- $ systemctl restart firewalld.service
- $ docker-compose up -d
k8s pull镜像提示:
unauthorized: unauthorized to access repository
1)创建secret
kubectl create secret docker-registry harbor-login-registry --docker-username=admin --docker-password=Harbor12345 --docker-server=10.12.5.60:80
2)k8s yaml增加配置
- imagePullSecrets: # 使用密码登录
- - name: harbor-login-registry
docker login 10.12.5.60出现以下报错:
Error response from daemon: Get https://: http: server gave HTTP response to HTTPS client
编辑daemon.json文件,添加如下内容(连接harbor拉取镜像的docker服务器都需要配置)
- $ vi /etc/docker/daemon.json
- {
- "insecure-registries": ["10.12.5.60"]
- }
重新加载、启动docker
- $ systemctl daemon-reload
- $ systemctl restart docker