当前位置: 首页 > news >正文

Docker 安装 Harbor 教程(搭建 Docker 私有仓库 harbor 避坑指南)【woodwhales.cn】

为了更好的阅读体验,建议移步至笔者的博客阅读:Docker 安装 Harbor 教程(搭建 Docker 私有仓库 harbor 避坑指南)

申明

操作系统版本:CentOS Linux release 7.9.2009 (Core)

cat /etc/centos-release
cat /etc/redhat-release
cat /etc/os-release

内核版本:3.10.0-957.el7.x86_64

uname -a
cat /proc/version

系统架构:x86_64

arch

docker 版本:Docker version 26.1.4, build 5650f9b

docker -v

docker-compose 版本:Docker Compose version v2.36.1

docker-compose -v

harbor 版本:v2.13.0

这里一定要使用 v2.13.0,笔者也尝试了不同版本,部分版本确实存在坑。类似问题 issue 可以参见:https://github.com/goharbor/harbor/issues/21996

环境准备

系统磁盘空间检查

首先确认 docker 数据存储目录,查看磁盘空间是否充足可用

df -h

docker 数据存储目录检查

查看 docker 数据存储目录,默认是:/var/lib/docker

docker info

对比存在磁盘不足,可以修改 docker 数据存储目录。

笔者以改为/home/docker为例:

步骤1:创建对应目录:

mkdir -p /home/docker

步骤2:注意 docker 旧的数据需要迁移过去:

cp -a /var/lib/docker /home/docker/

步骤3:再配置daemon.jsondata-root

vim /etc/docker/daemon.json

步骤4:填写data-root配置为指定数据存储目录:

{"data-root": "/home/docker","live-restore": true,"registry-mirrors": []
}
  • 配置docker live-restore,这样再重启 dockerd 时,就不会重启容器。

步骤5:执行配置重载命令:

kill -SIGHUP $(pidof dockerd)

步骤6:执行配置重载命令:

systemctl daemon-reload

步骤7:再重启 docker:

systemctl restart docker

步骤8:再次执行docker info 查看是否修改正确:

docker info

docker 安装

参见笔者的另一篇文章:Docker 安装

docker-compose 安装

步骤1:切换到指定目录:

cd /usr/local/bin/

步骤2:从 github 下载 docker-compose 可执行包:

wget https://github.com/docker/compose/releases/download/v2.36.1/docker-compose-linux-x86_64 -O docker-compose

步骤3:添加执行权限:

chmod +x /usr/local/bin/docker-compose

步骤4:在任意位置执行 docker-compose 命令输出版本信息,即安装成功:

docker-compose -v

docker 安装 redis

步骤1:创建对应目录:

# 配置目录
mkdir -p /home/redis/conf
# 数据目录
mkdir -p /home/redis/data

步骤2:切换到 redis 配置文件目录:

cd /home/redis/conf

步骤3:下载配置文件

https://redis.io/docs/latest/operate/oss_and_stack/management/config/ 下载对应版本的配置文件

wget https://raw.githubusercontent.com/redis/redis/7.4/redis.conf

步骤4:修改 redis.conf 配置文件:

vim /home/redis/conf/redis.conf

更新如下配置:

bind 0.0.0.0
requirepass redis@123
dir /data

步骤5:docker 拉取 redis 镜像:

docker pull redis:7.4

步骤6:启动 redis

docker run -d --name redis7.4 \
--restart=always \
-p 6379:6379 \
-e TZ=Asia/Shanghai \
-v /home/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /home/redis/data:/data \
redis:7.4 \
redis-server /usr/local/etc/redis/redis.conf

步骤7:查看容器日志检查是否启动成功:

docker logs -f redis7.4

可以看到:Ready to accept connections tcp 字样表示启动成功。

docker 安装 postgreSQL

笔者安装的是带 postgis 版本的,方便后续地理坐标数据存储

步骤1:创建 postgreSQL 数据目录:

mkdir /home/postgresql/data

步骤2:拉取 postgis/postgis 镜像

docker pull postgis/postgis:16-3.5

步骤3:启动 postgreSQL 容器:

docker run -d --name postgresql16 \
--restart=always \
-p 5432:5432 \
-e TZ=Asia/Shanghai \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=postgres \
-v /home/postgresql/data:/var/lib/postgresql/data \
postgis/postgis:16-3.5

步骤4:查看容器日志检查是否启动成功:

docker logs -f postgresql16

可以看到:database system is ready to accept connections 字样表示启动成功。

也可以使用下述命令查询 postgreSQL 的版本信息:

docker exec postgresql16 psql -U postgres -c "SELECT version();"

docker 安装 harbor

步骤1:创建 harbor 安装目录:

mkdir -p /home/harbor/data
mkdir -p /home/harbor/ssh

步骤2:切换到指定目录:

cd /home/harbor/

步骤3:使用 openssl 生成证书,依次执行下述命令

  • 注意:如果不配置 https 或者有正式的 ssl 域名证书,则忽略本步骤。
# 生成 ca.key
openssl genrsa -out /home/harbor/ssh/ca.key 4096# 根据 ca.key 签发 ca.crt 证书
openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/CN=localhost" \
-key /home/harbor/ssh/ca.key \
-out /home/harbor/ssh/ca.crt# 生成 harbor.key
openssl genrsa -out /home/harbor/ssh/harbor.key 4096# 根据 harbor.key 签名并生成 harbor.csr 证书
openssl req -sha512 -new \-subj "/C=CN/CN=localhost" \-key /home/harbor/ssh/harbor.key \-out /home/harbor/ssh/harbor.csr# 根据 ca.key 和 ca.crt 证书 签名并认证 harbor.csr 证书
openssl x509 -req -sha512 -days 3650 \
-CA /home/harbor/ssh/ca.crt \
-CAkey /home/harbor/ssh/ca.key \
-CAcreateserial \
-in /home/harbor/ssh/harbor.csr \
-out /home/harbor/ssh/harbor.crt# 将 harbor.crt 格式化成 harbor.cert
openssl x509 -inform PEM \
-in /home/harbor/ssh/harbor.crt \
-out /home/harbor/ssh/harbor.cert

步骤4:从 github 下载离线版本安装包:harbor-offline-installer-v2.13.0.tgz

wget https://github.com/goharbor/harbor/releases/download/v2.13.0/harbor-offline-installer-v2.13.0.tgz -O harbor-offline-installer-v2.13.0.tgz

步骤5:解压 tgz 文件:

tar xzvf /home/harbor/harbor-offline-installer-v2.13.0.tgz

步骤6:配置文件信息配置

解压成功之后,需要进入 harbor 文件夹,可以看到下述文件:

里面有个模板配置文件harbor.yml.tmpl,需要复制并重命名成harbor.yml

cp /home/harbor/harbor/harbor.yml.tmpl /home/harbor/harbor/harbor.yml

将配置文件中的下述信息进行自定义配置:

hostname: 宿主机的IP# http 端口默认为 80,改为1440,这个端口是宿主机映射到容器的 http 端口
http:port: 1440# 注释 https 配置,不开启 https
#https:# https 端口默认为443,如果配置了,则这个端口是宿主机映射到容器的 https 端口# port: 443# ssl 证书# certificate: /your/certificate/path# ssl 证书私钥# private_key:  /your/private/key/path# strong_ssl_ciphers: false# https 访问地址,这里配置,则 hostname 不生效
external_url: http://宿主机的IP:1440# 默认密码
harbor_admin_password: Harbor12345# 宿主机挂载 harbor 数据文件目录
data_volume: /home/harbor/data# 使用外部 postgreSQL 数据库
external_database:harbor:host: 宿主机的IPport: 5432db_name: harbor_dbusername: postgrespassword: postgres# 不启用 SSL 模式ssl_mode: disable# 空闲连接池的最大连接数。如果 <=0,则不保留任何空闲连接。默认值为 2max_idle_conns: 2# 数据库的最大打开连接数。如果 <= 0,则打开连接数不受限制。默认值为 0max_open_conns: 0# 使用外部 redis 数据库
external_redis:host: 宿主机IP:6379# 宿主机的redis密码,如果没有密码则不需要填写password: redis@123

上述配置中,如果配置了https,则external_url需要配置为:https:// + 宿主机 IP 或者 域名 + https.port,浏览器访问时,证书信息如下:

步骤7:创建数据库

注意上述配置了数据库使用宿主机的 postgreSQL,因此需要在宿主机的 pgSQL 数据库中创建对应的数据库:

docker exec -it postgresql16 psql -U postgres -c "CREATE DATABASE harbor_db;"

步骤8:执行预处理程序:

/home/harbor/harbor/prepare

预处理脚本执行成功,则会出现 Generated configuration file: /compose_location/docker-compose.yml 字样。

此时当前文件夹下出现了docker-compose.yml文件,

注意:上述配置再次改动后,需要重新执行 prepare 脚本,重新生成 docker-compose.yml 文件。

  • 重置数据库
docker exec -it postgresql16 psql -U postgres -c "DROP DATABASE IF EXISTS harbor_db;" -c "CREATE DATABASE harbor_db;"

出现 DROP DATABASE、CREATE DATABASE 字样,表示重新创建数据库成功。

  • 删除历史数据
rm -rf /home/harbor/data/*

步骤9:启动 harbor 服务

sh /home/harbor/harbor/install.sh

执行完成,出现 Harbor has been installed and started successfully 字样表示启动成功

此时浏览器访问:http://宿主机IP:1440即可打开 harbor 控制台页面。此时浏览器可能出现证书不安全提示,强制访问即可。

账号为:admin,密码为:Harbor12345。登录成功页面如下,强烈建议及时修改管理员账号密码

步骤9:如果需要卸载 harbor 服务,则执行:

# 切换至 harbor 文件目录
cd /home/harbor/harbor
# 停止并删除所有harbor相关容器
docker-compose down -v
# 删除数据库,重新创建数据库
docker exec -it postgresql16 psql -U postgres -c "DROP DATABASE IF EXISTS harbor_db;" -c "CREATE DATABASE harbor_db;"
# 删除harbor数据存储目录
rm -rf /home/harbor/data/*

harbor 控制台配置

修改主题色

左下角切换主题色

创建镜像仓库

系统管理仓库管理中创建新的仓库:

填写目标信息之后,点击确定,列表展示了仓库信息。

创建项目

点击项目菜单,创建新的项目

填写项目名称为image,并开启镜像代理:

  • 注意:开启了镜像代理,则该项目不能向其推送镜像。访问级别是公开的则所有人可拉取该项目下的镜像。

上述配置好后,在已经搭建了 harbor 的服务器上,拉取测试镜像:

docker pull 127.0.0.1:1444/image/hello-world

此时登录 harbor 控制台可以看到已经拉取成功的镜像。

宿主机 nginx 配置

nginx 配置示例如下:

upstream harbor {# harbor 服务端口server 宿主机IP:1440;
}server {# 暴露给公网的 https 端口listen 1444 ssl;server_tokens off;server_name _;# ssl 证书文件路径ssl_certificate /data/ssh/public.pem;# ssl 证书私钥文件路径ssl_certificate_key /data/ssh/private.key;ssl_session_timeout 5m;add_header Accept-Ranges bytes;ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;ssl_prefer_server_ciphers on;client_max_body_size 0;location /v2/ {proxy_pass http://harbor/v2/;proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;proxy_set_header Authorization $http_authorization;proxy_pass_header Authorization;client_max_body_size 0;proxy_request_buffering off;proxy_buffering off;}location ~^/(service|c|image)/ {proxy_pass http://harbor;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}location / {# 只允许内网IP可以访问控制台,外网IP访问直接 403allow 10.0.0.0/8;allow 192.168.0.0/16;allow 172.16.0.0/16;allow 172.21.0.0/16;deny all;proxy_pass http://harbor;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}error_page 403 /403.html;location = /403.html {root /usr/share/nginx/html;internal;}proxy_intercept_errors on;fastcgi_intercept_errors on;error_log /var/log/nginx/harbor_error.log error;access_log /var/log/nginx/harbor.log main;
}

注意上述配置自定义了403.html,需要在/usr/share/nginx/html目录中创建403.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>403 Forbidden</title>
</head>
<body><h1>403 Forbidden</h1><p>You don't have permission to access this resource.</p>
</body>
</html>

相关文章:

  • java基础(面向对象进阶)
  • STM32中的IIC协议和OLED显示屏
  • ARM笔记-ARM指令集
  • 算法学习——从零实现循环神经网络
  • 7:QT加载保存参数(读写日志)
  • 5 分钟速通密码学!
  • List<Integer> list=new ArrayList<>()
  • Nginx stub_status 指南从启用到监控落地的全流程详解
  • 廉价却有效?ESD防护中的电容
  • 企业批量处理刚需PrintPDF 网络财务办公打印 网页到 Office 一键转 PDF
  • 【PhysUnits】10 减一操作(sub1.rs)
  • css五边形
  • 无需会员可一键转换
  • 【go】多线程编程如何识别和避免死锁,常见死锁场景分析,pprof使用指引
  • 【RK3588新品】嵌入式人工智能实验箱EDU-AIoT ELF 2发布
  • 物联网代理暴利逻辑拆解:格行随身WiFi三网切换技术实战分析
  • 日常效率工具【Tools】【持续更新】
  • Spring Cloud Gateway 微服务网关实战指南
  • 力扣48 .旋转图像 (最简单的方法)
  • 深度学习损失“三位一体”——从 Fisher 的最大似然到 Shannon 的交叉熵再到 KL 散度,并走进 PET·P-Tuning微调·知识蒸馏的实战
  • 网站单页别人是怎么做的/黑帽seo技巧
  • 奶茶加盟网站建设公司哪家好/seo门户网站优化
  • 网站站外引流怎么做/seo网站优化怎么做
  • 武汉做网站公司方讯/杭州专业seo
  • 做网站需准备些什么软件/百度在线客服中心
  • 沈阳有资质做网站的公司/东莞网站建设排名