Docker之四----搭建私有docker仓库
Docker仓库之分布式Harbor
harbor介绍
Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器, 由vmware开源,其通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution 。作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。 Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry 中, 确保数据和知识产权在公司内部网络中管控, 另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。
- Harbor gitlab项目地址:https://github.com/goharbor/harbor
- Harbor是一个开源的可信云本机注册表项目,用于存储,签名和扫描内容。Harbor通过添加用户通常需要的功能(如安全性,身份和管理)来扩展开源Docker Distribution。使注册表更接近构建和运行环境可以提高图像传输效率。Harbor支持在注册表之间复制映像,还提供高级安全功能,如用户管理,访问控制和活动审计。
- Harbour由Cloud Native Computing Foundation(CNCF)托管。如果您是一个希望帮助塑造云原生技术发展的组织,请考虑加入CNCF。有关谁参与以及Harbour如何扮演角色的详细信息,请阅读CNCF 公告。
Harbor功能官方介绍:
基于角色的访问控制:用户与Docker镜像仓库通过“项目”进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。
- 镜像复制:镜像可以在多个Registry 实例中复制(同步),尤其适合于负载均衡,高可用,混合云和多云的场景。
- 图形化用户界面:用户可以通过浏览器来浏览,检索当前Docker 镜像仓库,管理项目和命名空间。
- AD/LDAP支: Harb or 可以集成企业内部已有的 AD/LDAP ,用于鉴权认证管理。审计管理:所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。国际化:已拥有英文、中文、德文、日文和俄文的本地化版本。更多的语言将会添加进来。
- RESTful API :提供给管理员对于 Harbor 更多的操控 , 使得与其它管理软件集成变得更容易。
- 部署简单:提供在线和离线两种安装工具,也可以安装到vSphere平台(OVA方式)虚拟设备。
Harbor 特征:
- 云本机注册表:Harbour 支持容器映像和Helm图表,可用作云本机环境(如容器运行时和业务流程平台)的注册表。
- 基于角色的访问控制:用户和存储库通过“项目”进行组织,用户可以对项目下的图像拥有不同的权限。
- 基于策略的映像复制:可以基于具有多个过滤器(存储库,标记和标签)的策略在多个注册表实例之间复制(同步)映像。如果遇到任何错误,Harbor将自动重试进行复制。非常适合负载平衡,高可用性,多数据中心,混合和多云场景。
- 漏洞扫描:Harbor定期扫描图像并警告用户漏洞。
- LDAP / AD支持:Harbor与现有企业LDAP / AD集成以进行用户身份验证和管理,并支持将LDAP组导入Harbor并为其分配适当的项目角色。
- 图像删除和垃圾收集:可以删除图像,并可以回收它们的空间。
- 公证:可以确保图像的真实性。
- 图形用户门户:用户可以轻松浏览,搜索存储库和管理项目。
- 审计:跟踪存储库的所有操作。
- RESTful API:适用于大多数管理操作的RESTful API,易于与外部系统集成。
- 易于部署:提供在线和离线安装程序。
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
注意:有关注册表存储后端的详细信息,请参阅“ 注册表配置参考”。
实战一:实现docker私有仓库的搭建之harbor
架构图
实现原理:将镜像仓库C和镜像仓库D作为主从复制,实现镜像的高可用,如果不在公司内部制作镜像私有仓库,多个服务器直接去阿里云等公网去下载仓库,需要经过出口时,需要占用出口防火墙的带宽,都去出口拉取镜像,就会将出口带宽全部占用完,影响业务的正常运行,通常此带宽能上万兆就上万兆,上不了就做网卡绑定。
环境准备
类型 | IP | 角色 |
A | 192.168.7.100 | docker-1 |
B | 192.168.7.101 | docker-2 |
C | 192.168.7.102 | harbor-1 |
D | 192.168.7.103 | harbor-2 |
主机硬件配置
资源 | 容量 | 描述 |
---|---|---|
CPU | 最小2 CPU | 4 CPU是首选 |
内存 | 最小4GB | 8GB是首选 |
磁盘 | 最小40GB | 160GB是首选 |
安装软件:
软件 | 版 | 描述 |
---|---|---|
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生成证书和密钥 |
网络端口:
端口 | 协议 | 描述 |
---|---|---|
443 | HTTPS | Harbor门户和核心API将接受此端口上的https协议请求 |
4443 | HTTPS | 只有在启用“公证”时才需要连接到Dock的Docker Content Trust服务 |
80 | HTTP | Harbor端口和核心API将接受此端口上的http协议请求 |
搭建harbor需要的磁盘空间很大,在此实验时,我将磁盘额外添加了200G的磁盘,需要将此磁盘进行格式化(ftype=1)和挂载。
1、在C和D主机添加磁盘并进行格式化
1、将添加的/dev/sdb磁盘进行格式化,先查看格式化磁盘帮助
[root@centos-7 src]# mkfs.xfs --help mkfs.xfs: invalid option -- '-' unknown option -- Usage: mkfs.xfs /* blocksize */ [-b log=n|size=num] /* metadata */ [-m crc=0|1,finobt=0|1,uuid=xxx] /* data subvol */ [-d agcount=n,agsize=n,file,name=xxx,size=num, (sunit=value,swidth=value|su=num,sw=num|noalign), sectlog=n|sectsize=num /* force overwrite */ [-f] /* inode size */ [-i log=n|perblock=n|size=num,maxpct=n,attr=0|1|2, projid32bit=0|1] /* no discard */ [-K] /* log subvol */ [-l agnum=n,internal,size=num,logdev=xxx,version=n sunit=value|su=num,sectlog=n|sectsize=num, lazy-count=0|1] /* label */ [-L label (maximum 12 characters)] /* naming */ [-n log=n|size=num,version=2|ci,ftype=0|1] # 格式化ftype=1需要加上-n选项 /* no-op info only */ [-N] /* prototype file */ [-p fname] /* quiet */ [-q] /* realtime subvol */ [-r extsize=num,size=num,rtdev=xxx] /* sectorsize */ [-s log=n|size=num] /* version */ [-V] devicename
2、开始格式化新加的磁盘/dev/sdb
[root@centos-7 src]# mkfs.xfs -n ftype=1 /dev/sdb meta-data=/dev/sdb isize=512 agcount=4, agsize=13107200 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0, sparse=0 data = bsize=4096 blocks=52428800, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=4096 blocks=25600, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0
可以查看此时格式化后的类型
[root@centos-7 docker]# xfs_info /dev/sdb meta-data=/dev/sdb isize=512 agcount=4, agsize=13107200 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0 spinodes=0 data = bsize=4096 blocks=52428800, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal bsize=4096 blocks=25600, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0
3、查询格式化后的磁盘UUID号,然后挂载到配置文件中,进行开机启动
[root@centos-7 src]# blkid /dev/sr0: UUID="2019-09-11-19-02-53-00" LABEL="CentOS 7 x86_64" TYPE="iso9660" PTTYPE="dos" /dev/sda1: UUID="64d9f83a-34c5-4025-94ff-504ca7a00a3f" TYPE="xfs" /dev/sda2: UUID="W0Fol6-811p-efEd-MKeI-mpyz-4vym-nbnIW8" TYPE="LVM2_member" /dev/mapper/centos-root: UUID="1a05193c-173d-4e5c-ac1d-bb68085b4294" TYPE="xfs" /dev/mapper/centos-swap: UUID="f72b951f-b5d6-4572-a4a6-46e93c5080fd" TYPE="swap" /dev/sdb: UUID="76c9a1d5-f2a8-4fc1-aae9-24e7d9b25cf1" TYPE="xfs" # /dev/sdb的磁盘UUID号 [root@centos-7 src]# vim /etc/fstab
4、新建一个目录,将磁盘挂载到指定的目录,并修改配置文件进行挂载
[root@centos-7 docker]# mkdir /var/lib/docker # 创建挂载的目录 [root@centos-7 docker]# cat /etc/fstab # # /etc/fstab # Created by anaconda on Sat Jan 4 16:31:31 2020 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/mapper/centos-root / xfs defaults 0 0 UUID=64d9f83a-34c5-4025-94ff-504ca7a00a3f /boot xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0 UUID="76c9a1d5-f2a8-4fc1-aae9-24e7d9b25cf1" /var/lib/docker xfs defaults 0 0 # 将磁盘的唯一UUID号挂载到指定的目录下 [root@centos-7 docker]# mount -a # 使挂载的目录生效
5、查看挂载的情况,此时已经挂载到指定的目录下
2、在C和D安装docker容器并启动
1、在阿里云官网下载docker的yum源
[root@centos-7 yum.repos.d]# cd /etc/yum.repos.d [root@centos-7 yum.repos.d]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2、开始安装docker-ce包
# yum install docker-ce -y
3、启动docker容器
# systemctl start docker
3、开始配置harbor
harbor下载路径:https://github.com/goharbor/harbor/releases
1、将下载的hrrbor文件存放在/usr/local/src目录下,并解压harbor文件
[root@centos-7 harbor]# cd /usr/local/src [root@centos-7 harbor]#wget https://storage.googleapis.com/harbor-releases/release-1.7.0/harbor-offline-installer-v1.7.5.tgz [root@centos-7 harbor]# tar xvf harbor-offline-installer-v1.7.5.tgz
2、进入到解压后的harbor目录下,修改harbor.cfg配置文件
[root@centos-7 harbor]# cd /usr/local/src/harbor [root@centos-7 harbor]# vim harbor.cfg hostname = 192.168.7.102 harbor_admin_password = 123456 max_job_workers = 2:最大cpu数,小于等于自己服务器的硬件
3、安装epel源,然后安装docker-compose包,此软件起到加载容器的作用
[root@centos-7 harbor]# yum install epel-release -y [root@centos-7 harbor]# yum install docker-compose -y
4、开始安装harbor软件
[root@centos-7 harbor]# cd /usr/local/src/harbor [root@centos-7 harbor]# ./install.sh
5、使用http://192.168.7.102网站登录,用户名是admin,密码是123456,在D仓库也同样操作,创建一个baseimages项目,我们在使用harbor仓库时,最好创建普通用户账号,用普通账号才能管理仓库。
6、在C和D主机都创建一个公开的镜像仓库,起名为baseimages
4、在A和B主机修改docker配置文件
1、修改systemd配置文件,指向私有仓库的IP地址,才能登录到私有仓库上
[root@centos-7 ~]# vim /lib/systemd/system/docker.service ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 192.168.7.102 --insecure-registry 192.168.7.103 #主要添加了--insecure-registry 192.168.7.102 --insecure-registry 192.168.7.103 此IP地址是指向仓库IP地址
2、重启docker服务
# systemctl daemon-reload # systemctl restart docker
3、给docker镜像打标签
[root@centos-7 ~]# docker images #查看镜像内容 REPOSITORY TAG IMAGE ID CREATED SIZE tomcat-app1 v1 5aff93ee47dd 4 hours ago 931MB centos-haproxy v1.8.17 e3bd19c3d590 4 hours ago 1.13GB tomcat-app2 v1 e9ae6fd8cf53 4 hours ago 931MB <none> <none> f85e80d3c22d 4 hours ago 931MB <none> <none> a116b46ec794 6 hours ago 931MB <none> <none> b3e996ab23a4 6 hours ago 1.13GB <none> <none> 7fe7c398269e 7 hours ago 931MB tomcat-base 8.5.37 21ab497620f2 10 hours ago 917MB jdk-base 1.8.0.192 830c0d4f0279 11 hours ago 903MB centos-base 7.6.1810 d12613615be1 11 hours ago 507MB 192.168.7.102/baseimages/centos-base 7.6.1810 d12613615be1 11 hours ago 507MB centos 7.6.1810 0f3e07c0138f 3 months ago 220MB centos latest 0f3e07c0138f 3 months ago 220MB [root@centos-7 ~]# docker tag centos-base:7.6.1810 192.168.7.102/baseimages/centos-base:7.6.1810 #给docker镜像打标签,必须打标签才能上传,否则无法上传
4、登录镜像仓库并上传打了标签的镜像
[root@centos-7 ~]# docker login 192.168.7.102 username admin password #密码是123456 [root@centos-7 ~]# docker push 192.168.7.102/baseimages/centos-base:7.6.1810 #登录成功就可以上传镜像了
5、在B主机进行下载镜像到本地linux上,需要登录到harbor地址即可
[root@centos-7 harbor]# docker login 192.168.7.102 #登录 Username: admin Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded [root@centos-7 harbor]# docker pull 192.168.7.102/baseimages/centos-base:7.6.1810 #下载刚才的镜像
下载镜像路径如下图:
5、创建harbor私有仓库的高可用
1、在C和D主机网页进行设置,在目标URL处都指向对方的IP地址
2、在C和D主机创建复制管理规则,并都写上对方的仓库名称,指明要复制的仓库名
3、可以看到前面上传的centos-base:7.6.1810标签镜像已经在两个私有仓库中。
C仓库上传后的镜像
D仓库上传后的镜像
控制harbor服务
控制harbor服务的命令,需要切换到解压后的目录下执行:
[root@centos-7 harbor]# docker-compose stop #停止harbor服务 Stopping nginx ... done Stopping harbor-jobservice ... done Stopping harbor-portal ... done Stopping harbor-core ... done Stopping registryctl ... done Stopping harbor-db ... done Stopping registry ... done Stopping redis ... done Stopping harbor-adminserver ... done Stopping harbor-log ... done [root@centos-7 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 [root@centos-7 harbor]# docker-compose pause #暂停服务 Pausing harbor-log ... done Pausing harbor-adminserver ... done Pausing redis ... done Pausing registry ... done Pausing harbor-db ... done Pausing registryctl ... done Pausing harbor-core ... done Pausing harbor-portal ... done Pausing harbor-jobservice ... done Pausing nginx ... done
如果想设置为开机启动,只需要将启动程序存在/etc/rc.d/rc.local下,并加上执行权限即可。
[root@centos-7 ~]# vim /etc/rc.d/rc.local cd /usr/local/src/harbor && docker-compose start [root@centos-7 ~]# chmod +x /etc/rc.d/rc.local #加上执行权限即可