由于某些原因,在拉取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会自动跳转