部署Harbor私有仓库

在现代软件开发中,容器化应用已经成为主流,而容器镜像仓库则是确保容器镜像安全、管理和分发的重要工具。Harbor 作为一款开源的企业级容器镜像仓库管理工具,不仅支持多种认证方式,还提供镜像复制、漏洞扫描和用户访问控制等功能,为企业提供了一个安全、高效的镜像管理方案。

本文将详细介绍如何在本地环境中搭建Harbor,并演示如何使用Harbor进行镜像的推送、拉取和管理操作。无论你是容器技术的新手,还是经验丰富的开发者,这篇指南都将为你提供实用的帮助。

准备工作

  1. 服务器:一台运行Ubuntu Linux操作系统的服务器

  2. 硬件配置:至少2个CPU核心,4GB内存和40GB硬盘空间,硬盘空间取决于你有多少镜像。

生成root证书信息

根证书(Root Certificate)是证书链的起点,它由受信任的证书颁发机构(CA)签发,起到认证其他证书的作用。这里我们生成一个名为Root的CA

1
2
3
4
openssl genrsa -out /etc/ssl/private/selfsignroot.key 4096
openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=CN/ST=Shanghai/L=Shanghai/O=Company/OU=SH/CN=Root" \
-key /etc/ssl/private/selfsignroot.key \
-out /usr/local/share/ca-certificates/selfsignroot.crt

生成服务器私钥以及证书请求文件

这里我们生成一个为xiaohui.cn域名颁发证书的请求

1
2
3
4
5
openssl genrsa -out /etc/ssl/private/registry.key 4096
openssl req -sha512 -new \
-subj "/C=CN/ST=Shanghai/L=Shanghai/O=Company/OU=SH/CN=xiaohui.cn" \
-key /etc/ssl/private/registry.key \
-out registry.csr

生成openssl cnf扩展文件

为刚才的证书颁发请求扩充请求内容,额外增加registry.xiaohui.cn的验证域名

1
2
3
4
5
6
7
8
9
10
11
12
cat > certs.cnf << EOF
[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]
[v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = registry.xiaohui.cn
EOF

签发证书

用刚才我们创建的CA机构为我们的证书颁发请求做最终的证书颁发,本次为他们颁发10年有效的证书

1
2
3
4
5
openssl x509 -req -in registry.csr \
-CA /usr/local/share/ca-certificates/selfsignroot.crt \
-CAkey /etc/ssl/private/selfsignroot.key -CAcreateserial \
-out /etc/ssl/certs/registry.crt \
-days 3650 -extensions v3_req -extfile certs.cnf

信任根证书

由于我们的CA机构是自建的,所以在所有使用此CA颁发的证书位置,都需要信任此CA,才能自动信任由它颁发的证书

1
update-ca-certificates

部署Harbor仓库

先部署Docker CE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sudo apt-get update
sudo apt-get install -y \
ca-certificates \
curl \
gnupg \
lsb-release

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://mirror.nju.edu.cn/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirror.nju.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update

sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

再添加Docker 镜像加速器,这里只限在国内部署时才需要加速,在国外这样加速反而缓慢

容器镜像加速器可以从这里获得:https://registry.credclouds.com/

1
2
3
4
5
6
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxx.xxx.xxx"]
}
EOF

添加Compose支持,并启动Docker服务

1
2
3
4
curl -L "https://github.com/docker/compose/releases/download/v2.29.7/docker-compose-linux-x86_64" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
sudo systemctl daemon-reload
sudo systemctl restart docker

下载安装Harbor

1
2
3
4
wget https://github.com/goharbor/harbor/releases/download/v2.11.1/harbor-offline-installer-v2.11.1.tgz
tar xf harbor-offline-installer-v2.11.1.tgz -C /usr/local/bin
cd /usr/local/bin/harbor
docker load -i harbor.v2.11.1.tar.gz

在harbor.yml中,修改以下参数,定义了网址、证书、密码

1
2
3
4
5
vim harbor.yml
# 修改hostname为registry.xiaohui.cn
# 修改https处的certificate为/etc/ssl/certs/registry.crt
# 修改https处的private_key为/etc/ssl/private/registry.key
# 修改harbor_admin_password为admin
1
2
./prepare
./install.sh

生成服务文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cat > /etc/systemd/system/harbor.service <<EOF
[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/bin/harbor/docker-compose.yml up
ExecStop=/usr/local/bin/docker-compose -f /usr/local/bin/harbor/docker-compose.yml down
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
systemctl enable harbor --now

测试Harbor功能

在客户端上,将registry.xiaohui.cn以及其对应的IP添加到/etc/hosts,然后将随便一个镜像改名为带上DOMAIN:PORT形式,尝试上传我们的镜像到本地仓库

1
2
3
docker login registry.xiaohui.cn
docker tag httpd:v1 registry.xiaohui.cn/library/httpd:v1
docker push registry.xiaohui.cn/library/httpd:v1

这样,我们就把镜像改名好,并上传到我们的仓库了