前言:宁可一思进,莫要一思停
harbor-私有仓库
是什么
Docker容器应用的开发和运行离不开可靠的镜像管理,虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署私有环境内的Registry也是非常必要的。Harbor是由VMware公司开源的企业级的Docker Registry管理项目,它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能
harbor的优势
- 提供分层传输机制,优化网络传输。Docker镜像是是分层的,而如果每次传输都使用全量文件(所以用FTP的方式并不适合),显然不经济。必须提供识别分层传输的机制,以层的UUID为标识,确定传输的对象。
- 提供WEB界面,优化用户体验。只用镜像的名字来进行上传下载显然很不方便,需要有一个用户界面可以支持登陆、搜索功能,包括区分公有、私有镜像。
- 支持水平扩展集群。当有用户对镜像的上传下载操作集中在某服务器,需要对相应的访问压力作分解。
- 良好的安全机制。企业中的开发团队有很多不同的职位,对于不同的职位人员,分配不同的权限,具有更好的安全性。
- Harbor提供了基于角色的访问控制机制,并通过项目来对镜像进行组织和访问权限的控制。kubernetes中通过namespace来对资源进行隔离,在企业级应用场景中,通过将两者进行结合可以有效将kubernetes使用的镜像资源进行管理和访问控制,增强镜像使用的安全性。尤其是在多租户场景下,可以通过租户、namespace和项目相结合的方式来实现对多租户镜像资源的管理和访问控制。
harbor搭建
获取相关harbor安装包
wget https://github.com/goharbor/harbor/releases/download/v2.2.3/harbor-offline-installer-v2.2.3.tgz
更改harbor配置文件
#hostname设置访问地址,可以使用ip,域名但不能设置为127.0.0.1或localhost
hostname = reg.mydomain.com
#访问协议,默认是http,也可以设置https,如果设置https,则nginx ssl需要设置on
ui_url_protocol = http
#数据库root用户密码设置
db_password = root123
#邮箱设置,发送重置密码邮箱时使用
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
#设置harbor管理员密码
harbor_admin_password = Harbor12345
#认证方式,这里支持多种认证方式,如LADP、本次存储、数据库认证。默认是db_auth,mysql数据库认证
auth_mode = db_auth
#LDAP认证时配置项
ldap_url = ldaps://ldap.mydomain.com
#ldap_searchdn = uid=searchuser,ou=people,dc=mydomain,dc=com
#ldap_search_pwd = password
ldap_basedn = ou=people,dc=mydomain,dc=com
#ldap_filter = (objectClass=person)
ldap_uid = uid
ldap_scope = 3
ldap_timeout = 5
#是否开启自注册
self_registration = on
#token有效时间,默认30分钟
token_expiration = 30
#用户创建项目权限控制,默认是everyone(所有人),也可以设置为adminonly(只能管理员)
project_creation_restriction = everyone
设置好之后运行到harbor目录下运行./install.sh
查看harbor所依赖的组件的镜像
docker-compose -ps
用使用harbor.cfg所配置的密码登入admin账户
新建项目
创建名为test的项目设置为不公开,不公开需要命令行用户docker login就可以拉取此项目下的镜像
登入的坑
docker login IP地址出现问题
这里我去搜索了下解决方法说是要去更改/usr/lib/systemd/system/docker.service配置文件
在ExecStart之后添加–insecure-registry=http://自己的IP
但重启之后依然还是这个报错又看了下这里去请求的是443端口而harbor用的是80端口所以继续尝试了下docker login 172.16.183.82:80结果还是报这个错。看了下harbor也等不上去了报的是连接不上的错误,一般连接不上的话要么就是防火墙问题,要么就是服务没起起来,我们使用netstat -lntp查看端口情况
发现80端口开都没开起来,重启docker的时候没有重启harbor,我们./install.sh一下在输入docker login 172.16.183.82:80
好了问题解决
上传镜像到test仓库
这里又涉及要一个理解push的问题
docker要上传镜像到私有仓库要在镜像的tag上写上registry_name/repository_name/image_name:tag_name,开始我以为是直接docker push registry_name/repository_name/image_name:tag_name结果直接报错
这里翻译一下就是推送的仓库是xxx标签xxx不存在
有去看了下docker push到私有仓库发现都有更改标签的步骤,尝试去更改标签。
好了问题解决。(这里看到镜像存在的原因是因为之前测试了一次)还要注意一点是要写上80端口。
dockerfile
什么是dockerfile
镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile。Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
基本语法
♾️ json 代码:FROM#基础镜像,一切从这里开始构建
MAINTAINER#镜像是谁写的,姓名+邮箱
RUN#镜像构建的时候需要运行的命令
WORKDIR#镜像的工作目录
VOLUME#挂载的目录
EXPOSE#暴露端口配置
CMD#指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT#指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD#当构建一个被继承 Dockerfile 这个时候就会运行ONBUILD 的指令
COPY#复制文件
ADD#更高级的复制文件
ENV#构建的时候设置环境遍量
这里先大体总结几点实用的,今天编写的时候出了点问题
- 编写镜像的过程是一层一层的,dockerfile的指令不易过多
- docker构建镜像命令
- docker build -t 镜像名 .
- 这里的又要引出docker的一个上下文的概念,docker是一个经典的C/S架构,所以dockerfile是在S上执行的,那么但我们在dockerfile中COPY,ADD的时候服务端是怎么知道我们要copy的路径了,其实就是根据docker build最后面的. 来判断的,docker客户端会把根据上下文把其中的东西打包成tar包发送给服务端
- 能copy就不要用add
- run的时候注意要以xxx&&的形式不要一直run,一直run会使镜像十分臃肿且易出错