深圳幻海软件技术有限公司 欢迎您!

Docker从入门到实战系列之Dockerhub&私有化仓库Harbor搭建及使用

2023-03-30

前言在前面的文章中,我们介绍了如何定制镜像、容器编排,但仿佛对镜像管理并没有提及,那么镜像文件我们是否可以像管理代码一样实现push、pull的操作呢?答案是有的,docker-hub就是一款公共仓库,在上面可以搜索到别人创建好的各种各样的镜像,以及管理自己的镜像;Harbor是一款私有化镜像仓库,

前言

在前面的文章中,我们介绍了如何定制镜像、容器编排,但仿佛对镜像管理并没有提及,那么镜像文件我们是否可以像管理代码一样实现push、pull的操作呢?答案是有的,docker-hub就是一款公共仓库,在上面可以搜索到别人创建好的各种各样的镜像,以及管理自己的镜像;Harbor是一款私有化镜像仓库,我们可以把镜像上传上去,同一内网下的其他用户均可以下载使用,因为是部署在自己的服务器,因此对于安全性这方面更有保障。docker-hub和Harbor的关系我们可以类比成GitHub和Gitlab。

一、公共镜像仓库Docker-hub

1.docker-hub简介

公共镜像仓库一般是 Docker 官方或者其他第三方组织(阿里云,腾讯云,网易云等)提供的,允许所有人注册和使用的镜像仓库。Docker Hub 是全球最大的镜像市场,目前已经有超过 10w 个容器镜像。

2.提交镜像到仓库

具体步骤注册账号>>登录>>创建仓库>>>linux命令行docker登录>>修改镜像名称(保持与仓库名称一致)>>提交镜像到仓库

① 创建镜像仓库

类似于github上创建代码仓库,分为public(公开的,互联网可见)和private(受保护的,仅自己可见)两种。

② Linux命令行登录Docker账号

docker login  # 登录docker-hub
  • 1.

③ 修改镜像名称,保持与镜像仓库一致

docker tag joinsunsoft/docker.ui:latest chenjigang/auto-test:v1.1
  • 1.

④ 提交镜像到公共仓库

docker push chenjigang/auto-test:v1.1
  • 1.

⑤ 查看镜像仓库

二、私有化镜像仓库Harbor

1.Harbor简介

Harbor是由VMware公司开源的企业级的Docker Registry管理项目,它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能。

作为一个企业级私有 Registry 服务器,Harbor 提供了更好的性能和安全。提升用户使用 Registry 构建和运行环境传输镜像的效率。Harbor 支持安装在多个 Registry 节点的镜像资源复制,镜像全部保存在私有 Registry 中, 确保数据和知识产权在公司内部网络中管控。另外,Harbor 也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。

  • 基于角色的访问控制 - 用户与 Docker 镜像仓库通过 “项目” 进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。
  • 镜像复制 - 镜像可以在多个 Registry 实例中复制(同步)。尤其适合于负载均衡,高可用,混合云和多云的场景。
  • 图形化用户界面 - 用户可以通过浏览器来浏览,检索当前 Docker 镜像仓库,管理项目和命名空间。
  • AD/LDAP 支持 - Harbor 可以集成企业内部已有的 AD/LDAP,用于鉴权认证管理。
  • 审计管理 - 所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
  • 国际化 - 已拥有英文、中文、德文、日文和俄文的本地化版本。更多的语言将会添加进来。
  • RESTful API - RESTful API 提供给管理员对于 Harbor 更多的操控,使得与其它管理软件集成变得更容易。
  • 部署简单 - 提供在线和离线两种安装工具, 也可以安装到 vSphere 平台 (OVA 方式) 虚拟设备。

gitee地址:​​https://gitee.com/project_harbor/harbor?utm_source=alading&utm_campaign=repo​​

2.Harbor搭建

安装说明: Harbor的所有服务组件都是在Docker中部署的,所以官方安装使用Docker-compose快速部署,所以需要安装 Docker、Docker-compose。由于Harbor是基于Docker Registry V2版本,所以就要求Docker版本不小于1.10.0, Docker-compose版本不小于1.6.0。

① 下载并解压安装包

在线下载:

wget https://github.com/goharbor/harbor/releases/download/v2.2.2/harbor-online-installer-v2.2.2.tgz
tar -xvf harbor-online-installer-v2.2.2.tgz
  • 1.
  • 2.

② 编辑配置文件

cp harbor.yml.tmpl harbor.yml  # 复制一份harbor.yml文件
vi harbor.yml
  • 1.
  • 2.

按照如下内容编辑:

  • hostname改为本机ip
  • 端口默认80,可以改为其他指定端口
  • 注释掉https的相关配置

③ 准备安装环境

./prepare  # 执行prepare脚本
  • 1.

执行完成后,本地会多一个docker-compose.yml文件和common目录

④ 安装harbor

./install.sh  # 安装harbor
  • 1.

QQUm86">安装过程中会自动下载harbor镜像并启动相关容器。

⑤ 访问harbor

安装成功后,即可访问harbor:http://192.168.1.122:8087,其中:ip为本机ip,端口为配置文件harbor.yml中配置的端口。默认账号和密码为:admin Harbor12345

harbor.yml文件中可查看或修改密码

⑥ 安装过程中常见问题及解决

  • 报错redis容器重复

原因:本地已存在redis容器,harbor无法启动redis容器

解决办法:修改harbor目录下docker-compose.yml中的redis容器名称,重新启动

docker-compose up -d
  • 1.

查看harbor各个容器状态:

  • 报错registry容器重复

若本地之前已存在registry容器时,harbor安装过程会报错,解决方案:删除原registry容器,重新执行./install.sh进行安装;若此方式仍报错,则执行docker-compose up -d启动各个服务;

3.推送本地镜像到Harbor

① 创建项目

② Docker登录

由于之前登录过docker-hub,所以再次使用“docker login”命令登录时,默认登录的还是docker-hub的地址。因此,如果想要登录harbor,需要在登录时指定登录地址。

docker login http://192.168.1.122:8087
  • 1.

首次登录,根据提示输入harbor用户名及密码即可,与前端登录使用的账号密码一致。

由于我前面登录过一次这个地址,本地会保存认证记录,因此再次登录时无需输入用户名密码即可登录成功。

如遇以下报错:

则要在/etc/docker/daemon.json文件中将本机ip(端口非80时需要带上端口号)加入到insecure-registries列表中,并重载配置。

{
        "registry-mirrors":[
        "http://registry.docker-cn.com",
        "http://docker.mirrors.ustc.edu.cn",
        "http://hub-mirror.c.163.com",
        "http://cr.console.aliyun.com/",
        "https://8wb4g36l.mirror.aliyuncs.com"
],
        "insecure-registries":["192.168.1.122:8087"],
        "graph": "/home/docker_home"
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

systemctl daemon-reload
systectl restart docker
  • 1.
  • 2.

再次登录后登录成功:

③ 本地镜像打tag

镜像名称需要命名为:ip:端口号/项目名称/镜像名:tag名,才能上传到该指定项目下,例如rabbitmq镜像,则名称为:
192.168.1.122:8087/harbor/rabbitmq:5.7.33

为了方便测试,我直接复制本地的一个镜像,并重新命名:

docker tag rabbitmq:3.7-management 192.168.1.122:8087/harbor/rabbitmq:3.7-management
  • 1.

④ 推送本地镜像到Harbor

docker push 192.168.1.122:8087/harbor/rabbitmq:3.7-management
  • 1.

查看名为harbor的项目下,存在rabbitmq:3.7-management,测试成功。

⑤ 从Harbor拉取镜像

  • 拉取镜像
docker pull 192.168.1.122:8087/library/mysql:5.7.33
  • 1.

从下图可以看出,MySQL镜像已经拉取成功

同时,Harbor管理端也能看到最新的拉取时间:

  • 基于拉取的镜像创建容器
docker run -it -d -e MYSQL_ROOT_PASSWORD=123456 --name=mysql -p 3307:3306 192.168.1.122:8087/library/mysql:5.7.33
  • 1.

进入MySQL容器,登录MySQL

至此,即完成了"登录harbor后台>>创建仓库>>>docker命令行登录harbor>>修改镜像名称(保持与仓库名称一致)>>提交镜像到仓库>>拉取镜像>>基于拉取的镜像创建容器>>查看容器"这一系列完整的操作。