Docker系列08—搭建使用私有docker registry
本文收录在容器技术学习系列文章总目录
1、了解Docker Registry
1.1 介绍
- registry 用于保存docker 镜像,包括镜像的层次结构和元数据。
- 启动容器时,docker daemon会试图从本地获取相关的镜像;本地镜像不存在时,其将从registry中下载该镜像并保存到本地;
- 拉取镜像时,如果不知道registry仓库地址,默认从Docker Hub搜索拉取镜像
1.2 分类
- Sponsor Registry:第三方的registry,供客户和docker社区使用;
- mirror Registry:第三方的registry,只让客户使用;如docker cn和阿里云的镜像加速器;
- vendor Registry:服务商的registry,由发布docker镜像的供应商提供的registry;如红帽提供的专有的,收费提供;
- private Registry:通过设有防火墙和额外的安全层的私有实体提供的registry;自建的registry,在本地搭建registry,节省带宽
1.3 registry组成(repository和index)
(1)Repository
- 由特定的docker镜像的所有迭代版本组成的镜像仓库;
- 一个registry中可以存在多个repository:
- repository可分为“顶层仓库”和“用户仓库”
- 用户仓库名称格式为“用户名/仓库名”
- 每个仓库可以包含多个Tag(标签),每个标签对应一个镜像
(2)Index
- 维护用户账户、镜像的校验以及公共命名空间的信息
- 相当于为registry提供了一个完成用户认证等功能的检索接口
1.4 拉取上传仓库镜像
(1)拉取镜像
- docker pull <registry>[:<port>]/[<namespace>/]<name>:<tag>
- registry:仓库服务器地址:不指定默认是docker hub
- port:端口;默认是443,因为是https协议
- namespace:名称空间,指是哪个用户的仓库,如果是顶层仓库,可省
- name:仓库名
- tag:标签名;默认是latest版本
(2)上传镜像
- docker push [OPTIONS] NAME[:TAG]
1.5 知名docker仓库
例:docker pull quay.io/coreos/flannel:v0.10.0-amd64
博主前面的文章已经详细介绍过,从第三方的registry 上传拉取镜像了;这篇就是详细讲解如果搭建私有registry ,并在私有registry上传拉取镜像了。
2、搭建私有仓库 distribution
2.1 distribution 介绍
docker提供的开源Registry,但是很简单,只能作为存储镜像的仓库,没有额外的功能;如管理页面等
2.2 安装启动 distribution
两种方案安装,我采用的是方案2
2.2.1 方案1:使用yum安装(直接从extras 源中下载安装)
- [root@docker2 ~]# yum info docker-distribution
- 已加载插件:fastestmirror
- Loading mirror speeds from cached hostfile
- 可安装的软件包
- 名称 :docker-distribution
- 架构 :x86_64
- 版本 :2.6.2
- 发布 :2.git48294d9.el7
- 大小 :3.5 M
- 源 :extras/7/x86_64
- 简介 : Docker toolset to pack, ship, store, and deliver content
- 网址 :https://github.com/docker/distribution
- 协议 : ASL 2.0
- 描述 : Docker toolset to pack, ship, store, and deliver content
- [root@docker2 ~]# yum -y install docker-distribution
2.2.2 方案2:拉取镜像,作为容器安装
(1)拉取镜像
- [root@docker2 ~]# docker pull registry:2.6.2
- 2.6.2: Pulling from library/registry
- d6a5679aa3cf: Pull complete
- ad0eac849f8f: Pull complete
- 2261ba058a15: Pull complete
- f296fda86f10: Pull complete
- bcd4a541795b: Pull complete
- Digest: sha256:5a156ff125e5a12ac7fdec2b90b7e2ae5120fa249cf62248337b6d04abc574c8
- Status: Downloaded newer image for registry:2.6.2
(2)启动registry 容器
- [root@docker2 ~]# docker run --name registry -p 5000:5000 -v /data/registry:/var/lib/registry -d registry:2.6.2
- a43f802e737eba89879a4dc02562b38e0042db981f9bdb91782b453f0bac4119
- [root@docker2 ~]# docker port registry
- 5000/tcp -> 0.0.0.0:5000
- [root@docker2 ~]# ss -nutlp |grep 5000
- tcp LISTEN 0 128 :::5000 :::* users:(("docker-proxy",pid=4901,fd=4))
- [root@docker2 ~]# docker inspect -f {{."Mounts"}} registry
- [{bind /data/registry /var/lib/registry true rprivate}]
注:
- -p 5000:5000:将容器中的5000端口,暴露在宿主机的5000端口
- -v /data/registry:/var/lib/registry:指定宿主机存储的位置为 /data/registry
- -d:后台运行容器
2.3 从私有仓库上传下载镜像
2.3.1 将本地的镜像上传到私有仓库
(1)先将本地仓库打上合适的标签
- [root@docker1 ~]# docker tag busybox:latest 192.168.10.102:5000/busybox:v0.1
- [root@docker1 ~]# docker image ls
- REPOSITORY TAG IMAGE ID CREATED SIZE
- 192.168.10.102:5000/busybox v0.1 758ec7f3a1ee 13 days ago 1.15 MB
- busybox latest 758ec7f3a1ee 13 days ago 1.15 MB
(2)尝试删除镜像
- [root@docker1 ~]# docker push 192.168.10.102:5000/busybox:v0.1
- The push refers to a repository [192.168.10.102:5000/busybox]
- Get https://192.168.10.102:5000/v1/_ping: http: server gave HTTP response to HTTPS client
上传镜像失败;原因:docker 上传下载默认只支持https协议,搭建的私有仓库是http协议。
(3)修改重启docker服务
- [root@docker1 ~]# vim /etc/docker/daemon.json
- {
- "registry-mirrors": ["https://registry.docker-cn.com"],
- "insecure-registries": ["192.168.10.102:5000"]
- }
- [root@docker1 ~]# systemctl restart docker
注:就是将私有仓库认证为安全仓库:"insecure-registries": [""]
(4)再次上传镜像,成功
- [root@docker1 ~]# docker push 192.168.10.102:5000/busybox:v0.1
- The push refers to a repository [192.168.10.102:5000/busybox]
- 23bc2b70b201: Pushed
- v0.1: digest: sha256:cbcde3595079b1f7a6b046e96e7547fe786d5c2c8eba678bc260161bc01b8dbe size: 527
(5)在私有仓库的服务器上验证
- [root@docker2 ~]# ls /data/registry/docker/registry/v2/
- blobs repositories
(6)从私有仓库拉取镜像,先删除再拉取
- [root@docker1 ~]# docker rmi 192.168.10.102:5000/busybox:v0.1
- Untagged: 192.168.10.102:5000/busybox:v0.1
- Untagged: 192.168.10.102:5000/busybox@sha256:cbcde3595079b1f7a6b046e96e7547fe786d5c2c8eba678bc260161bc01b8dbe
- [root@docker1 ~]# docker image ls
- REPOSITORY TAG IMAGE ID CREATED SIZE
- busybox latest 758ec7f3a1ee 2 weeks ago 1.15 MB
- [root@docker1 ~]# docker pull 192.168.10.102:5000/busybox:v0.1
- v0.1: Pulling from busybox
- Digest: sha256:cbcde3595079b1f7a6b046e96e7547fe786d5c2c8eba678bc260161bc01b8dbe
- Status: Downloaded newer image for 192.168.10.102:5000/busybox:v0.1
- [root@docker1 ~]# docker image ls
- REPOSITORY TAG IMAGE ID CREATED SIZE
- 192.168.10.102:5000/busybox v0.1 758ec7f3a1ee 2 weeks ago 1.15 MB
3、安装搭建私有仓库 Harbor
3.1 认识 Harbor
3.1.1 Harbor 介绍
- Harbor gitlab项目地址:https://github.com/goharbor/harbor
- Harbor是一个开源的可信云本机注册表项目,用于存储,签名和扫描内容。Harbor通过添加用户通常需要的功能(如安全性,身份和管理)来扩展开源Docker Distribution。使注册表更接近构建和运行环境可以提高图像传输效率。Harbor支持在注册表之间复制映像,还提供高级安全功能,如用户管理,访问控制和活动审计。
- Harbour由Cloud Native Computing Foundation(CNCF)托管。如果您是一个希望帮助塑造云原生技术发展的组织,请考虑加入CNCF。有关谁参与以及Harbour如何扮演角色的详细信息,请阅读CNCF 公告。
3.1.2 Harbor 特征
- 云本机注册表:Harbour 支持容器映像和Helm图表,可用作云本机环境(如容器运行时和业务流程平台)的注册表。
- 基于角色的访问控制:用户和存储库通过“项目”进行组织,用户可以对项目下的图像拥有不同的权限。
- 基于策略的映像复制:可以基于具有多个过滤器(存储库,标记和标签)的策略在多个注册表实例之间复制(同步)映像。如果遇到任何错误,Harbor将自动重试进行复制。非常适合负载平衡,高可用性,多数据中心,混合和多云场景。
- 漏洞扫描:Harbor定期扫描图像并警告用户漏洞。
- LDAP / AD支持:Harbor与现有企业LDAP / AD集成以进行用户身份验证和管理,并支持将LDAP组导入Harbor并为其分配适当的项目角色。
- 图像删除和垃圾收集:可以删除图像,并可以回收它们的空间。
- 公证:可以确保图像的真实性。
- 图形用户门户:用户可以轻松浏览,搜索存储库和管理项目。
- 审计:跟踪存储库的所有操作。
- RESTful API:适用于大多数管理操作的RESTful API,易于与外部系统集成。
- 易于部署:提供在线和离线安装程序。
3.1.3 harbor 配置参数
(1)参数介绍
① 配置参数位于文件harbor.cfg中。
② 在harbor.cfg中有两类参数,必需参数和可选参数。
- required参数:需要在配置文件中设置这些参数。如果用户更新它们harbor.cfg并运行install.sh脚本以重新安装Harbor,它们将生效。
- 可选参数:这些参数对于更新是可选的,即用户可以将它们保留为默认值,并在启动Harbour后在Web Portal上更新它们。如果它们已经启用harbor.cfg,它们只会在首次启动Harbour时生效。harbor.cfg将忽略对这些参数的后续更新。
③ 注意:如果您选择通过Portal设置这些参数,请务必在Harbour启动后立即执行此操作。特别是,您必须在Harbour中注册或创建任何新用户之前设置所需的auth_mode。当系统中有用户时(除默认管理员用户外), 无法更改auth_mode。
④ 请注意,至少需要更改hostname属性。
(2)必需参数
- hostname:目标主机的主机名,用于访问Portal和注册表服务。它应该是目标计算机的IP地址或完全限定的域名(FQDN),例如,192.168.1.10或reg.yourdomain.com。不要使用localhost或127.0.0.1作为主机名 - 外部客户端需要访问注册表服务!
- ui_url_protocol :( http或https。默认为http)用于访问Portal和令牌/通知服务的协议。如果启用了公证,则此参数必须为https。默认情况下,这是http。要设置https协议,请参阅使用HTTPS访问配置Harbor。
- db_password:用于db_auth的PostgreSQL数据库的root密码。更改此密码以用于任何生产用途!
- max_job_workers :(默认值为10)作业服务中的最大复制工作者数。对于每个映像复制作业,工作程序将存储库的所有标记同步到远程目标。增加此数量可以在系统中实现更多并发复制作业。但是,由于每个工作者都消耗一定量的网络/ CPU / IO资源,请根据主机的硬件资源仔细选择该属性的值。
- customize_crt:(on or off. Default is on),如果此属性on,在准备脚本创建注册表的令牌生成/验证私钥和根证书。当外部源提供密钥和根证书时,将此属性设置为off。有关详细信息,请参阅自定义密钥和港口令牌服务证书。
- ssl_cert:SSL证书的路径,仅在协议设置为https时应用。
- ssl_cert_key:SSL密钥的路径,仅在协议设置为https时应用。
- secretkey_path:用于加密或解密复制策略中远程注册表密码的密钥路径。
- log_rotate_count:日志文件在被删除之前会被轮换log_rotate_count次。如果count为0,则删除旧版本而不是旋转。
- log_rotate_size:仅当日志文件大于log_rotate_size字节时才会轮换日志文件。如果大小后跟k,则假定大小以千字节为单位。如果使用M,则大小以兆字节为单位,如果使用G,则大小为千兆字节。尺寸100,尺寸100k,尺寸100M和尺寸100G都是有效的。
- http_proxy:为Clair配置http代理,例如http://my.proxy.com:3128。
- https_proxy:为Clair配置https代理,例如http://my.proxy.com:3128。
- no_proxy:为Clair配置无代理,例如127.0.0.1,localhost,core,registry。
(3)可选参数
- 电子邮件设置:Harbor需要这些参数才能向用户发送“密码重置”电子邮件,并且仅在需要该功能时才需要。另外,请注意,在默认情况下SSL连接时没有启用-如果你的SMTP服务器需要SSL,但不支持STARTTLS,那么你应该通过设置启用SSL email_ssl = TRUE。如果电子邮件服务器使用自签名证书或不受信任证书,则设置email_insecure = true
- email_server = smtp.mydomain.com
- email_server_port = 25
- email_identity =
- email_username = sample_admin@mydomain.com
- email_password = abc
- email_from = admin sample_admin@mydomain.com
- email_ssl = false
- email_insecure = false
- harbor_admin_password:管理员的初始密码。此密码仅在Harbor首次启动时生效。之后,将忽略此设置,并且应在Portal中设置管理员密码。请注意,默认用户名/密码为admin / Harbor12345
- auth_mode:使用的身份验证类型。默认情况下,它是db_auth,即凭据存储在数据库中。对于LDAP身份验证,请将其设置为ldap_auth。重要信息:从现有Harbor实例升级时,必须确保在启动新版本的Harbor之前auth_mode相同harbor.cfg。否则,用户可能无法在升级后登录。
- ldap_url:LDAP端点URL(例如ldaps://ldap.mydomain.com)。 仅在auth_mode设置为ldap_auth时使用。
- ldap_searchdn:具有搜索LDAP / AD服务器权限的用户的DN(例如uid=admin,ou=people,dc=mydomain,dc=com)。
- ldap_search_pwd:ldap_searchdn指定的用户密码。
- ldap_basedn:查找用户的基本DN,例如ou=people,dc=mydomain,dc=com。 仅在auth_mode设置为ldap_auth时使用。
- ldap_filter:用于查找用户的搜索过滤器,例如(objectClass=person)。
- ldap_uid:用于在LDAP搜索期间匹配用户的属性,它可以是uid,cn,email或其他属性。
- ldap_scope:搜索用户的范围,0-LDAP_SCOPE_BASE,1-LDAP_SCOPE_ONELEVEL,2-LDAP_SCOPE_SUBTREE。默认值为2。
- ldap_timeout:连接LDAP服务器时超时(以秒为单位)。默认值为5。
- ldap_verify_cert:验证来自LDAP服务器的证书。默认为true。
- ldap_group_basedn:在LDAP / AD中查找组的基本dn,例如ou=group,dc=mydomain,dc=com。
- ldap_group_filter:搜索LDAP / AD组的过滤器,例如objectclass=group。
- ldap_group_gid:用于命名LDAP / AD组的属性,它可以是cn,name。
- ldap_group_scope:搜索ldap组的范围。0-LDAP_SCOPE_BASE,1-LDAP_SCOPE_ONELEVEL,2-LDAP_SCOPE_SUBTREE。默认值为2。
- self_registration :( 打开或关闭。默认打开)启用/禁用用户注册他/她自己的能力。禁用时,新用户只能由管理员用户创建,只有管理员用户可以在Harbor中创建新用户。 注意:当auth_mode设置为ldap_auth时,始终禁用自注册功能,并忽略此标志。
- token_expiration:令牌服务创建的令牌的到期时间(以分钟为单位),默认为30分钟。
- project_creation_restriction:用于控制用户有权创建项目的标志。默认情况下,每个人都可以创建一个项目,设置为“adminonly”,这样只有管理员才能创建项目。
(4)配置存储后端(可选)
默认情况下,Harbor将图像存储在本地文件系统中。在生产环境中,您可以考虑使用其他存储后端而不是本地文件系统,如S3,OpenStack Swift,Ceph等。这些参数是注册表的配置。
- registry_storage_provider_name:注册表的存储提供程序名称,可以是filesystem,s3,gcs,azure等。默认为filesystem。
- registry_storage_provider_config:存储提供程序配置的逗号分隔“key:value”对,例如“key1:value,key2:value2”。默认为空字符串。
- registry_custom_ca_bundle:自定义根ca证书的路径,它将注入到注册表和图表存储库容器的信任库中。当用户使用自签名证书托管内部存储时,通常需要这样做。
例如,如果使用Openstack Swift作为存储后端,则参数可能如下所示:
- registry_storage_provider_name = swift
- registry_storage_provider_config = “ username:admin,password:ADMIN_PASS,authurl:http:// keystone_addr:35357 / v3 / aut
注意:有关注册表存储后端的详细信息,请参阅“ 注册表配置参考”。
3.2 安装主机的先决条件
3.2.1 硬件
资源 | 容量 | 描述 |
---|---|---|
CPU | 最小2 CPU | 4 CPU是首选 |
内存 | 最小4GB | 8GB是首选 |
磁盘 | 最小40GB | 160GB是首选 |
3.2.2 软件
软件 | 版 | 描述 |
---|---|---|
Python | 2.7或更高版本 | 请注意,您可能必须在Linux发行版(Gentoo,Arch)上安装Python,默认情况下不安装Python解释器 |
Docker engine | 版本1.10或更高版本 | 有关安装说明,请参阅:https://docs.docker.com/engine/installation/ |
Docker Compose | 版本1.6.0或更高版本 | 有关安装说明,请参阅:https://docs.docker.com/compose/install/ |
Openssl | 最新的是首选 | 为Harbor生成证书和密钥 |
3.2.3 网络端口
端口 | 协议 | 描述 |
---|---|---|
443 | HTTPS | Harbor门户和核心API将接受此端口上的https协议请求 |
4443 | HTTPS | 只有在启用“公证”时才需要连接到Dock的Docker Content Trust服务 |
80 | HTTP | Harbor端口和核心API将接受此端口上的http协议请求 |
3.2.4 添加一块50G 新硬盘(如果磁盘足够,可忽略)
博主也是太长时间没有进行硬盘添加的操作了,熟悉一遍
(1)查询添加的磁盘的名字
- $ fdisk -l
- Disk /dev/sdb: 53.7 GB, 53687091200 bytes, 104857600 sectors
- Units = sectors of 1 * 512 = 512 bytes
- Sector size (logical/physical): 512 bytes / 512 bytes
- I/O size (minimum/optimal): 512 bytes / 512 bytes
(2)对磁盘进行分区
- $ fdisk /dev/sdb
- Command (m for help): m
- Command (m for help): n
- Partition type:
- p primary (0 primary, 0 extended, 4 free)
- e extended
- Using default response p
- Partition number (1-4, default 1):
- First sector (2048-104857599, default 2048):
- Using default value 2048
- Last sector, +sectors or +size{K,M,G} (2048-104857599, default 104857599):
- Using default value 104857599
- Partition 1 of type Linux and of size 50 GiB is set
- Command (m for help): w
- The partition table has been altered!
- Calling ioctl() to re-read partition table.
- Syncing disks.
(3)磁盘文件格式化
- $ [root@centos7-1 ~]# mkfs.ext3 /dev/sdb1
(4)挂载磁盘
- $ vim /etc/fstab 设为开机自动挂载
- /dev/sdb1 /data ext3 defaults 0 0
- $ mount -a 挂载磁盘
(5)验证
- [root@centos7-1 ~]# df -h /data
- Filesystem Size Used Avail Use% Mounted on
- /dev/sdb1 50G 52M 47G 1% /data
3.2.5 安装docker编排工具 Docker Compose
方案1:直接yum安装
- [root@docker2 ~]# yum -y install docker-compose
方案2:在GitHub上选择自己需要的版本下载安装https://github.com/docker/compose/releases
- $ curl -L https://github.com/docker/compose/releases/download/1.23.2/docker-compose-Linux-x86_64 -o /usr/local/bin/docker-compose
- $ chmod +x /usr/local/bin/docker-compose
- $ docker-compose version
- docker-compose version 1.23.2, build 1110ad01
- docker-py version: 3.6.0
- CPython version: 3.6.7
- OpenSSL version: OpenSSL 1.1.0f 25 May 2017
3.4 安装搭建Harbor
3.4.1 下载Harbor 安装包
资源可以下载的很慢,我已经将1.7.1版本放入我的网盘了,需要的私聊
- [root@docker2 ~]# wget https://storage.googleapis.com/harbor-releases/release-1.7.0/harbor-offline-installer-v1.7.1.tgz
- [root@docker2 ~]# tar -C /data/ -xvf harbor-offline-installer-v1.7.1.tgz
3.4.2 配置Harbor 服务
(1)修改harbor.cfg 配置文件
- [root@docker2 ~]# cd /data/harbor/
- [root@docker2 harbor]# grep "^[^#]" harbor.cfg
- _version = 1.7.0
- hostname = docker2
- ui_url_protocol = http
- max_job_workers = 2
- customize_crt = on
- ssl_cert = /data/cert/server.crt
- ssl_cert_key = /data/cert/server.key
- secretkey_path = /data
- admiral_url = NA
- log_rotate_count = 50
- log_rotate_size = 200M
- http_proxy =
- https_proxy =
- no_proxy = 127.0.0.1,localhost,core,registry
- email_identity =
- email_server = smtp.mydomain.com
- email_server_port = 25
- email_username = sample_admin@mydomain.com
- email_password = abc
- email_from = admin <sample_admin@mydomain.com>
- email_ssl = false
- email_insecure = false
- harbor_admin_password = Harbor12345
- auth_mode = db_auth
- ldap_url = ldaps://ldap.mydomain.com
- ldap_basedn = ou=people,dc=mydomain,dc=com
- ldap_uid = uid
- ldap_scope = 2
- ldap_timeout = 5
- ldap_verify_cert = true
- ldap_group_basedn = ou=group,dc=mydomain,dc=com
- ldap_group_filter = objectclass=group
- ldap_group_gid = cn
- ldap_group_scope = 2
- self_registration = on
- token_expiration = 30
- project_creation_restriction = everyone
- db_host = postgresql
- db_password = along
- db_port = 5432
- db_user = postgres
- redis_host = redis
- redis_port = 6379
- redis_password = along
- redis_db_index = 1,2,3
- clair_db_host = postgresql
- clair_db_password = along
- clair_db_port = 5432
- clair_db_username = postgres
- clair_db = postgres
- clair_updaters_interval = 12
- uaa_endpoint = uaa.mydomain.org
- uaa_clientid = id
- uaa_clientsecret = secret
- uaa_verify_cert = true
- uaa_ca_cert = /path/to/ca.pem
- registry_storage_provider_name = filesystem
- registry_storage_provider_config =
- registry_custom_ca_bundle =
主要修改了:
hostname:主机名
max_job_workers:最大cpu数,小于等于自己服务器的硬件
(2)定义docker-compose.yml 文件(可省略)
docker-compose.yml 文件是docker 编排时,对容器的一些操作:
① 端口
ports:
- 80:80
- 443:443
- 4443:4443
② 众多存储器路径
如:volumes:
- /data/registry:/storage:z
在生产环境中,尽量将容器的存储卷定义在空间较为充足的磁盘;
自己根据实际情况进行修改;
3.4.3 安装启动harbor
- [root@docker2 harbor]# ./install.sh
- [Step 0]: checking installation environment ...
- Note: docker version: 18.03.1
- Note: docker-compose version: 1.23.2
- [Step 1]: loading Harbor images ...
- Loaded image: goharbor/registry-photon:v2.6.2-v1.7.1
- Loaded image: goharbor/harbor-migrator:v1.7.1
- Loaded image: goharbor/harbor-adminserver:v1.7.1
- Loaded image: goharbor/harbor-core:v1.7.1
- Loaded image: goharbor/harbor-log:v1.7.1
- Loaded image: goharbor/harbor-jobservice:v1.7.1
- Loaded image: goharbor/notary-server-photon:v0.6.1-v1.7.1
- Loaded image: goharbor/clair-photon:v2.0.7-v1.7.1
- Loaded image: goharbor/harbor-portal:v1.7.1
- Loaded image: goharbor/harbor-db:v1.7.1
- Loaded image: goharbor/redis-photon:v1.7.1
- Loaded image: goharbor/nginx-photon:v1.7.1
- Loaded image: goharbor/harbor-registryctl:v1.7.1
- Loaded image: goharbor/notary-signer-photon:v0.6.1-v1.7.1
- Loaded image: goharbor/chartmuseum-photon:v0.7.1-v1.7.1
- [Step 2]: preparing environment ...
- Generated and saved secret to file: /data/secretkey
- Generated configuration file: ./common/config/nginx/nginx.conf
- Generated configuration file: ./common/config/adminserver/env
- Generated configuration file: ./common/config/core/env
- Generated configuration file: ./common/config/registry/config.yml
- Generated configuration file: ./common/config/db/env
- Generated configuration file: ./common/config/jobservice/env
- Generated configuration file: ./common/config/jobservice/config.yml
- Generated configuration file: ./common/config/log/logrotate.conf
- Generated configuration file: ./common/config/registryctl/env
- Generated configuration file: ./common/config/core/app.conf
- Generated certificate, key file: ./common/config/core/private_key.pem, cert file: ./common/config/registry/root.crt
- The configuration files are ready, please use docker-compose to start the service.
- [Step 3]: checking existing instance of Harbor ...
- [Step 4]: starting Harbor ...
- Creating network "harbor_harbor" with the default driver
- Creating harbor-log ... done
- Creating registry ... done
- Creating harbor-db ... done
- Creating registryctl ... done
- Creating harbor-adminserver ... done
- Creating redis ... done
- Creating harbor-core ... done
- Creating harbor-portal ... done
- Creating harbor-jobservice ... done
- Creating nginx ... done
- ✔ ----Harbor has been installed and started successfully.----
- Now you should be able to visit the admin portal at http://docker2.
- For more details, please visit https://github.com/goharbor/harbor .
3.4.3 安装后验证
(1)打开了一些端口
- [root@docker2 harbor]# ss -nutlp |grep docker
- tcp LISTEN 0 128 127.0.0.1:1514 *:* users:(("docker-proxy",pid=1440,fd=4))
- tcp LISTEN 0 128 :::80 :::* users:(("docker-proxy",pid=2204,fd=4))
- tcp LISTEN 0 128 :::443 :::* users:(("docker-proxy",pid=2192,fd=4))
- tcp LISTEN 0 128 :::4443 :::* users:(("docker-proxy",pid=2181,fd=4))
(2)harbor实际就是启动了一些docker服务
- [root@docker2 ~]# docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- def22a8eeb9a goharbor/nginx-photon:v1.7.1 "nginx -g 'daemon of…" 2 hours ago Up 2 hours (healthy) 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp nginx
- a410a38479fa goharbor/harbor-portal:v1.7.1 "nginx -g 'daemon of…" 2 hours ago Up 2 hours (healthy) 80/tcp harbor-portal
- e25f87eb80db goharbor/harbor-jobservice:v1.7.1 "/harbor/start.sh" 2 hours ago Up 2 hours harbor-jobservice
- 2be7211535a2 goharbor/harbor-core:v1.7.1 "/harbor/start.sh" 2 hours ago Up 2 hours (healthy) harbor-core
- 26681dde1dec goharbor/harbor-db:v1.7.1 "/entrypoint.sh post…" 2 hours ago Up 2 hours (healthy) 5432/tcp harbor-db
- 80f592176896 goharbor/harbor-registryctl:v1.7.1 "/harbor/start.sh" 2 hours ago Up 2 hours (healthy) registryctl
- def7f9892e46 goharbor/redis-photon:v1.7.1 "docker-entrypoint.s…" 2 hours ago Up 2 hours 6379/tcp redis
- 9af874368813 goharbor/registry-photon:v2.6.2-v1.7.1 "/entrypoint.sh /etc…" 2 hours ago Up 2 hours (healthy) 5000/tcp registry
- 0f7156ac62f7 goharbor/harbor-adminserver:v1.7.1 "/harbor/start.sh" 2 hours ago Up 2 hours (healthy) harbor-adminserver
- 3e45524ef1f0 goharbor/harbor-log:v1.7.1 "/bin/sh -c /usr/loc…" 2 hours ago Up 2 hours (healthy) 127.0.0.1:1514->10514/tcp harbor-log
4、使用 Harbor
4.1 Harbor 页面基础操作
(1)网页登录http://192.168.130.102
(2)登录harbor 后一些简单的操作
(3)用户管理
注:密码要有一定的复杂度
(4)邮件配置
(5)新建一个项目
4.2 上传下载镜像到 Harbor 仓库
(1)修改docker配置,添加harbor仓库为新人地址
- [root@docker1 ~]# cat /etc/docker/daemon.json
- {
- "registry-mirrors": ["https://registry.docker-cn.com"],
- "insecure-registries": ["192.168.10.102:5000"],
- "insecure-registries": ["docker2:80"]
- }
- [root@docker1 ~]# systemctl restart docker
(2)把要上传的镜像打上合适的标签
- [root@docker1 ~]# docker tag busybox:latest docker2:80/demo/busybox:v0.1
- [root@docker1 ~]# docker tag nginx:1.14-alpine docker2:80/demo/nginx:v0.1
- [root@docker1 ~]# docker tag nginx:1.14 docker2:80/demo/nginx:v0.2
- [root@docker1 ~]# docker image ls
- REPOSITORY TAG IMAGE ID CREATED SIZE
- docker2:80/demo/nginx v0.2 3f55d5bb33f3 11 days ago 109 MB
- docker2:80/demo/busybox v0.1 758ec7f3a1ee 2 weeks ago 1.15 MB
- docker2:80/demo/nginx v0.1 c5b6f731fbc0 2 weeks ago 17.7 MB
(3)登录harbor仓库
- [root@docker1 ~]# docker login docker2:80
- Username: admin
- Password:
- Login Succeeded
(4)上传镜像
- [root@docker1 ~]# docker push docker2:80/demo/busybox:v0.1
- The push refers to a repository [docker2:80/demo/busybox]
- 23bc2b70b201: Pushed
- v0.1: digest: sha256:cbcde3595079b1f7a6b046e96e7547fe786d5c2c8eba678bc260161bc01b8dbe size: 527
- [root@docker1 ~]# docker push docker2:80/demo/nginx #如果不知道tag,会把这个镜像的所有tag都上传
- The push refers to a repository [docker2:80/demo/nginx]
- 59b059d445c1: Layer already exists
- 0246bb21855f: Layer already exists
- 42acf078bf60: Layer already exists
- 7bff100f35cb: Layer already exists
- v0.1: digest: sha256:438d8080098025e9983f253af806c1d1aa6b48be2ef1913991dab506bb3d4f72 size: 1153
- 6959f2c2a244: Pushed
- 06eb7a5682d6: Pushed
- 7b4e562e58dc: Pushed
- v0.2: digest: sha256:1313a52e3fd1718b1c36822cefa0e51950654004dcf12b08affb3067e02c6d9c size: 948
(5)在harbor 上验证上传成功
(6)拉取harbor 中的镜像
- [root@docker1 ~]# docker rmi docker2:80/demo/busybox:v0.1
- Untagged: docker2:80/demo/busybox:v0.1
- Untagged: docker2:80/demo/busybox@sha256:cbcde3595079b1f7a6b046e96e7547fe786d5c2c8eba678bc260161bc01b8dbe
- [root@docker1 ~]# docker image ls docker2:80/demo/busybox:v0.1
- REPOSITORY TAG IMAGE ID CREATED SIZE
- [root@docker1 ~]# docker pull docker2:80/demo/busybox:v0.1
- v0.1: Pulling from demo/busybox
- Digest: sha256:cbcde3595079b1f7a6b046e96e7547fe786d5c2c8eba678bc260161bc01b8dbe
- Status: Downloaded newer image for docker2:80/demo/busybox:v0.1
- [root@docker1 ~]# docker image ls docker2:80/demo/busybox:v0.1
- REPOSITORY TAG IMAGE ID CREATED SIZE
- docker2:80/demo/busybox v0.1 758ec7f3a1ee 2 weeks ago 1.15 MB
(7)在harbor web页面可以进行很多实用的操作
如:给镜像打标、复制镜像、删除镜像等
4.3 控制harbor 服务
在harbor 安装路径下,使用docker-compose 命令对harbor 进行控制
(1)暂停harbor服务
- [root@docker2 harbor]# docker-compose pause
- Pausing harbor-log ... done
- Pausing harbor-adminserver ... done
- Pausing registry ... done
- Pausing redis ... done
- Pausing registryctl ... done
- Pausing harbor-db ... done
- Pausing harbor-core ... done
- Pausing harbor-jobservice ... done
- Pausing harbor-portal ... done
- Pausing nginx ... done
(2)关闭harbor服务
- [root@docker2 harbor]# docker-compose stop
- Stopping nginx ... done
- Stopping harbor-portal ... done
- Stopping harbor-jobservice ... done
- Stopping harbor-core ... done
- Stopping harbor-db ... done
- Stopping registryctl ... done
- Stopping redis ... done
- Stopping registry ... done
- Stopping harbor-adminserver ... done
- Stopping harbor-log ... done
- [root@docker2 harbor]# ss -nutl
- Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
- tcp LISTEN 0 128 *:22 *:*
(3)开启harbor服务
- [root@docker2 harbor]# docker-compose start
- Starting log ... done
- Starting registry ... done
- Starting registryctl ... done
- Starting postgresql ... done
- Starting adminserver ... done
- Starting core ... done
- Starting portal ... done
- Starting redis ... done
- Starting jobservice ... done
- Starting proxy ... done
Docker系列08—搭建使用私有docker registry的更多相关文章
- Docker容器之搭建本地私有仓库
Docker容器之搭建本地私有仓库 本地私有仓库搭建的具体步骤 首先下载 registry 镜像 docker pull registry 在 daemon.json 文件中添加私有镜像仓库的地址并重 ...
- 8天入门docker系列 —— 第六天 搭建自己的私有镜像仓库Registry
这一篇我们来聊聊私有仓库的搭建,其实不管你是通过docker build还是compose的方式进行构建,最终还是要将生成好的镜像push到远程的仓库中,这样多个 平台可以方便的获取你registry ...
- Docker系列教程01-Centos7安装新版Docker教程(10步)
最近一直忙于开发,没有时间好好总结一下docker的知识.其实现在docker的教程已经很多很多了,但是很多系统的教程都是基于Ubuntu系统,因为官方推荐使用Ubuntu系统啊,原因在于Ubuntu ...
- Docker系列10—容器编排工具Docker Compose详解
本文收录在容器技术学习系列文章总目录 1.Docker Compose 概述 Compose是一个用于定义和运行多容器Docker应用程序的工具.使用Compose,您可以使用Compose文件来配置 ...
- docker 系列 - 基础镜像环境和Docker常用命令整理
=======================docker 基础镜像环境 alpine=======================可以使用 docker search 命令搜索指定的 image, ...
- docker系列(三):docker容器
1 引言 在前面博文中,我们介绍了镜像.如果说镜像犹如面向对象中的类,本节要说的容器就是由类实例化出来的对象了,有了类才可以创建容器. 先从拉取一个官方提供的ubuntu最新镜像: $ docker ...
- docker系列详解<一>之docker安装
1.Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker . 通过 uname -r 命令查看你当前的内核版本 $ ...
- Docker系列08:容器监控
1 监控解决方案 cadvisor+influxdb+grafana cAdvisor:Google开源的工具,用于监控Docker主机和容器系统资源,通过图形页面实时显示数据,但不存储:它通过宿主机 ...
- 【Docker系列】:全面认识Docker和基本指令
Docker逐渐成为虚拟化技术的佼佼者,Docker技术也是架构师的必备技能. 什么是Docker Docker 是一个开源的应用容器引擎,基于Go语言,诞生于2013年初,最初发起者是dotClou ...
随机推荐
- 对象转JSON
/// <summary> /// 把对象序列化 JSON 字符串 /// </summary> /// <typeparam name="T"> ...
- web项目部署到服务器中浏览器中显示乱码
项目部署之后浏览器打开查看时页面乱码 这里可能需要修改一下tomcat配置文件,首先找到Tomcat的安装路径下的conf/server.xml文件,找到之后可以CTRL+F搜索如下的内容: < ...
- jieba中文分词
jieba中文分词¶ 中文与拉丁语言不同,不是以空格分开每个有意义的词,在我们处理自然语言处理的时候,大部分情况下,词汇是对句子和文章的理解基础.因此需要一个工具去把完整的中文分解成词. ji ...
- 类型后面加问号 int?
类型后面加问号 int? 单问号---用于给变量设初值的时候,给变量(int类型)赋值为null,而不是0! 双问号---用于判断并赋值,先判断当前变量是否为null,如果是就可以赋一个新值,否则跳过 ...
- pta-树种统计
树种统计 (25 分) 随着卫星成像技术的应用,自然资源研究机构可以识别每一棵树的种类.请编写程序帮助研究人员统计每种树的数量,计算每种树占总数的百分比. 输入格式: 输入首先给出正整数N(≤105 ...
- Consider defining a bean named 'entityManagerFactory' in your configuration解决办法
错误信息: *************************** APPLICATION FAILED TO START *************************** Descriptio ...
- Python基础之面向对象思维解决游戏《天龙八部》
一.程序设计思维: 以面向对象的思维设计<天龙八部>游戏技能,使得技能效果在增加或者减少时,游戏技能整体框架不改变,仅仅增加或者减少技能效果 二.思路流程图如下: 三.变成框架实现代码: ...
- PDF转换成Word,ppt转换成word
pdf与word我没找到直接转换的方式,不过可以用间接方式嘛! pdf ==>picture ==>word!ppt转word的原理也是先把ppt转成图片,再把图片插入word! 先准备好 ...
- QT中foreach的使用
在标准C++中,并没有foreach关键字. 但是在QT中,可以使用这一个关键字,其主要原因是QT自己增加了这一个关键字,就像slots和signals.emit等一样.增加的foreach关键字在编 ...
- 老桂.net core系列课程
为了支持"首届dnc开源峰会"(dncNew.com)顺利举办,本人<.net core系列课程>进行一波优惠,每个课程优惠在立即购买上方,领取现金券即可.课程地址为腾 ...