docker仓库管理

本文最后更新于:2023年12月5日 晚上

docker 仓库分为公有云仓库 和 私有云仓库

公有云仓库:

  • 官方
  • 阿里云等第三方仓库,推荐

私有云仓库:

  • docker registory
  • docker harbor,推荐

阿里云 docker 仓库

  1. 访问凭证
  2. 命名空间
  3. 镜像仓库

范例:

# 1. 浏览器的登录阿里云,创建命名空间107,镜像仓库可以创建也可以不创建,如果不创建,push的时候会自动创建
# 2. 登录阿里云,交互式,密码存储在~/.docker/config.json
docker login --username=1076956365@qq.com registry.cn-beijing.aliyuncs.com
# 3. 给镜像打标签,注意格式
docker tag nginx:1.22.1 registry.cn-beijing.aliyuncs.com/lujk/nginx:1.22.1
# 4. 上传到阿里云的docker镜像仓库
docker push registry.cn-beijing.aliyuncs.com/lujk/nginx:1.22.1
# 5. 刷新网站页面,如果没有看到镜像,可能是区域设置不对
# 6. 其他机器下载镜像
docker pull registry.cn-beijing.aliyuncs.com/lujk/nginx:1.22.1

私有云单机仓库 Docker Registry

官方文档:https://docs.docker.com/registry/

部署文档:https://github.com/docker/docs/blob/main/registry/deploying.md

https://blog.csdn.net/weixin_41605937/article/details/122367707

服务端

1. 生成证书

一路回车就可以

openssl req -new -x509 -days 3650 -nodes -out ./ssl/certs/reg.cntv.local.crt -keyout ./ssl/private/reg.cntv.local.key

2.创建授权的 registry 用户和密码

# 1. 创建授权用户密码使用目录
root@lujinkai-pc:~$ mkdir -p /etc/docker/auth

# 2. 创建registry用户,用于上传和下载镜像
[root@484288 ~]$ htpasswd -Bbn ops 123456. > /etc/docker/auth/registry

[root@484288 ~]$ cat /etc/docker/auth/registry
ops:$2y$05$zvMWW6tjQriMEKNinHyL.uPsvSYfR9iYWROMAvwrA7AfRy1K0SUTC

创建用户还可以使用如下命令:

$ docker run \
  --entrypoint htpasswd \
  registry:2 -Bbn ops 123456. > /etc/docker/auth/registry

3. 启动容器

# 指定443端口
$ docker run -d \
      --name registry \
      -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
      -p 443:443 \
      registry:2

# 或者:默认的5000端口
$ docker run -d   \
    -p 5000:5000   \
    --restart=always   \
    --name registry   \
    -v "$(pwd)"/ssl:/ssl   \
    -e REGISTRY_HTTP_TLS_CERTIFICATE=/ssl/certs/reg.cntv.local.crt   \
    -e REGISTRY_HTTP_TLS_KEY=/ssl/private/reg.cntv.local.key   \
    -v /etc/docker/auth:/auth \
    -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
    -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/registry \
    -e "REGISTRY_AUTH=htpasswd" \
    -v /data/registry:/var/lib/registry \
    registry:2

api:

Path:        "/v2/",
Path:        "/v2/{name:" + reference.NameRegexp.String() + "}/tags/list",
Path:        "/v2/{name:" + reference.NameRegexp.String() + "}/manifests/{reference:" + reference.TagRegexp.String() + "|" + digest.DigestRegexp.String() + "}",
Path:        "/v2/{name:" + reference.NameRegexp.String() + "}/blobs/{digest:" + digest.DigestRegexp.String() + "}",
Path:        "/v2/{name:" + reference.NameRegexp.String() + "}/blobs/uploads/",
Path:        "/v2/{name:" + reference.NameRegexp.String() + "}/blobs/uploads/{uuid:[a-zA-Z0-9-_.=]+}",
Path:        "/v2/_catalog",

查询、删除镜像:

#查询镜像
curl  <仓库地址>/v2/_catalog

#查询镜像tag(版本)
curl  <仓库地址>/v2/<镜像名>/tags/list

#删除镜像API
curl -I -X DELETE "<仓库地址>/v2/<镜像名>/manifests/<镜像digest_hash>"

#获取镜像digest_hash
curl  <仓库地址>/v2/<镜像名>/manifests/<tag> \
    --header "Accept: application/vnd.docker.distribution.manifest.v2+json"

客户端

1. 添加 hosts

$ cat /etc/hosts
...
192.168.117.138 reg.cntv.local

2. 修改 daemon.json 并重启 docker

# 将https://reg.cntv.local添加到insecure-registries
$ cat /etc/docker/daemon.json
{
  "registry-mirrors": ["https://3417nt4m.mirror.aliyuncs.com"],
  "insecure-registries": ["https://reg.cntv.local:5000"]
}

注意:修改 daemon.json 后需要重启 docker.service

3. 登陆

docker login -u ops -p 123456. reg.cntv.local:5000

4. 上传&下载

# 上传
$ docker image tag alpine:3.17 reg.cntv.local:5000/alpine:3.17
$ docker push reg.cntv.local:5000/alpine:3.17

# 下载
$ docker pull reg.cntv.local:5000/alpine:3.17

Docker 之分布式仓库 Harbor

harbor 功能介绍:

  • 基于角色的访问控制
  • 镜像复制
  • 图形化用户界面
  • 审计管理
  • 国际化
  • resful api
  • 部署简单

harbor 组成:

harbor 是由很多容器组成实现完整功能

  • proxy:对应启动组件 nginx。它是一个 nginx 反向代理,代理 notary client(镜像认证)、docker client(镜像上传下载等)和浏览器的访问请求(core service)给后端的各服务
  • UI(Core Service):对应启动组件 harbor-ui。底层数据存储使用 mysql 数据库,主要提供了四个子功能:
    • UI:一个 web 管理页面 ui
    • API:Harbor 暴露的 API 服务
    • Auth:用户认证服务,decode 后的 token 中的用户信息在这里进行认证;auth 后端可以接 db、ldap、uaa 三种认证实现
    • Token 服务(上图中未体现):负责根据用户在每个 project 中的 role 来为每一个 docker push/pull 命令发布一个 token,如果从 docker client 发送给 registry 的请求没有带 token,registry 会重定向请求到 token 服务创建 token
  • registry:对应启动组件 registry。负责存储镜像文件,和处理镜像的 pull/push 命令。Harbor 对镜像进行强制的访问控制,Registry 会将客户端的每个 pull、push 请求转发到 token 服务来获取有效的 token
  • admin service:对应启动组件 harbor-adminserver。是系统的配置管理中心附带检查存储用量,ui 和 jobserver 启动时候需要加载 adminserver 的配置
  • job service:对应启动组件 harbor-jobservice。负责镜像复制工作的,他和 registry 通信,从一个 registry pull 镜像然后 push 到另一个 registry,并记录 job_log
  • log collector:对应启动组件 harbor-log。日志汇总组件,通过 docker 的 log-driver 把日志汇总到一起
  • db:对应启动组件 harbor-db,负责存储 project、 user、 role、replication、image_scan、access 等的 metadata 数据

配置 harbor 仓库

两台 harbor 服务器 10.0.0.118 和 10.0.0.119 均按照以下步骤配置:

  1. 安装 docker
  2. 安装 docker compose,docker compose 必须先于 harbor 安装,否则会报错
  3. 下载 Harbor 安装包并解压缩
  4. 编辑配置文件 harbor.yml,旧版本是 harbor.cfg
  5. 运行 harbor 安装脚本
  6. 实现开机自动启动 harbor
  7. 登录 harbor 主机网站
  8. 建立项目
  9. 修改 harbor 配置
# 1. 安装docker
$ sudo apt-get update
$ sudo apt-get -y install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
$ curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository \
    "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
    $(lsb_release -cs) \
    stable"
$ sudo apt-get update
$ sudo apt -y install docker-ce

# 以上是直接安装最新版本,推荐安装时指定版本
$ apt-cache madison docker-ce
$ sudo apt -y install docker-ce=<VERSION_STRING>
# 2. 安装docker compose
root@u1:~# apt -y install python3-pip # 为了方便,直接安装pip
root@u1:~# pip3 install docker-compose
root@u1:~# docker-compose --version
docker-compose version 1.27.4, build unknown
# 3. 下载Harbor安装包并解压缩
# 可以下载在线安装包或者完整的离线安装包,推荐下载离线包
# 下载网址:https://github.com/goharbor/harbor/releases
# 推荐使用迅雷下载:harbor-offline-installer-v1.10.6.tgz
root@u1:/usr/local/src# tar zxvf harbor-offline-installer-v1.10.6.tgz
root@u1:/usr/local/src# cd harbor/
root@u1:/usr/local/src/harbor# ll
total 700264
drwxr-xr-x 2 root root      4096 Nov 24 13:29 ./
drwxr-xr-x 3 root root      4096 Nov 24 13:29 ../
-rw-r--r-- 1 root root      3398 Nov 17 03:58 common.sh
-rw-r--r-- 1 root root 717021676 Nov 17 03:59 harbor.v1.10.6.tar.gz
-rw-r--r-- 1 root root      5882 Nov 17 03:58 harbor.yml
-rwxr-xr-x 1 root root      2284 Nov 17 03:58 install.sh*
-rw-r--r-- 1 root root     11347 Nov 17 03:58 LICENSE
-rwxr-xr-x 1 root root      1749 Nov 17 03:58 prepare*
# 4. 编辑配置文件 harbor.yml
root@u1:/usr/local/src/harbor# vim harbor.yml
#只需要修改下面两行
hostname: 10.0.0.118 # 修改此行,指向当前主机IP 或 FQDN
harbor_admin_password: 123456 # 修改此行指定harbor登录用户admin的密码

# 不需要https,注释以下内容
# 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
# 5. 运行 harbor 安装脚本
root@u1:/usr/local/src# mv harbor /usr/local/
root@u1:/usr/local/src# cd /usr/local/harbor/
root@u1:/usr/local/src# ./prepare
...
root@u1:/usr/local/src# ./install.sh
...
# 6. 实现开机自动启动 harbor
root@u1:~# vim /lib/systemd/system/harbor.service
[Unit]
Description=Harbor
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service
Documentation=http://github.com/vmware/harbor

[Service]
Type=simple
Restart=on-failure
RestartSec=5
ExecStart=/usr/local/bin/docker-compose -f usr/local/harbor/docker-compose.yml up
ExecStop=/usr/local/bin/docker-compose -f usr/local/harbor/docker-compose.yml down

[Install]
WantedBy=multi-user.target

root@u1:~# systemctl daemon-reload
root@u1:~# systemctl enable --now harbor.service
Created symlink /etc/systemd/system/multi-user.target.wants/harbor.service → /lib/systemd/system/harbor.service.
  1. 登录 harbor 主机网站 http://10.0.0.118

# 9. 修改harbor配置
# 后期如果需要修改harbor配置
1.修改 harbor.yml 文件
2.停止harbor: systemctl stop harbor.service
3.执行prepare
4.启动harbor:sysytemcrl start harbor.service

配置 docker 客户端

客户端 10.0.0.117

  1. 安装 docker
  2. 登录 harbor
  3. 给本地镜像大标签并上传到 harbor
  4. 下载 harbor 的镜像
# 1. 安装docker...
  1. 建立项目

项目可以设置为“公开”,这样不用登陆就可以 pull,但是要想 push 还是得登陆

# 3. 登录harbor.两种方法,命令行或者配置文件
# 方法一:命令行
root@u3:~# vim /usr/lib/systemd/system/docker.service
...
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --insecure-registry 10.0.0.118 --insecure-registry 10.0.0.119
...
# 方法二:配置文件,推荐
root@u3:~# vim /etc/docker/daemon.json
{
        "registry-mirrors": ["https://3417nt4m.mirror.aliyuncs.com"],
        "insecure-registries": ["10.0.0.118", "10.0.0.119"]
}
root@u3:~# systemctl restart docker.service
root@u3:~# docker login 10.0.0.118
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
# 3. 给本地镜像大标签并上传到harbor
# 修改 images 的名称,不修改成指定格式无法将镜像上传到 harbor 仓库
# 格式:Harbor主机IP/项目名/image名字:版本
root@u3:~# docker tag alpine:latest 10.0.0.118/library/alpine-base:3.12
root@u3:~# docker push 10.0.0.118/library/alpine-base:3.12
# 4. 下载harbor的镜像
# 另开一台机器,安装docker,daemon.json设置insecure-registries,就可以直接下载镜像
root@u4:~# docker image pull 10.0.0.118/library/alpine-base:3.12

harbor 高可用

实现 harbor 有两种方式:共享存储 和 镜像复制,这里只学习后者,可以通过 web 界面直接配置镜像复制

前面配置了两台 harbor 仓库,10.0.0.118 和 10.0.0.119,但是只使用了一台,这里使用另一台组成双向复制

注意:不是主从,而是双向复制,通过负载均衡器将请求分流

h1:10.0.0.118
h2:10.0.0.119

  1. 确保 h1 和 h2 中有相同的项目

  2. h1 和 h2 均新建仓库,目标分别为对方

    复制模式选择 push-based

  3. h1 和 h2 均新建复制,目标分别为对方

  4. 测试,分别在 h1 和 h2 上传(注意上传前先登录 harbor)然后删除,都能同步成功

harbor 配置 https

harbor 默认使用 http,可以配置 https,不过我认为没有这个必要

在前面配置好 harbor 仓库的基础上,执行以下操作:

  1. 配置服务端

    root@u1:~# mkdir -p /root/.rnd
    root@u1:~# mkdir -p /usr/local/harbor/certs
    root@u1:~# cd /usr/local/harbor/certs
    root@u1:/usr/local/harbor/certs# ls
    # 创建私有CA
    root@u1:/usr/local/harbor/certs# openssl req -newkey rsa:1024 -nodes -sha256 -keyout ca.key -x509 -subj "/CN=ca.ljk.org" -days 3650 -out ca.crt
    Generating a RSA private key
    ..............+++++
    ...................................+++++
    writing new private key to 'ca.key'
    -----
    root@u1:/usr/local/harbor/certs# ls
    ca.crt  ca.key
    # 生成harbor主机的证书申请
    root@u1:/usr/local/harbor/certs# openssl req -newkey rsa:1024 -nodes -sha256 -subj "/CN=harbor.ljk.org" -keyout harbor.ljk.org.key -out harbor.ljk.org.csr
    Generating a RSA private key
    .....................................................................+++++
    ..........+++++
    writing new private key to 'harbor.ljk.org.key'
    -----
    root@u1:/usr/local/harbor/certs# ls
    ca.crt  ca.key  harbor.ljk.org.csr  harbor.ljk.org.key
    # 给harbor主机颁发证书
    root@u1:/usr/local/harbor/certs# openssl x509 -req -in harbor.ljk.org.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out harbor.ljk.org.crt
    Signature ok
    subject=CN = harbor.ljk.org
    Getting CA Private Key
    root@u1:/usr/local/harbor/certs# tree
    .
    ├── ca.crt
    ├── ca.key
    ├── ca.srl
    ├── harbor.ljk.org.crt
    ├── harbor.ljk.org.csr
    └── harbor.ljk.org.key
    
    0 directories, 6 files
    root@u1:/usr/local/harbor/certs# vim ../harbor.yml
    hostname: harbor.ljk.org # 此行需改为域名
    https:
      # https port for harbor, default is 443
      port: 443
      # The path of cert and key files for nginx
      certificate: /usr/local/harbor/certs/harbor.ljk.org.crt
      private_key: /usr/local/harbor/certs/harbor.ljk.org.key
    ...
    root@u1:/usr/local/harbor/certs# cd ..
    root@u1:/usr/local/harbor# systemctl stop harbor.service  # 这一步要等挺久
    root@u1:/usr/local/harbor# ./prepare
    root@u1:/usr/local/harbor# ./install.sh
    root@u1:/usr/local/harbor# systemctl start harbor.service

    访问:https://10.0.0.118

  2. 配置客户端

    root@u3:~# echo '10.0.0.118 harbor.ljk.org' >> /etc/hosts
    
    # 因为是自建证书,所以harbor规定,客户端也下载一份,位于/etc/docker/certs.d/harbor.ljk.org
    # 其实,只需要harbor.ljk.org.crt即可,这里为了方便,全部拷贝过来
    root@u3:~# scp lujinkai@harbor.ljk.org:/usr/local/harbor/certs/* /etc/docker/certs.d/harbor.ljk.org/
    
    # 登录成功
    root@u3:~# docker login harbor.ljk.org
    
    # 上传镜像
    root@u3:~# docker image push harbor.ljk.org/library/alpine:v1

docker仓库管理
http://blog.lujinkai.cn/运维/Docker/5.docker仓库管理/
作者
像方便面一样的男子
发布于
2021年1月8日
更新于
2023年12月5日
许可协议