任务目标

  1. 完成docker镜像仓库的搭建

任务平台

  1. 物理设备—
  2. 操作系统:openEuler 22.03 LTS SP2

部署指南

任务一:环境需求

  1. 硬件配置

下图列出了部署 Harbor 的最低硬件配置和推荐的硬件配置。

  1. 网络端口

Harbor 要求在目标主机上打开以下端口

端口 协议 备注
443 HTTPS Harbor 门户和核心 API 接受此端口上的 HTTPS 请求
4443 HTTPS 连接到适用于 Harbor 的 Docker 内容信任服务
80 HTTP Harbor 门户和核心 API 接受此端口上的 HTTP 请求

任务二:基础环境准备

任务三:部署

  1. 下载Harbor

1
2
3
wget https://github.com/goharbor/harbor/releases/download/v2.9.1/harbor-offline-installer-v2.9.1.tgz
#解压
tar -vzxf harbor-offline-installer-v2.9.1.tgz
  1. 安装https证书

    1. 简单版
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #创建证书目录,并赋予权限
    mkdir -p /data/cert/
    chmod -R 777 /data/cert/
    cd /data/cert
    #创建私钥
    openssl genrsa -des3 -out harbor.key 2048
    #生成ca证书,ip为本机ip
    openssl req -sha512 -new \
    -subj "/C=CN/ST=hennan/L=zhengzhou/O=qishi/OU=qishi/CN=images.store.net.crt" \
    -key harbor.key \
    -out harbor.csr
    #备份证书
    cp harbor.key harbor.key.org
    #转化为不带密码的私钥
    openssl rsa -in harbor.key.org -out harbor.key
    #使用证书进行签名
    openssl x509 -req -days 100000 -in harbor.csr -signkey harbor.key -out harbor.crt
    1. 官方版
      1
      2
      3
      #创建存放目录
      mkdir -p /data/harbor-ca
      cd /data/harbor-ca
      • 生成证书颁发机构证书
      1. 生成 CA 证书私钥
      1
      openssl genrsa -out ca.key 4096
      1. 生成 CA 证书
      1
      2
      3
      4
      5
      #CN后的内容为ip或者域名
      openssl req -x509 -new -nodes -sha512 -days 3650 \
      -subj "/C=CN/ST=henan/L=zhengzhou/O=qishi/OU=qishi/CN=hub-docker.xxx.net" \
      -key ca.key \
      -out ca.crt
      • 生成服务器证书
      1. 生成私钥
      1
      2
      #域名或ip命名
      openssl genrsa -out hub-docker.xxx.net.key 4096
      1. 生成证书签名请求 (CSR)
      1
      2
      3
      4
      openssl req -sha512 -new \
      -subj "/C=CN/ST=henan/L=zhengzhou/O=qishi/OU=qishi/CN=hub-docker.xxx.net" \
      -key hub-docker.xxx.net.key \
      -out hub-docker.xxx.net.csr
      1. 生成 x509 v3 扩展文件
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      cat > v3.ext <<-EOF
      authorityKeyIdentifier=keyid,issuer
      basicConstraints=CA:FALSE
      keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
      extendedKeyUsage = serverAuth
      subjectAltName = @alt_names

      [alt_names]
      DNS.1=hub-docker.xxx.net
      DNS.2=hub-docker.xxx
      DNS.3=hub-docker
      EOF
      1. 使用v3.ext生成证书
      1
      2
      3
      4
      5
      openssl x509 -req -sha512 -days 3650 \
      -extfile v3.ext \
      -CA ca.crt -CAkey ca.key -CAcreateserial \
      -in hub-docker.xxx.net.csr \
      -out hub-docker.xxx.net.crt
      • 向 Harbor 和 Docker 提供证书

        • 将服务器证书和密钥复制到存放 harbor使用证书的目录

          1
          2
          3
          4
          5
          #创建存放harbor使用证书的目录
          mkdir -p /data/cert/
          #拷贝证书
          cp hub-docker.xxx.net.crt /data/cert/
          cp hub-docker.xxx.net.key /data/cert/
        • 转换证书,供docker使用

          1
          2
          3
          4
          5
          6
          7
          8
          9
          openssl x509 -inform PEM -in hub-docker.xxx.net.crt -out hub-docker.xxx.net.cert
          #创建存放docker使用证书目录,命名方式为ip:端口,或者域名
          mkdir -p /etc/docker/certs.d/hub-docker.xxx.net/
          #拷贝证书
          cp hub-docker.xxx.net.cert /etc/docker/certs.d/hub-docker.xxx.net/
          cp hub-docker.xxx.net.key /etc/docker/certs.d/hub-docker.xxx.net/
          cp ca.crt /etc/docker/certs.d/hub-docker.xxx.net/
          #重启docker
          systemctl restart docker
  1. 安装Harbor

修改配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
cp harbor.yml.tmpl harbor.yml
vi harbor.yml
#################################
hostname: hub-docker.xxx.net #修改为本机ip,或者自定义域名
http:
port: 80 #端口可自定义
https:
port: 443 #端口可自定义
certificate: /data/harbor/harbor-ca/hub-docker.xxx.net.crt #证书路径
private_key: /data/harbor/harbor-ca/hub-docker.xxx.net.key #私钥路径
harbor_admin_password: Harbor12345 #登录密码
data_volume: /data/harbor-data #数据存储目录
#################################

执行安装

1
./install.sh  --with-trivy

浏览器输入ip加端口访问(添加hosts后,域名访问)

任务四:设置docker login 登录凭证加密(要拉取镜像的主机)

  1. 安装pass
1
2
3
4
5
6
7
8
9
10
11
 #基础环境
yum install -y make
#获取pass源码
wget https://git.zx2c4.com/password-store/snapshot/password-store-1.7.4.tar.xz
#解压到/usr/local/目录
tar Jxf password-store-1.7.4.tar.xz -C /usr/local/
#执行安装
cd /usr/local/password-store-1.7.4
make install
#验证
pass version
  1. 安装docker-credential-helpers
1
2
3
4
5
6
7
8
9
10
11
#安装go基础环境
yum -y install golang-1.17.3
#获取docker-credential-helpers源码
wget https://github.com/docker/docker-credential-helpers/archive/refs/tags/v0.8.0.tar.gz
tar -xf v0.8.0.tar.gz
mv docker-credential-helpers-0.8.0 docker-credential-helpers
cd docker-credential-helpers/
#使用pass方式安装
make pass
cp bin/build/docker-credential-pass /usr/bin/
chmod +x /usr/bin/docker-credential-pass
  1. 修改密码配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#生成密钥对
gpg --full-generate-key
#查看密钥
gpg --list-keys
##################################################
/root/.gnupg/pubring.kbx
------------------------
pub rsa3072 2023-11-30 [SC] [有效至:2025-11-29]
56CCF64EC289B13B1C0F14CCF2BB16136358AEA4
uid [ 绝对 ] qishi <qishi@qq.com>
sub rsa3072 2023-11-30 [E] [有效至:2025-11-29]
##################################################
#初始化
pass init 56CCF64EC289B13B1C0F14CCF2BB16136358AEA4

#登录docker仓库,查看登录凭证是否加密
docker login hub-docker.xxx.net
cat /root/.docker/config.json
#######################################
{
"auths": {
"hub-docker.xxx.net": {}
},
"credsStore": "pass"
}
#######################################

#创建密码本保存文件目录
pass insert docker-credential-helpers/docker-pass-initialized-check
#查看密码本列表
docker-credential-pass list
#验证密码本
yum install tree -y
pass
#以实际路径为准
pass show docker-credential-helpers/aW1hZ2VzLnN0b3JlLm5ldA==/admin

任务五:上传下载镜像(要拉取镜像的主机)

在需要拉取和上传镜像的主机上,修改daemon.json文件,再重启docker

1
2
3
4
5
6
vi /etc/docker/daemon.json
{
"insecure-registries": ["hub-docker.xxx.net"] #ip或者域名
}

systemctl restart docker

拉取和上传镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#拉取nginx镜像做测试
docker pull nginx
#重新打上标签,其中test为harbor中存在的项目
docker tag nginx:latest 172.20.1.55/test/nginx-test:1.0
docker tag nginx:latest hub-docker.xxx.net/test/nginx-test:1.0
#登录仓库,输入用户名和密码
docker login 172.20.1.55
docker login hub-docker.xxx.net
systemctl restart docker
#将镜像推送到仓库
docker push 172.20.1.55/test/nginx-test:1.0
docker push hub-docker.xxx.net/test/nginx-test:1.0
#拉取镜像
docker pull 172.20.1.55/test/nginx-test:1.0
docker pull hub-docker.xxx.net/test/nginx-test:1.0

任务六:cosign签名镜像(要拉取镜像的主机)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mkdir -p /data/cosign
#下载,安装cosign
wget https://github.com/sigstore/cosign/releases/download/v2.2.2/cosign-2.2.2-1.x86_64.rpm
rpm -ivh cosign-2.2.2-1.x86_64.rpm
#arm
wget https://github.com/sigstore/cosign/releases/download/v2.2.2/cosign-2.2.2-1.aarch64.rpm
rpm -ivh cosign-2.2.2-1.aarch64.rpm
#验证安装
cosign version
#生成密钥
cosign generate-key-pair
#对镜像进行加密签名
cosign sign --allow-insecure-registry --key /data/cosign/cosign.key images.store.net/test/test-nginx:1.0.0

#解密验证
cosign verify --allow-insecure-registry --key /data/cosign/cosign.pub images.store.net/test/test-nginx:1.0.0