前言
之前就有在公司内网搭建过私有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.cfg
的 secretkey_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