返回介绍

5.1 docker 镜像仓库

发布于 2024-09-08 18:53:00 字数 13165 浏览 0 评论 0 收藏 0

镜像存储路径

  • linux: /var/lib/docker
  • windows: ~/.docker/

镜像管理主要命令:

  • docker images # 查看本地镜像列表

  • docker search xx # 搜索某个镜像

  • docker pull xx # 下载某个镜像

    # 以 python 为例 找能用的 python 版本
    # 先找带有 python 名称的镜像
    docker search python
    
    # 打印出 python 镜像的所有 layer
    curl https://registry.hub.docker.com/v1/repositories/python/tags| tr -d '[\[\]" ]' | tr '}' '\n'
    
    # 在上面语句基础上用 awk 提取:的第三段,组合成 python:[3]
    curl https://registry.hub.docker.com/v1/repositories/python/tags| tr -d '[\[\]" ]' | tr '}' '\n'| awk -F: -v image='python' '{if(NR!=NF && $3 != ""){printf("%s:%s\n",image,$3)}}'
    python:3.9.8
    python:3.9.8-alpine
    python:3.9.8-alpine3.13
    python:3.9.8-alpine3.14
    python:3.9.8-bullseye
    python:3.9.8-buster
    python:3.9.8-slim
    python:3.9.8-slim-bullseye
    python:3.9.8-slim-buster
    python:3.9.8-windowsservercore
    python:3.9.8-windowsservercore-1809
    python:3.9.8-windowsservercore-ltsc2016
    python:3.9.8-windowsservercore-ltsc2022
    ...
    

镜像仓库常用命令:

  • 登陆: docker login [OPTIONS] [SERVER] #若未指定 SERVER,则默认连接 Daemon 指定的服务器

  • 退出: docker logout [SERVER]

5.1.1 官方 docker Hub

Docker Hub ( http://hub.docker.com ) 是缺省的官方仓库。pull 拉取镜像默认是从官仓拉取的。

登陆 docker Hub, 推送镜像,配置文件 ~/.docker/config.json

$ cat ~/.docker/config.json
{
        "auths": {
                "https://index.docker.io/v1/": {
                        "auth": "a2VlZmV3dTp3cWYzNjN3cWYzNjM=",
                        "email": ""
                }
        },
        "HttpHeaders": {
                "User-Agent": "Docker-Client/18.03.0-ce (windows)"
        }
}

$ docker login
$ docker push [image:tag]

5.1.2 私有 Registry2

docker 官方开源的私有镜像仓库 registry,分为二个版本。

  • registry1:python 语言开发,要求 docker1.6 以下版本。
  • registry2:即 docker distribution,go 语言开发,更加安全和快速。要求 docker 版本高于 1.6。harbor 是基于 registry2 开发的。

Registry 2 不包含界面、用户管理、权限控制等功能,如果想使用这些功能,可使用 Docker Trusted Registry 或者 企业级镜像仓库 harbor。

docker 配置文件 daemon.json 里增加私仓

{
  "insecure-registries": [
    "http://localhost:5000",
  ]
}

服务启动:

$ docker run -d -p 5000:5000 --restart=always --name registry2 registry:2

修改 tag,如果 tag 前不加 host:port/,缺省将推送到官仓相应的镜像里(如果有权限)

$ docker tag [old_image:tag] [localhost:5000/new_image:tag]
$ docker push [localhost:5000/new_image:tag]

5.1.3 企业级 Harbor

开源项目地址: https://github.com/goharbor/harbor/releases

VMware 开源的企业级 Registry 项目 Harbor,以 Docker 公司开源的 registry 为基础,提供了管理 UI, 基于角色的访问控制(Role Based Access Control),AD/LDAP 集成、以及审计日志(Audit logging) 等企业用户需求的功能,同时还原生支持中文,主要特点:

  • 基于角色的访问控制 - 用户与 Docker 镜像仓库通过“项目”进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。

  • 镜像复制 - 镜像可以在多个 Registry 实例中复制(同步)。尤其适合于负载均衡,高可用,混合云和多云的场景。

  • 图形化用户界面 - 用户可以通过浏览器来浏览,检索当前 Docker 镜像仓库,管理项目和命名空间。

  • AD/LDAP 支持 - Harbor 可以集成企业内部已有的 AD/LDAP,用于鉴权认证管理。

  • 审计管理 - 所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。

  • 国际化 - 已拥有英文、中文、德文、日文和俄文的本地化版本。更多的语言将会添加进来。

  • RESTful API - RESTful API 提供给管理员对于 Harbor 更多的操控,使得与其它管理软件集成变得更容易。

  • 部署简单 - 提供在线和离线两种安装工具, 也可以安装到 vSphere 平台(OVA 方式) 虚拟设备

1)下载安装

[root@otrs004097 opt]# wget https://storage.googleapis.com/harbor-releases/release-1.8.0/harbor-offline-installer-v1.8.2.tgz
[root@otrs004097 opt]# tar xf harbor-offline-installer-v1.8.2.tgz
[root@otrs004097 opt]# cd harbor/
[root@otrs004097 harbor]# ls
harbor.v1.8.2.tar.gz harbor.yml install.sh LICENSE prepare

2) 配置文件 harbor.yml

可根据实际情况修改 hostname, port, harbor_admin_password, database.password,

必须参数

  • hostname: 目标主机的主机名。它应该是目标计算机的 IP 地址或完全限定的域名(FQDN),例如:172.16.1.30 或 reg.yourdomain.com 。不要使用 localhost 或 127.0.0.1 作为主机名。

  • data_volume: Harbor 数据的存储位置

  • harbor_admin_password: 管理员的初始密码。此密码仅在 Harbor 首次启动时生效。请注意,默认用户 名/密码为 admin / Harbor12345

  • database: 与本地数据库相关的配置。

  • password: 默认数据库密码为 root123,应该改为一个安全的生产环境密码。

可选参数

  • port: https 的端口号。

  • certificate: SSL 证书的路径,仅在协议设置为 https 时应用。

  • private_key: SSL 密钥的路径,仅在协议设置为 https 时应用。

# The IP address or hostname to access admin UI and registry service.
# DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.
hostname: 121.36.106.72

# http related config: 如果修改了 port,也要同步修改 docker-compose.yml 相应内容
http:
  # port for http, default is 80. If https enabled, this port will redirect to https port
  port: 1180

# https related config
# https:
#   # https port for harbor, default is 443
#   port: 443
#   # The path of cert and key files for nginx
#   certificate: /your/certificate/path
#   private_key: /your/private/key/path

# Uncomment external_url if you want to enable external proxy
# And when it enabled the hostname will no longer used
# external_url: https://reg.mydomain.com:8433

# The initial password of Harbor admin
# It only works in first time to install harbor
# Remember Change the admin password from UI after launching Harbor.
harbor_admin_password: xxxx

# Harbor DB configuration
database:
  # The password for the root user of Harbor DB. Change this before any production use.
  password: xxxx

# The default data volume
data_volume: /data

# Harbor Storage settings by default is using /data dir on local filesystem
# Uncomment storage_service setting If you want to using external storage
# storage_service:
#   # ca_bundle is the path to the custom root ca certificate, which will be injected into the truststore
#   # of registry's and chart repository's containers.  This is usually needed when the user hosts a internal storage with self signed certificate.
#   ca_bundle:

#   # storage backend, default is filesystem, options include filesystem, azure, gcs, s3, swift and oss
#   # for more info about this configuration please refer https://docs.docker.com/registry/configuration/
#   filesystem:
#     maxthreads: 100
#   # set disable to true when you want to disable registry redirect
#   redirect:
#     disabled: false

# Clair configuration
clair:
  # The interval of clair updaters, the unit is hour, set to 0 to disable the updaters.
  updaters_interval: 12

  # Config http proxy for Clair, e.g. http://my.proxy.com:3128
  # Clair doesn't need to connect to harbor internal components via http proxy.
  http_proxy:
  https_proxy:
  no_proxy: 127.0.0.1,localhost,core,registry

jobservice:
  # Maximum number of job workers in job service
  max_job_workers: 10

chart:
  # Change the value of absolute_url to enabled can enable absolute url in chart
  absolute_url: disabled

# Log configurations
log:
  # options are debug, info, warning, error, fatal
  level: info
  # Log files are rotated log_rotate_count times before being removed. If count is 0, old versions are removed rather than rotated.
  rotate_count: 50
  # Log files are rotated only if they grow bigger than log_rotate_size bytes. If size is followed by k, the size is assumed to be in kilobytes.
  # If the M is used, the size is in megabytes, and if G is used, the size is in gigabytes. So size 100, size 100k, size 100M and size 100G
  # are all valid.
  rotate_size: 200M
  # The directory on your host that store log
  location: /var/log/harbor

#This attribute is for migrator to detect the version of the .cfg file, DO NOT MODIFY!
_version: 1.8.0

# Uncomment external_database if using external database.
# external_database:
#   harbor:
#     host: harbor_db_host
#     port: harbor_db_port
#     db_name: harbor_db_name
#     username: harbor_db_username
#     password: harbor_db_password
#     ssl_mode: disable
#   clair:
#     host: clair_db_host
#     port: clair_db_port
#     db_name: clair_db_name
#     username: clair_db_username
#     password: clair_db_password
#     ssl_mode: disable
#   notary_signer:
#     host: notary_signer_db_host
#     port: notary_signer_db_port
#     db_name: notary_signer_db_name
#     username: notary_signer_db_username
#     password: notary_signer_db_password
#     ssl_mode: disable
#   notary_server:
#     host: notary_server_db_host
#     port: notary_server_db_port
#     db_name: notary_server_db_name
#     username: notary_server_db_username
#     password: notary_server_db_password
#     ssl_mode: disable

# Uncomment external_redis if using external Redis server
# external_redis:
#   host: redis
#   port: 6379
#   password:
#   # db_index 0 is for core, it's unchangeable
#   registry_db_index: 1
#   jobservice_db_index: 2
#   chartmuseum_db_index: 3

# Uncomment uaa for trusting the certificate of uaa instance that is hosted via self-signed cert.
# uaa:
#   ca_file: /path/to/ca

3)运行安装脚本

[root@registory harbor]# ./install.sh

4)使用 ADMIN 账号登陆

5)Harbor 服务操作

如果想要停止,或者是服务器重启了,需要手动重启,在 harbor 的安装目录,里执行命令

$ docker-compose stop|start|restart

技术原理

Harbor 由 6 个大的模块所组成:

  • Proxy : Harbor 的 registry、UI、token services 等组件,都处在一个反向代理后边。该代理将来自浏览器、docker clients 的请求转发到后端服务上。

  • Registry : 负责存储 Docker 镜像,以及处理 Docker push/pull 请求。因为 Harbor 强制要求对镜像的访问做权限控制, 在每一次 push/pull 请求时,Registry 会强制要求客户端从 token service 那里获得一个有效的 token。

  • Core services : Harbor 的核心功能,主要包括如下 3 个服务:

    • UI: 作为 Registry Webhook, 以图像用户界面的方式辅助用户管理镜像。

    • WebHook:WebHook 是在 registry 中配置的一种机制, 当 registry 中镜像发生改变时,就可以通知到 Harbor 的 webhook endpoint。Harbor 使用 webhook 来更新日志、初始化同步 job 等。

    • Token 服务:负责根据用户权限给每个 docker push/pull 命令签发 token. Docker 客户端向 Regiøstry 服务发起的请求,如果不包含 token,会被重定向到这里,获得 token 后再重新向 Registry 进行请求。

  • Database :为 core services 提供数据库服务,负责储存用户权限、审计日志、Docker image 分组信息等数据。

  • Job services : 主要用于镜像复制,本地镜像可以被同步到远程 Harbor 实例上。

  • Log collector : 负责收集其他组件的日志到一个地方

这里我们与上面运行的 7 个容器对比,对 harbor-adminserver 感觉有些疑虑。其实这里 harbor-adminserver 主要是作为一个后端的配置数据管理,并没有太多的其他功能。 harbor-ui 所要操作的所有数据都通过 harbor-adminserver 这样一个数据配置管理中心来完成。

harbor 运行时有 7 个容器: nginxharbor-jobserviceharbor-uiharbor-dbharbor-adminserverregistry 以及 harbor-log

Harbor 的每一个组件都被包装成一个 docker 容器。自然,Harbor 是通过 docker compose 来部署的。在 Harbor 源代码 的 make 目录下的 docker-compose 模板会被用于部署 Harbor。打开该模板文件,可以看到 Harbor 由 7 个容器组件所组成:

  • proxy : 通过 nginx 服务器来做反向代理
  • registry : docker 官方发布的一个仓库镜像组件
  • ui : 整个架构的核心服务。该容器是 Harbor 工程的主要部分
  • adminserver : 作为 Harbor 工程的配置数据管理器使用
  • mysql : 通过官方 Mysql 镜像创建的数据库容器
  • job services : 通过状态机的形式将镜像复制到远程 Harbor 实例。镜像删除同样也可以被同步到远程 Harbor 实例中。
  • log : 运行 rsyslogd 的容器,主要用于收集其他容器的日志

这些容器之间都通过 Docker 内的 DNS 服务发现来连接通信。通过这种方式,每一个容器都可以通过相应的容器来进行访问。对于终端用户来说,只有反向代理(Nginx) 服务的端口需要对外暴露。

Harbor 由 6 个大的模块所组成:

  • Proxy : Harbor 的 registry、UI、token services 等组件,都处在一个反向代理后边。该代理将来自浏览器、docker clients 的请求转发到后端服务上。

  • Registry : 负责存储 Docker 镜像,以及处理 Docker push/pull 请求。因为 Harbor 强制要求对镜像的访问做权限控制, 在每一次 push/pull 请求时,Registry 会强制要求客户端从 token service 那里获得一个有效的 token。

  • Core services : Harbor 的核心功能,主要包括如下 3 个服务:

    • UI: 作为 Registry Webhook, 以图像用户界面的方式辅助用户管理镜像。

    • WebHook:WebHook 是在 registry 中配置的一种机制, 当 registry 中镜像发生改变时,就可以通知到 Harbor 的 webhook endpoint。Harbor 使用 webhook 来更新日志、初始化同步 job 等。

    • Token 服务:负责根据用户权限给每个 docker push/pull 命令签发 token. Docker 客户端向 Regiøstry 服务发起的请求,如果不包含 token,会被重定向到这里,获得 token 后再重新向 Registry 进行请求。

  • Database :为 core services 提供数据库服务,负责储存用户权限、审计日志、Docker image 分组信息等数据。

  • Job services : 主要用于镜像复制,本地镜像可以被同步到远程 Harbor 实例上。

  • Log collector : 负责收集其他组件的日志到一个地方

这里我们与上面运行的 7 个容器对比,对 harbor-adminserver 感觉有些疑虑。其实这里 harbor-adminserver 主要是作为一个后端的配置数据管理,并没有太多的其他功能。 harbor-ui 所要操作的所有数据都通过 harbor-adminserver 这样一个数据配置管理中心来完成。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文