搭建docker私有仓库

前言

之前就有在公司内网搭建过私有docker仓库,这次接着看这个课程。 将搭建docker仓库的过程记录下来。

下载镜像

首选, 我们从 [docker仓库官网][1] 将docker官方提供的私有仓库的镜像找到, 然后通过 pull 命令下载下来。
在仓库首页搜索 regisrty,第一个就是官方提供的镜像。 找到 tag:2 ,将其复制到命令行界面。

$ docker pull registry:2
2: Pulling from library/registry
c87736221ed0: Pull complete
1cc8e0bb44df: Pull complete
54d33bcb37f5: Pull complete
e8afc091c171: Pull complete
b4541f6d3db6: Pull complete
Digest: sha256:3b00e5438ebd8835bcfa7bf5246445a6b57b9a50473e89c02ecc8e575be3ebb5
Status: Downloaded newer image for registry:2

启动镜像

完成镜像的下载之后, 肯定是要运行起来, docker官方给我们提供了启动命令. 通过运行下面的命令, 我们就能够看到私有仓库是运行起来了.

$ docker run -d -p 5000:5000 --restart always --name registry registry:2
dc8e14fcb2028bd1c354750a4647c139ac62d0662651bd3c974cbfd4667a9577


$ docker ps|grep registry
dc8e14fcb202        registry:2                   "/entrypoint.sh /etc…"   47 seconds ago      Up 47 seconds       0.0.0.0:5000->5000/tcp   registry

推送镜像

完成上面的操作,一个基本的本地私有的镜像仓库就算搭建完成了, 我们可以通过推送一个镜像到仓库中来测试是否成功。

  • 首先, 我们查看本地镜像, 找一个较小的alpine版本的jre试一下.
$ docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
user-edge-service     latest              8a4343ae292b        22 minutes ago      472MB
user-service          latest              5255cb130cfc        22 minutes ago      463MB
message-service       latest              e8a0aa292277        About an hour ago   932MB
course-edge-service   latest              93cdb20a805f        5 hours ago         470MB
course-service        latest              0347264048f7        6 hours ago         468MB
api-gateway-zuul      latest              66cde019cbaf        6 hours ago         476MB
python-base           latest              018c9430d5e1        22 hours ago        932MB
openjdk               8-jre-alpine3.9     ce8477c7d086        2 days ago          84.9MB
openjdk               8-jre               d55d64383c12        2 weeks ago         443MB
python                3.6                 2bb3204ab1d1        2 weeks ago         924MB
registry              2                   f32a97de94e1        5 weeks ago         25.8MB

  • 通过 docker tag 命令我们将本地的openjdk重新打包成 localhost:5000/openjdk:8-jre-alpine3.9 镜像. 然后查看我们刚才打包的镜像.
$ docker tag openjdk:8-jre-alpine3.9 localhost:5000/openjdk:8-jre-alpine3.9

$ docker images|grep localhost:5000
localhost:5000/openjdk   8-jre-alpine3.9     ce8477c7d086        2 days ago          84.9MB

  • 最后, 通过 docker push命令将我们刚才打包的镜像上传至本地仓库. 然后通过 docker pull命令来验证是否上传成功.
    通过最后打印的 Status: Image is up to date 可以看出我们的镜像已经成功上传并且能够成功下载下来了.
$ docker push localhost:5000/openjdk:8-jre-alpine3.9
The push refers to repository [localhost:5000/openjdk]
aae5c057d1b6: Pushed
dee6aef5c2b6: Pushed
a464c54f93a9: Pushed
8-jre-alpine3.9: digest: sha256:922d65ba63c3cccb58c0a03e8bdfa86161c60c2aeb33db85d952d99c54f9662b size: 947

$ docker pull localhost:5000/openjdk:8-jre-alpine3.9
8-jre-alpine3.9: Pulling from openjdk
Digest: sha256:922d65ba63c3cccb58c0a03e8bdfa86161c60c2aeb33db85d952d99c54f9662b
Status: Image is up to date for localhost:5000/openjdk:8-jre-alpine3.9

仓库页面

有了上面的操作,我们这只算是完成了一个最基本的仓库功能。 它还没有页面。 在操作上还不是特别符合私有仓库的易用性。所以开源界有很多对 docker registry 做了界面开发, 其中非常不错的一个就是 VMware的 [harbor][2], 不过目前已经由 [goharbor][3] 组织负责维护了. 可以通过访问前面的链接, 下载 [Harbor offline installer][4] 版本. 下载速度还是非常不错的

下载完成后对压缩包进行解压. 然后进入harbor的目录修改它的配置文件 harbor.cfg, 将 hostname 修改为你想要配置的地址.其它参数上面都加上了注释, 可以具体去看.
下图我展示了我的配置.

![harbor.cfg配置][5]

安装harbor

[Warning] 用Linux安装,在安装过程中会踩无数的坑。我再次记录几个。

首先我们将 docker-compose.yml 文件中的所有 volumes 目录前面都加上 .(当前目录), 防止文件乱窜,然后修改 harbor.cfgsecretkey_path=./data(设置当前目录)
接下来运行目录下面的 install.sh 文件. 你会收到各种错误。。。

  • 错误一
    你可能会收到下面的提示:
OSError: [Errno 1] Operation not permitted: '/data/secretkey'

解决方法是将当前目录下面的 data 目录 chmod 777 data -R.

  • 错误二
[Step 2]: preparing environment ...
loaded secret from file: ./data/secretkey
Traceback (most recent call last):
  File "./prepare", line 220, in <module>
    secret_key = get_secret_key(secretkey_path)
  File "./prepare", line 85, in get_secret_key
    secret_key = _get_secret(path, "secretkey") 
  File "./prepare", line 100, in _get_secret
    mark_file(key_file)
  File "./prepare", line 82, in mark_file
    os.chown(path, uid, gid)
OSError: [Errno 1] Operation not permitted: './data/secretkey'

修改了权限之后还报这个错误的话, 用 sudo 运行 install命令, 基本上问题就不打了. 看到下面的信息, 就说明艰难的过程完成了.

:heavy_check_mark: ----Harbor has been installed and started successfully.----

Now you should be able to visit the admin portal at http://harbor.mooc.com:10001. 
For more details, please visit https://github.com/goharbor/harbor .

查看Harbor界面

完成上面的步骤, 我们就可以去访问Harbor的界面了. 默认用户名/密码: admin/Harbor12345

创建用户

首先, 我们尝试着创建一个用户. 如图:

![创建用户][6]

推送镜像

然后, 我们通过对前面使用的openjdk再次打包, 对内容进行发布.推送到刚创建的harbor仓库中..

$ docker tag openjdk:8-jre-alpine3.9 harbor.mooc.com:800/micro-service/openjdk:8-jre-alpine3.9

$ docker push harbor.mooc.com:800/micro-service/openjdk:8-jre-alpine3.9
``

----------


  [1]: http://hub.docker.com
  [2]: https://github.com/goharbor/harbo
  [3]: https://github.com/goharbor
  [4]: https://storage.googleapis.com/harbor-releases/release-1.7.0/harbor-offline-installer-v1.7.5.tgz
  [5]: http://blog.imyzt.top/upload/2019/04/ul8re7m8bmgodr71216uvlelvc.jpg
  [6]: http://imyzt.top/upload/2019/04/usm33su6nuj6voqufj0l76pkl9.jpg