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

搭建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会自动跳转



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

下一篇:遇到的奇葩家庭宽带问题


0 评论

查看所有评论

给个评论吧