解决从官方仓库下载网络不通畅问题,搭建私有化镜像仓库
本文主要针对适用于个人的镜像仓库Registry
和适用于企业的镜像仓库Harbor
做介绍。
先看看搭建私有化镜像仓库能解决什么问题?
1.搭建Docker私有化仓库能解决什么问题?
- 镜像拉取、下载慢:从本地私有仓库下载镜像比从远程公共仓库下载要快得多,因为数据传输的延迟和带宽限制被大大降低。(个人使用很重要)
- 节省网络带宽:私有仓库允许用户在本地网络内下载和分发Docker镜像,因此能够尽量避免从远程公共仓库进行下载。(个人使用很重要)
- 增强安全性:私有化仓库允许对镜像进行更严格的安全控制和审计、进行更细粒度的访问权限限制,确保只有授权用户才能下载和上传镜像。
- 镜像的统一管理和分发:私有仓库使得Docker镜像的管理和分发更加集中和统一,管理员可以轻松地管理不同版本和标签的镜像,确保团队成员使用一致的镜像版本。
如果平时使用过程中有使用的比较好的镜像,可以拉取下来,然后推送到自己的仓库收藏一下。有时候想用的时候又拉取不下来,很是折腾、费时间。
2.常用私有化镜像仓库介绍
2.1 Docker官方Registry镜像
Docker官方Registry镜像是一个开源的、轻量级的Docker镜像仓库解决方案。它提供了基本的镜像存储和分发功能,是Docker官方推荐的私有仓库搭建方式之一。
适用场景 :一个简单、轻量级的Docker私有仓库,适用于小型团队 或个人开发者,对镜像管理功能要求不高,主要关注基本的镜像存储和分发;
注意:Registry:本身默认并不提供图形化界面
2.2 Harbor
Harbor是一个企业级的Docker Registry服务器,由VMware开源并维护。
适用场景:
- 一个功能全面的Docker私有仓库,适用于中大型企业或团队;
- 对用户和镜像进行细粒度的权限控制;
- 对镜像的安全性、可靠性和性能有较高要求;
- 需要与CI/CD系统集成,实现自动化构建和部署;
3.安装部署(compose方式)
本文安装优先采用docker compose
方式进行安装部署,如果有不清楚的,可以去看前面的文章。
3.1 Docker Registry和Docker-registry-ui
前提条件:已经安装了docker。
1、docker-compose.yml文件示例内容:
解释:
① 定义了一个名为my-registry
的服务,它使用官方的registry
镜像,并在容器内运行。容器内的5000端口被映射到宿主机的15000端口,同时,./data
目录被用作镜像的存储位置
② 定义了一个名为my-registry-ui
的服务
yaml
services:
my-registry:
privileged: true
#image: registry
# 如果拉取不下来,可以用下面的加速地址
image: dockerproxy.net/library/registry:latest
restart: always
container_name: my-registry
ports:
- "15000:5000"
volumes:
- "./data:/var/lib/registry"
# 图形化界面
my-registry-ui:
#image: joxit/docker-registry-ui:1.5-static
image: dockerproxy.net/joxit/docker-registry-ui:1.5-static
# 或者使用特定的版本,例如 joxit/docker-registry-ui:1.5-static
container_name: my-registry-ui
restart: always
ports:
- 18080:80
environment:
- REGISTRY_TITLE=My Private Registry
- REGISTRY_URL=http://my-registry:5000
# 可选:设置CATALOG_ELEMENTS_LIMIT来限制UI中显示的镜像数量
- CATALOG_ELEMENTS_LIMIT="1000"
depends_on:
- my-registry
- 启动服务
在docker-compose.yml
文件所在的目录下,运行以下命令来启动服务:
docker-compose up -d
这个命令会启动Docker Registry容器,并在后台运行。
3.2 Harbor
前提条件:已经安装了docker。
PS:如果公网访问的话,还需要:
- 一个域名或IP地址,用于访问Harbor;
- 一个SSL证书(可选,但推荐用于保护通信);
- 下载
harbor
并安装
bash
# 1. 从github下载harbor仓库(如果实在觉得慢或者其他网络原因,也有快的办法:离线包下载然后上传到服务器。不清楚的可以联系我)
wget https://github.com/goharbor/harbor/releases/download/v2.11.2/harbor-offline-installer-v2.11.2.tgz
# 2.解压
tar xvf harbor-offline-installer-v2.11.2.tgz
# 3.打开解压后的文件夹
cd harbor
# 4. 配置Harbor(修改harbor.yml文件)
cp harbor.yml.tmpl harbor.yml
# 编辑harbor.yml,例如修改hostname主机名(我这边使用的127.0.0.1)、端口(默认80端口)、存储位置等等
# 如果不需要HTTPS的话,把这个选项也注释掉。
# 5. 安装Harbor(运行自动化安装脚本来部署Harbor)
./install.sh
- 安装完成后服务自动启动:
访问地址(我没有使用域名,配置的是IP、端口改为8314):http://hostname:8314/,默认账号:admin/Harbor12345。
可以看到以下界面。
首页:
4.使用
4.1 配置Docker守护进程(在Docker客户端上)
- 编辑Docker的配置文件(通常是
/etc/docker/daemon.json
),添加insecure-registries
字段,并将Harbor的地址添加到该字段中。 - 需要配置Docker守护进程以信任Harbor/Registry的仓库。
bash
vim /etc/docker/daemon.json
## 内容大概如下
{
#################开始##################
"insecure-registries": [
"192.168.1.153:8314"
],
#################结束##################
"registry-mirrors": [
"https://dockerproxy.com"
]
}
记得
systemctl daemon-reload
systemctl restart docker
4.2 推送和拉取镜像(Docker Registry和Harbor)
这两个仓库的登录、推送、拉取命令基本是一样的。
- 如果要推送和拉取镜像,一般需要进行登录:
- 在Docker客户端上,使用docker login命令登录到镜像仓库。
- 输入用户名和密码(Harbor默认是admin/Harbor12345;Docker Registry 默认没有密码,随便输)。
bash
# 登录Harbor,docker login harbor.example.com
docker login <Harbor/Docker Registry服务器地址>
- 推送
为要推送的本地镜像打上一个新的标签(Tag),这个标签应该包含仓库的地址、项目名和镜像名。例如:
ruby
# Harbor 命令
docker tag your-image-name:tag registry.<Harbor服务器地址>/<项目名>/<镜像名>:tag
# Docker Registry命令
docker tag your-image-name:tag <Docker Registry服务器地址>/<仓库名>/<镜像名>:tag
## 示例(注意:默认端口5000,我设置为15000):docker tag grafana/grafana:9.2.4 192.168.1.153:15000/my_registry/grafana:9.2.4
最后,使用docker push
命令将镜像推送到Harbor/Docker Registry:
perl
# Harbor
docker push registry.<Harbor服务器地址>/<项目名>/<镜像名>:tag
# Registry
docker push <Docker Registry服务器地址>/<项目名>/<镜像名>:tag
## 示例:docker push 192.168.1.153:15000/my_registry/grafana:9.2.4
Docker Registry 推送:
- 拉取
同样,首先确保你已经登录到Harbor。
使用docker pull
命令从Harbor拉取镜像。命令格式如下:
ruby
# Harbor命令
docker pull registry.<Harbor服务器地址>/<项目名>/<镜像名>:tag
#Docker Registry命令
docker pull <Docker Registry服务器地址>/<仓库名>/<镜像名>:tag
这里的<Harbor/Docker Registry服务器地址>
、<项目名>
、<镜像名>
和:tag
应该与你推送镜像时使用的相同。