珂珂的个人博客 - 一个程序猿的个人网站

搭建Docker仓库

由于某些原因,在拉取docker镜像的时候比较慢,还有需要上传自己的私有镜像,就有需求搭建私有镜像库了。可以用harbor和nexus 来搭建,但相比复杂了点,下面记录下采用最简单的方式。

先拉取registry   

docker pull registry

我在本机拉取成功

然后创建容器

docker run -d -p 5000:5000 -v /root/docker_registry:/var/lib/registry --restart=always registry

然后访问ip:5000/v2/_catalog    看是否有输出

然后编辑/etc/docker/daemon.json

加入

  "insecure-registries": [

    "http://xxx.xxx.xxx.xxx:5000"

  ]

这里好像不能填localhost,也有说不带http://的

但我试了加上docker启动不了了..


然后给已经存在docker images下的镜像打个tag

docker tag redis xxx.xxx.xxx.xxx:5000/redis:v1

然后

docker push xxx.xxx.xxx.xxx:5000/redis:v1

但是报http: server gave HTTP response to HTTPS client

网上有解决办法,但我想来在阿里云服务器上搭建然后用nginx代理下https算了。


于是放弃前面的,在阿里云上docker pull  registry

但失败,那么可以先把本机拉取到的registry 上传到阿里云上

先在本机保存为tar包

docker save -o registry_latest.tar registry:latest

再到阿里云服务器上执行

docker load --input registry_latest.tar

因为阿里云5000端口占用了,我换一个8055

现在/root 下创建一个目录docker_registry

docker run -d -p 8055:5000 -v /root/docker_registry:/var/lib/registry --restart=always registry

然后配置下 /etc/nginx/nginx.conf

加入

         server {
        listen       443 ssl;
        server_name  xxxxx.com;
        client_max_body_size 500m;
        ssl_certificate      /root/xxxxx/full_chain.pem;
        ssl_certificate_key  /root/xxxxx/private.key;
        ssl_session_timeout  5m;
        
        location / {
           proxy_pass http://localhost:8055;
           proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
           proxy_set_header request_uri $request_uri;
           index  index.html index.htm;
        }

    }

然后 nginx -s reload 重新加载下配置

试试访问https://xxxxxxx.kecq.com/v2/_catalog  没问题

然后回到本机给镜像打tag

docker tag redis xxx.kecq.com/redis    最后也可以接版本:v1 或者 :1.0.0

然后push

docker push xxxx.kecq.com/redis

之后就可以docker pull xxxx.kecq.com/redis 拉取了


但上面这种是公开访问的,如果不在内网或vpn下还是不太好。于是下面接着学习下搭建Harbor

如果没安装docker-compose  先安装下

apt install docker-compose

之后去github下载离线包,有600多MB 文件名为harbor-offline-installer-v2.10.3.tgz

下载到本地后解压,将其上传到服务器上

然后将 harbor.yml.tmpl 文件复制并重命名为 harbor.yml

打开这个文件修改hostname为自己IP,如果不使用https  将https 那一段也注释掉

然后在解压后的目录中使用docker命令加载解压后的镜像

docker load -i harbor.v2.10.3.tar.gz

然后将文件夹下的 prepare 和install.sh   新增执行权限

使用 ./prepare 预处理一些文件,初始化文件

然后执行 ./install.sh 安装

我这里由于已经有redis 容器了会报错

那么可以先把以前的redis 容器改下名字

docker rename redis myredis

然后再重新执行 ./install.sh  就可以成功了。
成功后访问http://IP    因为那个yml文件默认是80端口,如果使用非80 需要安装前改下那个yml文件

默认用户名密码 admin  Harbor12345

但是我发现在dokcer login的时候报错

docker login -u admin -p xxxxxxxxx https://192.168.8.205

Error response from daemon: Get "https://192.168.8.205/v2/": dial tcp 192.168.8.205:443: connect: connection refused

如果不使用https尝试下面方法

vim /usr/lib/systemd/system/docker.service
#修改内容地方
......
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.8.205 --containerd=/run/containerd/containerd.sock
......
 
#重启服务
systemctl daemon-reload
systemctl restart docker
 
#再次登录
docker login -u admin -p Harbor12345 http://192.168.8.205

那么我想着还是搞个https吧,于是我在软路由OpenWRT中将这台ubuntu 设了个主机头

再停止所有harbor的容器再删除掉

修改yml 中的hostname为har.kecq.com

再将ssl证书 *.kecq.com 也上传下,改下yml路径

重新执行 ./install.sh 

但好像有其他方法不用重装的,我没有尝试

停止现有的 Harbor 实例

docker-compose down -v

修改配置文件 Harbor.cfg ?没有这个是yml吧

vim harbor.cfg

运行prepare脚本来填充配置

./prepare

重启服务

docker-compose up -d

发现用默认密码Harbor12345 无法登录了,用上一次修改后的密码可以。

再执行docker  login

docker login -u admin -p xxxxxx https://har.kecq.com:8043

就成功了

然后就可以测试推送私有仓库镜像

docker tag redis har.kecq.com:8043/my/redis

docker push har.kecq.com:8043/my/redis

如果要退出

docker logout har.kecq.com:8043
然后测试 docker push 会出现

unauthorized to access repository

重启ubuntu后容器没有自动启动,需要转到harbor目录   docker-compose start启动

后面我尝试过不开启https   而用ubuntu 上安装的nginx 代理https 也是可行的,但harbor不能同时开启https,这样的话nginx带来会跳转错误 ,因为harbor 开启https后http会自动跳转


2026.6.17

在ubuntu 24.04 虚拟机中发现每次重启只有一个容器能启动,实际上harbor相关的有9个容器

豆包的回答

你遇到的是 Harbor 经典重启故障:

restart: always 只作用于 Docker 引擎,不遵守 compose 的depends_on依赖顺序

系统重启后 docker 并行拉起所有容器,postgres/redis 还没就绪,core/jobservice/nginx 等依赖容器直接启动失败、反复重试后放弃,只剩harbor-log容器稳定运行。

原生 docker 自启机制不会执行docker compose up -d,只有手动敲这条命令才会按依赖顺序启动整套 9 个容器。

Ubuntu24.04 使用 docker-compose-plugin(v2),和旧版二进制docker-compose路径有差异,直接写 systemd 要注意命令格式

解决方案:用 systemd 托管 Harbor(推荐,一劳永逸)

原理:系统开机顺序执行docker compose up -d,compose 会严格按照depends_on顺序启动所有容器,完美解决依赖时序问题。

创建harbor系统服务文件

sudo nano /etc/systemd/system/harbor.service

我综合了豆包和千问文件内容如下

[Unit]
Description=Harbor Registry
# 等网络、docker完全就绪再启动harbor
After=network-online.target docker.service systemd-resolved.service
Requires=docker.service
Documentation=https://goharbor.io

[Service]
Type=oneshot
RemainAfterExit=yes
# 切换到harbor目录执行compose
WorkingDirectory=/home/harbor
# Ubuntu24.04内置compose v2插件,命令是 docker compose (中间空格)
ExecStart=/usr/bin/docker compose -f /home/harbor/docker-compose.yml up -d
# 正常停止(down会删除容器,stop保留容器数据)
ExecStop=/usr/bin/docker compose -f /home/harbor/docker-compose.yml down
# 进程异常自动重试
Restart=on-failure
RestartSec=5
# 等待容器优雅关闭超时
TimeoutStopSec=60

[Install]
# 开机自启
WantedBy=multi-user.target
# 加载新服务配置
sudo systemctl daemon-reload
# 设置开机自动启动
sudo systemctl enable harbor
# 立即启动整套harbor(9个容器按顺序拉起)
sudo systemctl start harbor
# 查看运行状态
sudo systemctl status harbor

然后reboot 重启验证下效果

2026.6.27

由于docker compose up 和down 会重建容器

豆包说 docker compose start 会不管依赖顺序, 但我尝试了docker compose start 没有问题

于是上面的harbor.service 更改了下,顺便加上 restart

[Unit]
Description=Harbor Registry
# 等网络、docker完全就绪再启动harbor
After=network-online.target docker.service systemd-resolved.service
Requires=docker.service
Documentation=https://goharbor.io

[Service]
Type=oneshot
RemainAfterExit=yes
# 切换到harbor目录执行compose
WorkingDirectory=/home/harbor
# Ubuntu24.04内置compose v2插件,命令是 docker compose (中间空格)
#ExecStart=/usr/bin/docker compose -f /home/harbor/docker-compose.yml up -d
ExecStart=/usr/bin/docker compose start
# 重载重启
ExecReload=/usr/bin/docker compose restart
# 正常停止(down会删除容器,stop保留容器数据)
#ExecStop=/usr/bin/docker compose -f /home/harbor/docker-compose.yml down
ExecStop=/usr/bin/docker compose stop
# 进程异常自动重试
Restart=on-failure
RestartSec=5
# 等待容器优雅关闭超时
TimeoutStopSec=60

[Install]
# 开机自启
WantedBy=multi-user.target



上一篇:个人代码全部开源

下一篇:运营商限速折腾记


0 评论

查看所有评论

给个评论吧