Harbor仓库构建

2024-07-26

目录

主机硬件配置说明

主机名 IP 角色 CPU 内存 系统
master01 223.193.36.152 master,etcd 8C 32G CentOS 7
master02 223.193.36.155 master,etcd 8C 32G CentOS 7
node01 223.193.36.179 worker 8C 32G CentOS 7
node02 223.193.36.182 worker 8C 32G CentOS 7
harbor 223.193.36.117 repository 8C 32G CentOS 7

安装包地址

docker安装

卸载旧版本

# 1. 卸载之前安装的组件
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

设置存储库

# 1.安装yum-utils
sudo yum install -y yum-utils

# 2.设置稳定的存储库
sudo yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 下面是官网的, 上面使用阿里云的 国内比较快
#    https://download.docker.com/linux/centos/docker-ce.repo

安装最新版本的Docker引擎和容器

# 1. 直接安装最新docker版本
sudo yum -y install docker-ce docker-ce-cli containerd.io

# 2. 安装完成后查看版本
docker -v

安装指定版本

# 如果想安装不同版本
# 1.列出可用版本
yum list docker-ce --showduplicates | sort -r

# 2.安装指定版本
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
如:
sudo yum install docker-ce-18.09.1 docker-ce-cli-18.09.1 containerd.io

启动docker

# 启动docker
systemctl start docker

# 停止docker
systemctl stop docker

# 重启
systemctl restart docker

# 查看状态
systemctl status docker

# 设置开机自启动
systemctl enable docker

# 查看信息
docker info

# 查看帮助文档
docker --help

卸载docker(如需要)

# 1.卸载 Docker 引擎、CLI 和容器包
sudo yum remove docker-ce docker-ce-cli containerd.io

# 2.主机上的图像、容器、卷或自定义配置文件不会自动删除。要删除所有图像、容器和卷
sudo rm -rf /var/lib/docker

# 3.必须手动删除任何编辑的配置文件。

生成证书

参考链接 官方文档

默认情况下,Harbor不附带证书。可以在没有安全性的情况下部署Harbor,以便您可以通过HTTP连接到它。但是,只有在没有外部网络连接的测试或开发环境中,才可以使用HTTP。在外网暴露环境中使用HTTP会使您遭受中间人攻击。在生产环境中,请始终使用HTTPS。如果启用Content Trust with Notary来正确签名所有镜像,则必须使用HTTPS。

要配置HTTPS,必须创建SSL证书。您可以使用由受信任的第三方CA签名的证书,也可以使用自签名证书。本节介绍如何使用OpenSSL创建CA,以及如何使用CA签署服务器证书和客户端证书。您可以使用其他CA提供程序,例如Let’s Encrypt。

以下过程假定您的Harbor注册表的主机名是harbor.ifzzh.com,并且其DNS记录指向您在其上运行Harbor的主机。

生成证书颁发机构证书

在生产您应该从CA获得证书。在测试或开发环境中,您可以生成自己的CA。

生成CA证书私钥

# 创建目录保存证书(可选)
mkdir -p /root/harbor/ssl
cd /root/harbor/ssl

openssl genrsa -out ca.key 4096

生成CA证书

调整-subj选项中的值以反映您的组织。如果使用FQDN连接Harbor主机,则必须将其指定为通用名称(CN)属性。

openssl req -x509 -new -nodes -sha512 -days 3650 \
 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.ifzzh.com" \
 -key ca.key \
 -out ca.crt

生成服务器证书

证书通常包含一个.crt文件和一个.key文件,例如harbor.ifzzh.com.crt和harbor.ifzzh.com.key。

生成私钥

openssl genrsa -out harbor.ifzzh.com.key 4096

生成证书签名请求(CSR)

调整-subj选项中的值以反映您的组织。如果使用FQDN连接Harbor主机,则必须将其指定为通用名称(CN)属性,并在密钥和CSR文件名中使用它。

openssl req -sha512 -new \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.ifzzh.com" \
    -key harbor.ifzzh.com.key \
    -out harbor.ifzzh.com.csr

生成一个 x509 v3 扩展文件

无论您使用FQDN还是IP地址连接到Harbor主机,都必须创建此文件,以便可以为您的Harbor主机生成符合主题备用名称(SAN)和x509 v3的证书扩展要求。替换DNS条目以反映您的域。

cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=harbor.ifzzh.com
DNS.2=harbor.ifzzh
DNS.3=ifzzh
EOF

使用该v3.ext文件为您的Harbor主机生成证书

harbor.ifzzh.com CRS和CRT文件名中的域名替换为Harbor主机名

openssl x509 -req -sha512 -days 3650 \
    -extfile v3.ext \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -in harbor.ifzzh.com.csr \
    -out harbor.ifzzh.com.crt

提供证书给Harbor和Docker

生成后ca.crtharbor.ifzzh.com.crtharbor.ifzzh.com.key文件,必须将它们提供给harbor和docker,和重新配置harbor使用它们。

将服务器证书和密钥复制到Harbor主机上的certificates文件夹中

mkdir -p /data/cert
cp harbor.ifzzh.com.crt /data/cert/
cp harbor.ifzzh.com.key /data/cert/

转换harbor.ifzzh.com.crtharbor.ifzzh.com.cert,供Docker使用。

Docker守护程序将.crt文件解释为CA证书,并将.cert文件解释为客户端证书。

openssl x509 -inform PEM -in harbor.ifzzh.com.crt -out harbor.ifzzh.com.cert

将服务器证书,密钥和CA文件复制到Harbor主机上的Docker证书文件夹中,您首先需要创建适当的文件夹

mkdir -p /etc/docker/certs.d/harbor.ifzzh.com/
cp harbor.ifzzh.com.cert /etc/docker/certs.d/harbor.ifzzh.com/
cp harbor.ifzzh.com.key /etc/docker/certs.d/harbor.ifzzh.com/
cp ca.crt /etc/docker/certs.d/harbor.ifzzh.com/

如果将默认nginx端口443映射到其他端口,请创建文件夹/etc/docker/certs.d/harbor.ifzzh.com:port/etc/docker/certs.d/harbor_IP:port

重新启动 Docker Engine

systemctl restart docker

以下示例说明了使用自定义证书的配置。

/etc/docker/certs.d/
    └── harbor.ifzzh.com:port
       ├── harbor.ifzzh.com.cert  <-- Server certificate signed by CA
       ├── harbor.ifzzh.com.key   <-- Server key signed by CA
       └── ca.crt                 <-- Certificate authority that signed the registry certificate

[root@harbor ~]# yum install -y tree
[root@harbor ~]# tree /etc/docker/certs.d/
/etc/docker/certs.d/
└── harbor.ifzzh.com
    ├── ca.crt
    ├── harbor.ifzzh.com.cert
    └── harbor.ifzzh.com.key

部署harbor仓库

# 1. 创建工作目录
mkdir harbor

# 2. 上传harbor安装包
rz -E

# 3.解压harbor安装包
tar xf harbor-offline-installer-v2.3.1.tgz

# 4. 复制修改harbor的配置文件名称
cp harbor/harbor.yml.tmpl  harbor/harbor.yml

# 5. 修改配置文件信息

hostname: harbor.ifzzh.com
...

# https related config
https:
 # https port for harbor, default is 443
 port: 443
 # The path of cert and key files for nginx
 certificate: /data/cert/harbor.ifzzh.com.crt
 private_key: /data/cert/harbor.ifzzh.com.key


harbor_admin_password: cnic


# 6. 启动harbor安装脚本
./harbor/install.sh

验证部署

cd harbor
docker-compose ps

# STATUS是Up说明部署成功了

本地浏览器访问

所有节点做hosts解析

cat >> /etc/hosts <<EOF
223.193.36.152 master01
223.193.36.155 master02
223.193.36.179 node01
223.193.36.182 node02
223.193.36.117 harbor harbor.ifzzh.com
EOF

访问

浏览器输入:harbor.ifzzh.com

从Harbor节点登录

docker login harbor.ifzzh.com
docker logout harbor.ifzzh.com

从其他节点登录

对应节点做如下操作,把ca.crt分发到对应客户端

mkdir -p /etc/docker/certs.d/harbor.ifzzh.com/
scp HarborIP:/root/harbor/ssl/ca.crt ca.crt /etc/docker/certs.d/harbor.ifzzh.com/

修改/etc/docker/daemon.json

{
    "registry-mirrors": [
        "https://tuv7rqqq.mirror.aliyuncs.com",
        "https://1nj0zren.mirror.aliyuncs.com",
        "https://docker.mirrors.ustc.edu.cn",
        "http://f1361db2.m.daocloud.io",
        "https://registry.docker-cn.com"
    ],
    "insecure-registries": ["http://harbor.ifzzh.com"],
    "exec-opts": ["native.cgroupdriver=systemd"]
}

推送镜像测试

docker login harbor.ifzzh.com
docker tag nginx:alpine harbor.ifzzh.com/library/nginx:alpine
docker push harbor.ifzzh.com/library/nginx:alpine