前言
在前面的文章中,我们介绍了如何定制镜像、容器编排,但仿佛对镜像管理并没有提及,那么镜像文件我们是否可以像管理代码一样实现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
③ 修改镜像名称,保持与镜像仓库一致
docker tag joinsunsoft/docker.ui:latest chenjigang/auto-test:v1.1
④ 提交镜像到公共仓库
docker push chenjigang/auto-test:v1.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
② 编辑配置文件
cp harbor.yml.tmpl harbor.yml # 复制一份harbor.yml文件vi harbor.yml
按照如下内容编辑:
- hostname改为本机ip
- 端口默认80,可以改为其他指定端口
- 注释掉https的相关配置
③ 准备安装环境
./prepare # 执行prepare脚本
执行完成后,本地会多一个docker-compose.yml文件和common目录
④ 安装harbor
./install.sh # 安装harbor
安装过程中会自动下载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
查看harbor各个容器状态:
- 报错registry容器重复
若本地之前已存在registry容器时,harbor安装过程会报错,解决方案:删除原registry容器,重新执行./install.sh进行安装;若此方式仍报错,则执行docker-compose up -d启动各个服务;
3.推送本地镜像到Harbor
① 创建项目
② Docker登录
由于之前登录过docker-hub,所以再次使用“docker login”命令登录时,默认登录的还是docker-hub的地址。因此,如果想要登录harbor,需要在登录时指定登录地址。
docker login 192.168.1.122:8087
首次登录,根据提示输入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"}
systemctl daemon-reload systectl restart docker
再次登录后登录成功:
③ 本地镜像打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
④ 推送本地镜像到Harbor
docker push 192.168.1.122:8087/harbor/rabbitmq:3.7-management
查看名为harbor的项目下,存在rabbitmq:3.7-management,测试成功。
⑤ 从Harbor拉取镜像
- 拉取镜像
docker pull 192.168.1.122:8087/library/mysql:5.7.33
从下图可以看出,MySQL镜像已经拉取成功
同时,Harbor管理端也能看到最新的拉取时间:
- 创建容器
docker run -it-d-eMYSQL_ROOT_PASSWORD=123456--name=mysql -p3307:3306 192.168.1.122:8087/library/mysql:5.7.33
登录MySQL