详解docker实战之搭建私有镜像仓库 - kurbernetes

1、实战目的

搭建企业私有的镜像仓库,满足从开发环境推送和拉取镜像。当我们使用k8s来编排和调度容器时,操作的基本单位是镜像,所以需要从仓库去拉取镜像到当前的工作节点。本来使用公共的docker hub完全可以满足我们的需求,也非常方便,但是上传的镜像任何人都可以访问,其次docker hub的私有仓库又是收费的,所以从安全和商业两方面考虑,企业必须搭建自己的私有镜像仓库。

2、搭建私有仓库

2.1、生产证书

为了保证镜像传输安全,从开发环境向私有仓库推送和拉取镜像时,一般使用https的方式(备注:对于普通的http方式请大家参考官方文档:https://docs.docker.com/registry/insecure/#deploy-a-plain-http-registry 自己下去实战。),所以我们需要提供一个可信任的、知名的SSL/TLS证书,可以向知名的第三方证书颁发机构购买证书,也可以使用Let’s Encrypt生产免费的证书,还可以自己生产一个自签名证书。 由于没有购买真实的域名,无法和第三方证书颁发机构进行交互性验证,所以决定自己生产一个自签名证书,添加到私有仓库,然后让docker客户端信任此证书。 创建一个用于存储证书和私钥的目录certs

$ mkdir -p certs

生产证书和私钥

$ openssl req \
-newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \
-x509 -days 365 -out certs/domain.crt 

注意提前想好域名(如:registry.wuling.com),并将其作为CN,整个过程如图所示:

查看生成证书:

2.2、运行容器,启动镜像仓库

使用docker开源的Registry:2镜像,如图:

执行下面命令:

$ docker run -d \
  --restart=always \
  --name registry.wuling.com \
  -v `pwd`/certs:/certs \
  -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  -p 443:443 \
  registry:2

参数

说明

-d

后台静默运行容器。

-restart

设置容器重启策略。

-name

命名容器。

-v

挂载host的certs/目录到容器的/certs/目录。

-e REGISTRY_HTTP_ADDR

设置仓库主机地址格式。

-e REGISTRY_HTTP_TLS_CERTIFICATE

设置环境变量告诉容器证书的位置。

-e REGISTRY_HTTP_TLS_KEY

设置环境变量告诉容器私钥的位置。

-p

将容器的 443 端口映射到Host的 443 端口。

如图所示:

丛上图可以看到,服务端私有仓库已经正常运行起来了!!!

3、实战(从服务器和开发环境分别推送和拉取镜像)

3.1 服务器(私有仓库所在主机)

3.1.1、下载并重命名镜像

镜像的完整命名格式:[registry-host]:[port]/[username]/[imagename],当我们使用docker push的时候,docker会自动识别[registry-host]部分为容器镜像仓库地址。 使用docker tag重命名镜像:

docker pull justmine/helloworldapi:v2.2 
docker tag justmine/helloworldapi:v2.2 registry.wuling.com/justmine/helloworldapi:v2.2

3.1.2、推送镜像到私有仓库

什么情况?哦哦哦!!!域名是我们杜撰的,需要将与IP映射关系写入hosts文件。

再次推送,如下:

x509: certificate signed by unknown authority 又是什么情况?哦哦哦!!!原来系统不信任我们颁发的证书,好吧,不知名就不信任,那我们就主动宣布此证书是值得信任的!!! 为docker client安装证书,命令如下:

$ sudo mkdir -p /etc/docker/certs.d/registry.wuling.com
$ sudo cp certs/domain.crt /etc/docker/certs.d/registry.wuling.com/ca.crt

再次推送:

成功了!!!

3.1.3、通过浏览器查看仓库概况

仓库镜像目录:

https://registry.wuling.com/v2/_catalog

镜像详情

https://registry.wuling.com/v2/justmine/helloworldapi/tags/list

3.2 其他宿主机(开发环境Windows主机)

3.2.1 推送镜像到私有仓库

docker push registry.wuling.com/justmine/healthchecksapi:v1.5

同理:为了让当前Windows主机上运行的docker信任此证书,我们只需要在Windows主机上安装此证书,右键点击【安装证书】,选择【本地主机】,选择【受信任的根证书】,添加证书即可。同时将域名与私有仓库主机ip的映射关系写入到Windows主机的hosts文件。 重启docker,再次推送:

哎,终于成功了,不容易啊!!!

3.2.2 拉取镜像

docker pull registry.wuling.com/justmine/healthchecksapi:v1.5

3.2.3、通过浏览器查看仓库概况

仓库镜像目录:

https://registry.wuling.com/v2/_catalog

镜像详情

https://registry.wuling.com/v2/justmine/healthchecksapi/tags/list

到目前为止,能够满足企业需求的私有仓库正式搭建完成。 后面有时间会继续实战为私有仓库搭建UI管理界面,请继续关注!!!

下一篇,我们将实战k8s使用我们的私有仓库拉取镜像。 源码参考:https://github.com/justmine66/k8s.ecoysystem.apps

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器之心

专栏 | 新手入门?一步一步教你如何安装PaddlePaddle

机器之心发布 来源:百度PaddlePaddle 不久之前,机器之心联合百度推出 PaddlePaddle 专栏,为想要学习这一平台的技术人员推荐相关教程与资源...

4547
来自专栏blog

利用Katacoda免费同步Docker镜像到Docker Hub

安装kubernetes的时候,我们需要用到 gcr.io/google_containers 下面的一些镜像,在国内是不能直接下载的。如果用 Self Hos...

1762
来自专栏实战docker

Docker搭建disconf环境,三部曲之三:细说搭建过程

在前两章中,我们利用远程或本地的镜像,快速体验了本地启动disconf的过程,本章我们一起来分析和梳理整个定制和搭建过程,了解这些后,我们就能根据自己的需要来定...

2187
来自专栏实战docker

实战docker,编写Dockerfile定制tomcat镜像,实现web应用在线部署

最初在tomcat上部署web应用的方式,是通过maven的maven-compiler-plugin插件先打成war包,再将war包复制到tomcat的web...

3885
来自专栏東雲研究所

Let’s Encrypt 签发通配符证书的方法

签发域名通配符证书的过程是需要 DNS 验证的,acme.sh 这个小工具已经完美解决了这个问题。所以,不考虑其他问题的情况下,使用 DNS API 给网站域...

3679
来自专栏分布式系统和大数据处理

基于Docker的持续集成方案(安装和配置docker镜像仓库) - Part.5

在《基于Docker的持续集成方案(介绍) - Part.1》中,有一个安装和配置环节,即私有的docker镜像仓库,本文将对此进行介绍。

724
来自专栏程序员宝库

SSH 登录流程分析

本文首发于 https://jaychen.cc 作者:jaychen(https://segmentfault.com/u/chenjiayao) 写一篇短文...

4128

Docker - 如何使用SSH连接到正在运行中的容器

本篇文章主要介绍了如何使用SSH将你的Docker容器与其他Docker容器进行连接的方法,如果我忽略了一个或多个重点,请随意评论/建议。

3387
来自专栏Hadoop实操

如何在CDSW中定制Docker镜像

前面Fayson介绍了Cloudera的产品CDSW(Cloudera Data Science WorkBench)的安装及示例代码的运行,在《如何基于CDS...

3799
来自专栏云计算教程系列

使用GitLab构建Docker镜像并托管

容器化正迅速成为在云环境中打包和部署应用程序的最常用方法。它提供的标准化,以及其资源效率和灵活性,使其成为现代DevOps思维模式的重要推动者。当您的应用程序和...

290

扫码关注云+社区