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

发布于:2025-05-25 ⋅ 阅读:(20) ⋅ 点赞:(0)

为了更好的阅读体验,建议移步至笔者的博客阅读: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: 宿主机的IP
    port: 5432
    db_name: harbor_db
    username: postgres
    password: postgres
    # 不启用 SSL 模式
    ssl_mode: disable
    # 空闲连接池的最大连接数。如果 <=0,则不保留任何空闲连接。默认值为 2
    max_idle_conns: 2
    # 数据库的最大打开连接数。如果 <= 0,则打开连接数不受限制。默认值为 0
    max_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访问直接 403
    allow 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>

网站公告

今日签到

点亮在社区的每一天
去签到