Docker容器实战【三】搭建Docker镜像私服Harbor

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 每个企业都有自己的镜像私服仓库,和nexus一样,公司内部的镜像制品都存放在自己的私服仓库中,今天我们来学习Harbor

目前主流的Docker4种私有仓库

  1. docker-registry:docker hub 提供的一直私有仓库解决方案。没有图形化界面
  2. Harbor:带有图形化界面的工具,用户管理,及查看更加方便
  3. Nexus:一般我们Maven和Gradle用得比较多,管理jar包,也能存储docker镜像,由于一个版本一个版本的保存和叠加,所以清理起来比较麻烦。
  4. 云平台容器服务(如阿里云,常用于生产环境)

这里我主要介绍2种相对较友好的镜像私服,harbor和阿里云容器服务

系统环境说明:
 Centos 7
 Docker Version: 20.10.14

Harbor

简介

Harbor Registry(又称 Harbor 云原生制品仓库或 Harbor 镜像仓库)由 VMware 公司中国研发中心云原生实验室原创,并于 2016 年 3 月开源。Harbor 在 Docker Distribution的基础上增加了企业用户必需的权限控制、镜像签名、安全漏洞扫描和远程复制等重要功能,还提供了图形管理界面及面向国内用户的中文支持,开源后迅速在中国开发者和用户社区流行,成为中国云原生用户的主流容器镜像仓库。

特性

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

下载安装包

Harbor 提供了多种途径来帮助用户快速搭建 Harbor 镜像仓库服务,包括:

  • 离线安装包:通过docker-compose编排运行。安装包除了包含相关的安装脚本外,还包含了所有安装所需要的Harbor组件镜像,可以在离线环境下安装使用。
  • 在线安装包:与离线安装包类似,唯一的区别就是不包含harbor组件镜像,安装时镜像需要从网络上的仓库服务拉取。
  1. 手动下载:官方源码戳我,找到最新Tag拉到底部进行下载,建议采用迅雷

    image.png

  2. 采用wget下载(较慢):wget https://github.com/goharbor/harbor/releases/download/v2.5.0/harbor-offline-installer-v2.5.0.tgz
  3. 这里我们选择离线版。

安装docker-compose

Harbor由多个组件组成,其每个组件都是以Docker容器的形式构建的,官方采用Docker Compose来对它进行部署。用于部署HarborDocker Compose模板位于 harbor/docker-compose.yml中,这个模板文件中有多个镜像定义,常见如:harbor-log,harbor-db,registry,harbor-core,nginx,harbor-portal,harbor-jobservice等,版本不一样所依赖的容器熟练不一样。

所以我们需要提前安装好docker compose。

# 下载 http://github.com/docker/compose/releases 网络原因可能会失败
$ curl -L "https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

# 也可以手动下载
https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-linux-x86_64
# 重命名
$ mv docker-compose-linux-x86_64 docker-compose
# 授权
$ chmod +x /usr/local/bin/docker-compose
 
# 可定义全局变量或者软链接,方便执行:
$ ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
 
# 验证
$ docker-compose --version
Docker Compose version v2.5.0

# 注意如果运行docker-compose出现Segmentation fault错误,可以做如下操作
1. 重启docker服务
2. 删除docker-compose文件重新下载

生产HTTPS证书

由于我们是在本地或虚拟机,可以不用安装,大家也可以采用其他免费证书

# 官方下载地址
https://goharbor.io/docs/1.10/install-config/configure-https/

安装Harbor

  1. 解压配置

    $ tar xvf harbor-offline-installer-v2.5.0.tgz -C /usr/local/
    $ cd harbor/
    
    # 编辑harbor.yml(老版本是harbor.cfg),修改hostname、https证书路径、admin密码(可选)
    # 先复制一份harbor.yml
    $ cp -f harbor.yml.tmpl harbor.yml
    $ vim harbor.yml
    
    -- 示例如下
    # 用于访问用户界面和 register 服务。它应该是目标机器的 IP 地址或完全限 定的域名。例如 192.168.2.195 或 hub.it235.com。不要使用 localhost 或 127.0.0.1 为主机名。
    hostname: 192.168.2.195
    http:
      # port避免和nginx冲突,改成非80即可,本文改为9080
      port: 8098
    # 注意,如果不开启https,则需要把https节点的内容注释掉,否则安装会报错,在老版本中由enable属性控制
    https:
      port: 443
      # ssl证书地址 仅当协议设置为 https 时才应用。
      certificate: /your/certificate/path
      private_key: /your/private/key/path
    # harbor默认用户名密码  
    harbor_admin_password: Harbor12345
    
    # harborDB 用于db_auth 的MySQL数据库root 用户的密码。
    database:
      password: root123
      max_idle_conns: 100
      max_open_conns: 900
    
    # The default data volume
    data_volume: /data
    
    
    # 运行
    $ sh /usr/local/harbor/install.sh 或进入到harbor目录执行 ./install.sh 
    
    # 安装成功的结果
    ✔ ----Harbor has been installed and started successfully.----
    
    # 注意,如果失败,修改相关配置后再次执行./install.sh即可(一般失败原因大多是端口冲突)
  2. 重启docker-compose

    # 关闭
    $ docker-compose down -v
    
    # 启动
    $ docker-compose up -d
    
    # 如果出现以下错误,请启动docker,或重启docker
    $ docker-compose ps
    no configuration file provided: not found
    
    $ systemctl start docker 
    $ systemctl restart docker 
  3. 查看harbor安装情况

    # 查看已经拉取的镜像
    $ docker images
    
    # 查看所有容器
    $ docker ps -a
    
    # 查看compose容器相关运行情况
    $ docker-compose ps
  4. 清空所有容器和镜像

    docker rm -f $(docker ps -aq)
    
    docker rmi -f $(docker images -aq)
  5. 访问harbor

    如果使用了https出现检查证书的情况,说明证书失效或配置存在问题,可点击继续访问

    image.png

    默认账号密码: admin/Harbor12345,可在harbor.yml中修改

    image.png

    作为开发人员,与harbor打交道最多的就是项目模块,其他模块可以暂时忽略

镜像推送

  1. harbor创建项目

    image.png

  2. 找另外一台Linux机器

    • 安装docker环境
    • 配置docker的镜像仓库为harbor的机器

      # 注意,这里不再是其他的国内镜像仓库,而是要使用我们的私服harbor
      $ cat /etc/docker/daemon.json
      {
          "registry-mirrors" : ["http://hub-mirror.c.163.com"], # 国内镜像代理
          "insecure-registries" : ["192.168.2.195:8098"], # harbor私服
          "live-restore": true # 重载docker守护进程而不重启容器
      }
    • 在我们另外另外一台机器上把harbor的密码存下来,写到一个文件中
    • 使用命令行的方式登录到harbor

      # 在我们另外另外一台机器上把harbor的密码存下来,写到一个文件中
      $ echo Harbor12345 > /etc/docker_passwd
      
      # 登录,因为harbor对密码有一定的要求,所以要采用这种方式
      $ cat /etc/docker_passwd | docker login -u admin --password-stdin http://192.168.2.195:8098
      
      Login Succeeded
      
      # 注意:如果出现了https问题,那么请检查daemon.json配置是否与我上面描述的一致
  3. 随意从官方仓库下载一个镜像

    $ docker pull nginx
  4. 给镜像打标签

    # docker tag SOURCE_IMAGE[:TAG] 192.168.2.195:8098/it235/REPOSITORY[:TAG]
    $ docker tag redis:latest 192.168.2.195:8098/it235/nginx:v1
  5. 推送到harbor仓库

    # docker push 192.168.2.195:8098/it235/REPOSITORY[:TAG]
    $ docker push 192.168.2.195:8098/it235/nginx:v1
  6. 进入ui页面查看

    image.png

  7. 删除已存在的镜像,并从harbor拉取镜像

    $ docker rmi nginx
    
    $ docker pull 192.168.2.195:8098/it235/nginx:v1
  8. 启动容器并验证

    $ docker run -d -p 8888:80 192.168.2.195:8098/it235/nginx:v1
    
    浏览器访问:http://192.168.2.194:8888
    
    # 注意,如果是在云服务器上,需要在安全组中配置8888端口或使用nginx代理才可以在外网访问
    # 本地如果有防火墙未直接暴露8888端口,则需要将8888端口加入到防火墙中
  9. IDEA容器插件自动推送
  10. 使用Maven或Gradle集成自动推送
  11. 使用jenkins打包构建推送

总结

Harbor是目前企业中应用较为广泛的镜像仓库,虽然各云厂商推出了私有镜像仓库,但是云下的应用场景Harbor有着不可撼动的地位

相关实践学习
通过容器镜像仓库与容器服务快速部署spring-hello应用
本教程主要讲述如何将本地Java代码程序上传并在云端以容器化的构建、传输和运行。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
21小时前
|
缓存 Docker 容器
在Docker中,docker commit生成的镜像和dockerfile生成镜像有什么区别?
在Docker中,docker commit生成的镜像和dockerfile生成镜像有什么区别?
|
18小时前
|
Shell 调度 Docker
在Docker中,如何清理批量后台停止的容器?
在Docker中,如何清理批量后台停止的容器?
|
18小时前
|
Shell Docker 容器
在Docker中,如何停止所有正在运行的容器?
在Docker中,如何停止所有正在运行的容器?
|
18小时前
|
存储 Docker 容器
在Docker中,容器退出后,通过docker ps命令查看不到,数据会丢失么?
在Docker中,容器退出后,通过docker ps命令查看不到,数据会丢失么?
|
18小时前
|
缓存 运维 安全
在Docker中,构建镜像应该遵循哪些原则?
在Docker中,构建镜像应该遵循哪些原则?
|
18小时前
|
Docker 容器
在Docker中,如何批量清理临时镜像文件?
在Docker中,如何批量清理临时镜像文件?
|
18小时前
|
存储 Ubuntu 应用服务中间件
在Docker中,怎么快速查看本地的镜像和容器?
在Docker中,怎么快速查看本地的镜像和容器?
|
18小时前
|
Ubuntu Docker 容器
在Docker中,如何实现退出容器时候自动删除?
在Docker中,如何实现退出容器时候自动删除?
|
18小时前
|
JSON Shell 数据格式
在Docker中,如何查看镜像支持的环境变量?
在Docker中,如何查看镜像支持的环境变量?
|
18小时前
|
Docker 容器 Perl
在Docker中,如何清理后台停止的容器?
在Docker中,如何清理后台停止的容器?