第二篇:Docker仓库介绍

对应于存储 jar 包的 maven 仓库,python 包的 pypi 库,docker 镜像也需要有一个地方来做统一管理,随之就有了 Docker Registry 。

一个 Docker Registry 中包含多个 仓库(Repository),一个仓库一般对照一个应用或服务,比如 weather-app 这样的应用或者 MySQL 这样的组件。仓库的版本使用 标签(tag) 的概念, 由 Registry地址/Repository名称:<标签> 唯一对照一个镜像。如果不指定标签,将会以 latest 作为默认标签。

Docker Repository 一般可以分为两种类型:开放到公网使用的公开镜像仓库和私有镜像仓库。以下简单介绍两种仓库:

公开镜像仓库

公开镜像仓库是开放给用户使用、允许用户管理的 Registry 服务。一般这类仓库允许用户自主下载公开的镜像,注册平台账号后也可以自主上传自己的镜像,大多也提供商业镜像托管服务供企业或个人用户使用。我们使用 docker search 默认搜索的就是 Docker 官方的 Registry Docker Hub,这里有大量的高质量官方镜像,大多其他公开镜像也会默认同步这里的镜像并以加速镜像服务的方式提供给用户使用。当因为网络等原因直接不能直接从 Docker Hub 下载镜像或者下载速度太慢时,就可以选择这些加速镜像服务。

国内常用的开放 Docker Registry 有 阿里云镜像仓库DaoCloud 镜像仓库网易云镜像仓库 等,这些镜像仓库本身也会提供镜像加速功能,比如阿里云的加速器,使用加速功能的方法为把加速的 registry 地址设置在 docker daemon 的配置文件中:

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

私有镜像仓库

一般在公司内部,我们会自己搭建私有的镜像仓库。Docker 官方也提供了 Docker Registry 镜像,我们可以直接通过这个镜像来构建自己的私有镜像仓库。以下会介绍通过这种方式构建的操作方法,整个过程也可以参考 Docker 官方教程,里面详细介绍了本教程的大多数操作方法。

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

以上指令代表在本地5000启动启动私有镜像镜像。之后我们就可以使用常规方式来进行镜像的拉取和推送了:

docker build -t weather/weather-eureka-server:0.0.1 .
docker tag weather/weather-eureka-server:0.0.1 localhost:5000/weather-eureka-server
docker push localhost:5000/weather-eureka-server

因为此时使用的是 http 方式来访问的 Registry,push 的时候会报错,这时可以通过设置 --insecure-registry 参数来跳过这个错误。具体方法为:修改 Docker 的配置文件:

vim /etc/sysconfig/docker
OPTIONS='--selinux-enabled --log-driver=journald --insecure-registry 10.214.168.58:80'
# 重启 docker 服务
service docker restart

不过默认的 Registry 安装之后缺少企业仓库常用的一些功能,比如用户权限管理、后台管理 等功能。社区在开源的 Docker Registry 镜像提供的 Docker Registry API 服务基础上开发了一些高级功能,比如 VMWare Harbor 和 Sonatype Nexus。下面会介绍使用部署 harbor 来管理 Registry,同时使用自认证证书的方式以SSL方式开放私有Registry。 Harbor 的安装可以参考官方说明文档。环境要求为 docker版本为 1.10.0 以上,docker-compose版本为 1.6.0 以上。可以采用离线包安装的方式,首先下载最新版本的 Harbor release 包,解压后通过 harbor.cfg 设置相关参数z。主要设置的参数如下:

# 访问harbor的域名或ip,这里我们直接设置测试服务器ip,如果有做过DNS解析的域名,可以配置为域名,不需要加http或https这样的协议前缀
hostname = 10.214.168.58
# 访问Harbor WEBUI 的协议,默认http方式不够安全,客户端push前也需要做排除证书校验的一些设置。这里我们设置为https,后面会设置自认证证书
ui_url_protocol = https
# 自认证证书存放位置
ssl_cert = /data/cert/10.214.168.58.crt
ssl_cert_key = /data/cert/10.214.168.58.key
# key 、数据库等文件的存放位置
secretkey_path = /data

其他的配置还有ldap配置、WEBUI 密码、SMTP 服务等可以按照需求自己配置。配置好之后开始创建自认证证书, 可以参考为Harbor配置https访问方式

openssl req \
    -newkey rsa:4096 -nodes -sha256 -keyout ca.key \
    -x509 -days 365 -out ca.crt

openssl req \
    -newkey rsa:4096 -nodes -sha256 -keyout 10.214.168.58.key \
    -out 10.214.168.58.csr

echo subjectAltName = IP:10.214.168.58 > extfile.cnf
openssl x509 -req -days 365 -in 10.214.168.58.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extfile extfile.cnf -out 10.214.168.58.crt

cp 10.214.168.58.crt /data/cert/
cp 10.214.168.58.key /data/cert/
cp ca.crt /etc/docker/certs.d/10.214.168.58/
cp /data/cert/10.214.168.58.crt /etc/pki/ca-trust/source/anchors/reg.10.214.168.58.crt

然后完成 Harbor 的安装:

sudo ./install.sh

Notary(公正服务,安装后会展示镜像是否经过认证)、Clair(漏洞扫描功能,可以确保镜像的安全性) 的配置请参考官方安装文档,这里忽略这一步。

安装完成后如果需要修改 Harbor 的配置,则在修改完 harbor.cfg 文件后需要先执行一下 ./prepare 来注入配置,Harbor 运行时配置信息保存在安装目录下的 common 文件中,数据库、证书等存放在配置中 secretkey_path 参数设置的文件夹下。

至此,Harbor 已经安装完成,执行 docker ps 可以看到 Harbor 把容器内的 80、443、4443 端口开放到外面的 80、443、4443 端口,这时我们可以通过 https://10.214.168.58 来访问 Harbor UI,用户名为 admin,密码为配置中设置的密码,默认为 Harbor12345 。在后台可以查看私有仓库中的镜像,也可以以项目的方式规划镜像、划分镜像的访问权限等。基本流程如下:

Harbor 还提供同步功能,通过在 Harbor 后台配置, 一个Harbor仓库的镜像可以同步到另一个 Harbor 仓库。在多环境隔离的公司环境下,这样可以保证镜像在各环境之间自动同步。流程如下:

Harbor 环境搭建完成后,我们可以以项目方式设置镜像的访问权限,当用户需要推送时,就需要先授权通过:

# 注意login时直接使用内网测试服务器 10.214.168.58,而不是 https://10.214.168.58 或 http://10.214.168.58
docker login -u admin -p Harbor12345 10.214.168.58
docker tag weather/weather-eureka-server:0.0.1 10.214.168.58/weather-test/weather-eureka-server:0.0.1
docker push 10.214.168.58/weather-test/weather-eureka-server:0.0.1
docker logout 10.214.168.58

发表评论

电子邮件地址不会被公开。 必填项已用*标注