【Docker 那些事儿】如何高效地搭建 Docker 私有仓库
Docker 仓库用于保存 Docker 镜像,分为公有仓库与私有仓库。
公有仓库就是 Docker Hub 一类供所有 Docker 用户使用的 Docker 仓库。
私有仓库是指由个人或企业搭建的 Docker 仓库,供其自身使用,是非公开的。
本篇文章将对 Docker 私有仓库及其相关内容进行详解。
1. 私有仓库Docker 镜像通常保存在 Docker Hub,Docker Hub 是目前最大的 Docker 镜像公有仓库,由 Docker 官方人员进行维护,其中的镜像可供所有用户下载使用。
在生产环境中,通常公司会构建一些符合公司业务需求的镜像,这些镜像因为是商业机密而不得上传至 Docker Hub,只能供公司内部人员使用。
此时就需要在内网搭建一个 Docker 私有仓库,来存储公司内部的镜像,并确保内部人员可以不受网络限制,快速地拉取或上传镜像。
镜像为 Docker 容器的运行基础,容器是镜像的具体运行实例,镜像仓库为镜像提供了可靠的存储空间,镜像可以从公有或私有仓库拉取,如图所示👇
2. 搭建私有仓库 🍇 环境部署私有镜像仓库在企业中占有较高的使用率,因此私有镜像仓库搭建技术显得尤为重要。
下面通过示例讲述私有镜像仓库的搭建方式与过程。
本节需要用到两台服务器,一个作为私有镜像仓库,另一个作为使用私有镜像仓库的 Docker 客户机。
此处以 CentOS 系统为例,安装并启动 Docker,服务器信息如表所示。
🍇 自建仓库Docker Hub 为用户提供了完美的仓库镜像,本示例将使用 Docker Hub 中的仓库镜像运行私有仓库。
首先从 Docker Hub 中拉取仓库镜像,示例代码如下: 以上示例成功拉取了 Docker 仓库的镜像。
下面将仓库镜像运行成为容器,示例代码如下: 以上示例将仓库镜像运行成了仓库容器,并映射了宿主机的 5000 端口,供 Docker 镜像的上传与下载。
其中,--restart=always 表示容器停止时自动重启,这条参数常用于生产环境中。
下面将镜像上传至刚刚创建的镜像仓库中,示例代码如下: 以上示例拉取了一个 BusyBox 镜像,并为其添加了 tag 标识,在尝试将镜像推送至私有仓库时,发生了报错。
这是因为 Docker 默认支持 HTTPS(Hyper Text Transfer Protocol Secure,安全超文本传输协议),命令行中使用的是 HTTP(Hyper Text Transfer Protocol,超文本传输协议)。
修改 Docker 的启动参数,使之允许以 HTTP 工作,示例代码如下: 以上示例修改了 Docker 配置文件中的启动参数,并重启Docker。
下面接着尝试将镜像推送至私有仓库,示例代码如下: 以上示例成功将镜像推送到私有仓库。
如果想在其他宿主机上使用该仓库,只需要修改配置文件,重启 Docker 服务。
下面通过另外一台服务器拉取私有仓库中的镜像,先修改 Docker 配置文件,再重新读取并重新启动 Docker,最后拉取镜像,示例代码如下: 以上示例成功从私有仓库下载了 BusyBox 镜像。
如此,一个简单的私有仓库就搭建好了,但安全系数较低,镜像保存在容器中,容器被删除后,私有仓库以及仓库中的镜像也会一并删除,数据无法保存。
3. 使用 TLS 证书 🍇 生成证书想让仓库对外提供服务,就需要配置用户认可的 TLS(Transport Layer Security,传输层安全)证书,否则仓库将无法正常使用。
目前很多代理商可以提供权威的证书,用户可以自行选择。
下面演示自行生成 TLS 证书的方式及过程。
(1)使用 Openssl 工具生成私人证书文件。(暂不演示)
(2)创建带有 TSL 认证的仓库容器,示例代码如下: 上述示例运行了一个被命名为 registry-TLS 的容器,并通过 REGISTRY_HTTP_TLS_CERTIFICATE 和 REGISTRY_HTTP_TLS_KEY 两个参数启用仓库的证书支持。
(3)在每一台 Docker 客户端宿主机上配置域名解析,使宿主机可以解析域名 “registry.Docker.com”,并在宿主机中创建名称与域名名称相同的目录,示例代码如下: (4)将证书 damain.crt 复制到要使用仓库的 Docker 宿主机,并放到 /etc/Docker/certs.d/registry.Docker.com:5000/ 目录下,示例代码如下: (5)Docker-1 是仓库的宿主机,下面使用 Docker-2 推送镜像到私有仓库,示例代码如下: 以上示例成功将 Docker-2 中的镜像推送至私有仓库,并通过 -k 选项关闭 curl 对证书的验证。
注意,默认情况下,证书只支持基于域名访问,要使其支持 IP 地址访问,需要修改配置文件 Openssl.cnf。
在 CentOS7 系统中,文件所在位置是 /etc/pki/tls/Openssl.cnf。
在文件中的 [ v3_ca ] 部分添加 subjectAltName 选项,示例代码如下: 保存退出后,重新生成证书即可使用。
🍇 基本身份验证企业创建私有镜像仓库时,为防止信息泄露,通常会为仓库添加访问限制。
实现访问限制的最简单的方法是基本身份验证,下面通过本机基本身份验证,为仓库添加访问限制。
(1)创建用户密码文件,示例代码如下: 以上示例创建了用户密码文件 testuser 与 testpassword。
(2)运行仓库容器,并指定 TLS 证书与身份验证目录,示例代码如下: (3)尝试推送镜像,示例代码如下: 以上示例中,镜像推送失败,原因是没有基本身份验证凭据。
(4)通过用户名与密码登录,示例代码如下: (5)登录之后,再次推送镜像,示例代码如下: 以上示例在登录之后成功推送镜像到私有仓库。
4. Nginx 反向代理仓库使用 Nginx 代理可以实现仓库的认证功能。
简而言之,就是将 Nginx 服务器作为私有仓库的代理使用,如图所示👇 (1)私有仓库的搭建采用前文中的方式,首先在 Docker-1 中安装Nginx,并修改其配置文件。
(2)然后通过 OpenSSL 工具生成私钥和证书,示例代码如下: (3)使用 htpasswd 工具生成用户账户,并设置密码,示例代码如下: (4)启动 Nginx 服务,示例代码如下: (5)访问测试
使用浏览器访问 https://192.168.56.146:443,出现登录界面,如图所示。 输入正确的账号密码即可访问仓库。
(6)在 Docker-2 登录仓库,并推送镜像到仓库,示例代码如下: 以上示例在宿主机 Docker-2 中进行域名修改及证书复制之后,将镜像成功推送至 Docker-1 的镜像私有仓库。
5. 可视化私有仓库私有仓库虽然搭建十分简便但使用起来还是不够方便,用户不能直观地看到仓库中的资源情况。 本节将部署基础的 UI(User Interface,用户界面)工具,使用户可以在 Web 界面直观地看到仓库中的镜像以及镜像的版本等信息。
私有仓库的可视化需要 UI 工具 hyper/Docker-registry-web 来支持实现,如此可提高仓库的可读性。
(1)同样采用拉取镜像的方式运行 hyper/Docker-registry-web,示例代码如下: (2)启动 hyper/Docker-registry-web 工具并连接私有仓库,示例代码如下: 以上示例启动了 hyper/Docker-registry-web 工具并连接了私有仓库,此时已经可以通过访问 IP 地址与端口号查看私有仓库的信息。
其中,--link 设置要连接的仓库容器,-e 设置环境变量。
(3)拉取任意镜像到私有仓库中,示例代码如下: 使用浏览器访问私有仓库,查看镜像信息,如图所示。 查看镜像的标签、大小、构建历史等信息,如图所示👇 👇
🌟 总结本文章详细介绍了如何搭建 Docker 私有仓库,如何通过配置证书为仓库添加安全级别与身份验证,如何使用 Nginx 代理仓库。
相信大家已经通过本文章的学习已经熟练掌握了镜像私有仓库的相关知识,并能够搭建出企业级的私有仓库。