我们通常使用Harbor来管理docker镜像,公司内部自己构建的镜像都会上传到harbor,帮客户搭建服务时可以直接从公司的harbor上拉取镜像
注意:安装harbor之前需要安装好docker和docker-compose
下载、解压和配置
由于网络原因,我们采用offline安装方式,从https://github.com/goharbor/harbor/releases/tag/v2.2.2
下载offline的安装文件,就是近500M的那个文件
下载后上传到服务器上,如放到/usr/local/harbor目录下,tar -xzvf
解析tgz文件,对于tar命令的参数,主要记住-x是解压(可以这么记忆:用剪刀剪开),-c是压缩(可以这么记忆:用一个袋子把文件装进去)
解压后,vi命令编辑harbor.yml.tmpl文件,这是一个yaml文件,内容的格式大家应该都会,主要修改以下内容:
hostname
这个是域名,需要修改成大家公司自己的域名,如果是自己测试,可以随便填个域名,然后在/etc/hosts
中解析域名到127.0.0.1就好,在这里我们输入hub.demo.comhttp.port
这个是端口,默认是80,一般不改,除非80端口被占用了https
这个是https配置,需要提供SSL证书,如果是自己生成的证书,需要在docker配置文件中设置insecure-registries
,否则docker会认为这是不安全的域名,下文会说,等会自己生成一个证书再回来修改harbor_admin_password
这是harbor提供的管理后台的管理员密码database
这个节点下面的配置是harbor自己依赖的数据库密码以及连接参数data_volume
这是harbor数据存储的目录,不用修改,之后可以在docker-compose.yml中挂载宿主机目录,只要记住这个目录就好
其他的配置参数就不用动了,接下来我们来生成SSL证书
生成SSL证书
注意:这里介绍的生成SSL证书只是用作测试的,真正的SSL证书要从第三方(如阿里云)上生成,自己随便生成的证书,浏览器是不认的
下面开始生成
openssl genrsa -des3 -out server.key 2048
复制代码
执行上面这行命令后,会要求填写密码,密码长度不能小于4位,我们测试就搞简单一点的密码,输入1234即可,输入密码后按回车会在当前目录下生成一个server.key
文件
openssl req -new -key server.key -out server.csr
复制代码
上面这行命令执行时要输入上一步生成server.key
时输入的密码,然后会要求依次输入国家、省份、城市、组织名称和自己的姓名,测试时随便填就好,全填完之后会生成一个server.csr
文件
接下来我们去掉server.key
的密码
// 先复制server.key
cp server.key server.key.old
openssl rsa -in server.key.old -out server.key
复制代码
执行命令时要输入原server.key
的密码
现在可以来生成crt证书文件了
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
复制代码
经过上面的步骤得到两个需要用到的文件,分别是:server.crt
和server.key
,修改harbor.yml.tmpl
文件,将https
节点下的certificate
修改为server.crt
的路径,将private_key
修改为server.key
的路径
安装harbor
执行以下命令
mv harbor.yml.tmpl harbor.yml
./install.sh
复制代码
由于我们下载的harbor是offline版本,所有需要用到的docker镜像都已经下载好了,所以安装过程很快,如果你下载的不是offline版本,可能在这一步会等很久甚至会提示网络错误(下载不了镜像文件)
安装完成后会在当前目录生成一些文件,其中有一个眼熟的文件docker-compose.yml
,说明安装之后停止harbor可以用docker-compose down
,再次启动harbor可以用docker-compose up -d
命令,修改容器配置可以编辑docker-compose.yml
文件
安装完成后默认就已经启动了harbor的docker容器
现在需要修改本机的/etc/hosts
文件,添加192.168.3.3 hub.demo.com
,其中IP是运行harbor的服务器IP
我们访问上面配置的域名https://hub.demo.com/
,如果浏览器上打不开,就修改harbor.yml
文件,注释掉https
的配置,再重新./install.sh
,最后访问http://hub.demo.com
,注意不是https而是http
打开harbor管理如下:
用户名admin
,密码是在harbor.yml中配置的,登录后界面如下:
在左边点击Users
创建一个用户,假设用户名为test
在左边点击Projects
创建一个项目,假设项目名为test,项目创建成功后会自动进入该项目详情页,点击Members
再点击+ USER
,输入上面创建的test用户,使test用户对test项目有权限
docker推送镜像到harbor
先要通过docker命令登录harbor
docker login http://hub.demo.com
复制代码
输入上面创建的test用户名和密码,如果提示Error response from daemon: Get https://hub.demo.com/v2/: dial tcp: lookup hub.demo.com: no such host
,说明本机无法解析hub.demo.com
这个域名,需要修改/etc/hosts
提示Login Succeeded
表示登录成功了,接下来就可以推送镜像了
// 先在本地docker images找一个镜像,也可以自己提前构建一个镜像
// 对镜像打一个带上harbor域名的tag,我这里以busybox镜像为例
docker tag busybox:latest hub.demo.com/test/busybox:v1
// 开始推送
docker push hub.demo.com/test/busybox:v1
复制代码
解释一下上面的tag hub.demo.com/test/busybox:v1
,hub.demo.com是harbor的域名,test是harbor中项目名,busybox:v1是镜像的名称和版本号
推送后,刷新harbor管理后台就可以看到test这个项目下已经有了一个busybox:v1镜像
docker从harbor拉取镜像
也先要通过docker命令登录harbor,为什么其他镜像仓库不用登录呢?因为人家设置了所有人都可以拉取镜像
docker login http://hub.demo.com
复制代码
为了验证拉取是否成功,我们先删除掉本地刚才打好tag的busybox:v1这个镜像
docker rmi hub.demo.com/test/busybox:v1
复制代码
开始拉取镜像
docker pull hub.demo.com/test/busybox:v1
复制代码
查看镜像是否拉取成功
docker images | grep busybox
复制代码
拉取成功后,可以再次对本地镜像重新打上需要的tag