Docker 私有仓库 harbor

Docker 仓库(Repository)是集中存放镜像的地方。我们拉取镜像的时候,除了使用 Docker 官方的公共仓库 Docker Hub 外,还可以使用自行搭建的本地私有仓库。

harbor 私有仓库是一个用于存储和分发 Docker 镜像的企业级 Registry 服务器。

harbor 私有仓库和 registry 私有仓库相比,功能更强大,它增加了一些企业必需的安全、标识和管理等功能,支持 web 图形化管理,支持多节点的镜像资源复制。

本文介绍使用 harbor 搭建私有仓库。

1. 安装 docker-compose

harbor 可以部署在任何支持 Docker 的Linux发行版上。部署 harbor 必须先安装 docker 和 docker-compose。

1)下载 docker-compose 安装脚本:

$ curl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

2)赋予docker-compose 执行权限:

$ chmod +x /usr/local/bin/docker-compose

3)验证 docker-compose 是否正常执行:

$ docker-compose -v

执行结果:
docker-compose version 1.23.1, build b02f1306

2. 安装 harbor

1)下载 harbor 安装包

$ wget https://github.com/goharbor/harbor/releases/download/v2.1.0/harbor-offline-installer-v2.1.0.tgz
$ ls -l

执行结果:
total 543100
-rw-------. 1 root root      1363 Jul 25  2019 anaconda-ks.cfg
-rw-r--r--  1 root root 556130191 Oct 18 02:11 harbor-offline-installer-v2.1.0.tgz

2)解压 harbor 安装包

$ tar -zxvf harbor-offline-installer-v2.1.0.tgz 

执行结果:
harbor/harbor.v2.1.0.tar.gz
harbor/prepare
harbor/LICENSE
harbor/install.sh
harbor/common.sh
harbor/harbor.yml.tmpl

3)修改配置文件

复制一份配置文件模板,作为配置文件。

$ cd harbor/
$ cp harbor.yml.tmpl harbor.yml

依据自己的实际情况修改配置文件 harbor.yml。

一般情况下,需要修改的主要内容如下:

# 修改 harbor 服务器的地址,可以是域名,ip。
# 本文安装机器的 ip 地址为:10.10.1.37
hostname = 10.10.1.37 # 本机IP地址            

# harbor管理员admin的密码   
harbor_admin_password = Harbor12345

# 修改 harbor 服务器的Web管理的端口号
# 本文设定端口号:8888
http:
  port: 8888 # Web管理的端口号

# 如果不使用 https,注释掉 https 段
# https:
  # https port for harbor, default is 443
  # port: 443
  # The path of cert and key files for nginx
  # certificate: /your/certificate/path
  # private_key: /your/private/key/path

4)执行 install 脚本

$ ./install.sh 

运行结果:
[Step 0]: checking if docker is installed ...
Note: docker version: 19.03.5
[Step 1]: checking docker-compose is installed ...
Note: docker-compose version: 1.23.1

3. 验证 harbor 搭建是否成功

我们测试将一个专门制作的镜像推送到 harbor 私有仓库:

1)配置客户端不安全 registry

由于我们启动的 harbor 服务使用了 http 而不是 https,不是安全可信赖的服务,所以必须先修改客户端 docker 的配置文件 /etc/docker/daemon.json,添加一项不安全的 insecure-registries:

{
"registry-mirrors": "insecure-registries": ["10.10.1.37:8888"]
}

使用 systemctl restart docker 命令重启 docker 服务。

2)制作测试镜像

先通过 docker images 命令查看本地已经下载的镜像。

$ docker images

运行结果:
REPOSITORY  TAG     IMAGE ID...
alpine      latest  f70734b6a266

本地有一个已经下载的镜像 alpine:latest,我们以其为模板创建一个测试用的镜像。

查看 harbor 服务器的 ip 地址,本文测试服务器的 ip 地址为 10.10.1.37。

我们要把测试镜像推送到 harbor 服务器的私有仓库,镜像名称必须符合特定的格式: registry_url:port/project/ImageName:tag。

因此,我们测试镜像的名称设定为:10.10.1.37:8888/library/alpine:latest。

先使用 docker tag 命令创建测试镜像:

$ docker tag alpine:latest 10.10.1.37:8888/library/alpine:latest

3)登录 harbor 私有仓库

$ docker login 10.10.1.37:8888

执行结果:
Username :
输入用户名 admin
Password:
输入密码 Harbor12345

4)推送镜像至 harbor 私有仓库

使用 docker push 命令把测试镜像推送到私有仓库:

$ docker push 10.10.1.37:8888/library/alpine:latest

如果执行结果如下:

The push refers to a repository [10.10.1.37:8888/library/alpine]

Get https://10.10.1.37:8888/v2/: http: server gave HTTP response to HTTPS client

那么执行结果是错误的,因为我们启动的 harbor 服务使用 http 不是安全可信赖的。这时需要修改客户端docker的配置文件/etc/docker/daemon.json,添加一项不安全的 insecure-registries:

{
"registry-mirrors": "insecure-registries": ["10.10.1.37:8888"]
}

使用 systemctl restart docker 命令重启 docker 服务。

再次使用 docker push 命令,把测试镜像推送到私有仓库:

$ docker push 10.10.1.37:8888/library/alpine:latest

执行结果:
The push refers to a repository [10.10.1.37:8888/alpine]
3e207b409db3: Pushed 

本次推送成功。

4. harbor Web管理端

在浏览器中访问 http://10.10.1.37:8888/ ,输入用户名和密码,就可以对镜像库进行管理。

下一章:Docker 构建镜像

构建 Docker 镜像的指令是 docker build,另外还需要制作一个包含构建指令的 Dockerfile 脚本文件。Dockerfile 是一个用来构建镜像的脚本文件,里面包含了构建镜像所需的指令和说明。