转载于 http://blog.c7d8.com/blog/22.html ,原文可能有更新,以原文为准

项目现有CI、CD方案为

  1. 提交代码到内网gitlab
  2. 自动触发gitlab Runner
  3. gitlab Runner 按照.gitlab-ci.yml配置进行编译打包
  4. gitlab Runner 按照.gitlab-ci.yml配置进行镜像构建
  5. gitlab Runner 按照.gitlab-ci.yml配置将镜像推送到阿里云镜像服务
  6. 去内网Portainer管理界面进行手动update

现在的问题是在第5步执行时由于多个镜像通过外网上传到阿里云的镜像服务中去比较慢(受限于上行网速,完成镜像push需要8分钟左右)。

由此想到了在内外自建Docker Registry服务,无论是push还是pull镜像时间至少可以节省一半以上。

这里我们使用的是centos7.3,centos7由于其没有默认开启xfs的d_type特性,docker可能会出现莫名奇妙的问题。安装方法可参考Docker CE 镜像源站-博客-云栖社区-阿里云
https://yq.aliyun.com/articles/110806?spm=5176.8351553.0.0.70650369sIkk2L
安装并启动docker完成后
执行如下命令

docker run -d -p 5000:5000 --restart=always -v /opt/data/registry:/var/lib/registry --name registry registry:2.6.2

registry:2.6.2中的 2.6.2为显示指定版本,避免直接使用registry导致后期registry镜像升级导致的差异异常
###那如何将镜像push到registry呢
我们可以测试将本地进行打个tag,然后push上去

  • 看看本地有哪些镜像
[root@xxx-dev ~]# docker images
REPOSITORY            TAG       IMAGE ID    CREATED     SIZE
portainer/portainer     latest    f71b185552bf   5 weeks ago  33.2MB

  • 给portainer/portainer镜像打tag
[root@xxx-dev ~]# docker tag portainer/portainer 192.168.1.28:5000/portainer/portainer:latest
  • 将镜像传到我们内网的registry
[root@xxx-dev ~]# docker push 192.168.1.28:5000/portainer/portainer:latest
The push refers to a repository [192.168.1.28:5000/portainer/portainer]
Get https://192.168.1.28:5000/v2/: http: server gave HTTP response to HTTPS clie 

哦豁,装逼失败。这里我们需要将机器配置一下,最主要的是insecure-registries,其中registry-mirrors为阿里云的加速地址,与本次错误无关。

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "insecure-registries": ["192.168.1.28:5000"],
  "registry-mirrors": ["https://xxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

我们再次尝试装逼

[root@xxx-dev ~]# docker push 192.168.1.28:5000/portainer/portainer:latest
The push refers to a repository [192.168.1.28:5000/portainer/portainer]
ac4c534d43cb: Pushed
dd4969f97241: Pushed
latest: digest: sha256:73628b5ded99bb2bf7f3f5e599f7b46044ba5025bea98c32c713afc0d7c972b5 size: 739

成功!

  • 那如何看到我们push的信息呢?
[root@gpf-dev ~]# curl 192.168.1.28:5000/v2/_catalog
{"repositories":["portainer/portainer"]}

我们也可以pull一下来看看

[root@gpf-dev ~]# docker pull 192.168.1.28:5000/portainer/portainer:latest
latest: Pulling from portainer/portainer
Digest: sha256:73628b5ded99bb2bf7f3f5e599f7b46044ba5025bea98c32c713afc0d7c972b5
Status: Downloaded newer image for 192.168.1.28:5000/portainer/portainer:latest

更多请参考
Docker —— 从入门到实践 · GitBook
https://www.gitbook.com/book/yeasy/docker_practice/details

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐