1. 目录
2. 概念
Docker
仓库类似我们的代码仓库,就是 Docker
存放镜像文件目的地。常用的 Docker
仓库有阿里云镜像仓库、 docker hub
,我们只演示阿里云镜像仓库,另外一种操作类似。在最后一个章节,我们还会展示下如何利用 Docker 官方提供的 Registry
来构建私有仓库。
3. 环境准备
我通过在 Windows 10
操作系统的虚拟机,安装的 CentOS 7.0
, CentOS
是最小安装版,安装后需要将服务器内核和补丁全部更新一遍。
在 CentOS
安装 Docker
后,可以查看 Docker
版本为 20.10.17
,截止当前是 Docekr
社区版当中的最新版本。
- Windows 10 Home 64bit
- VMware Workstation Pro 16
- CentOS 7.0
- docker 20.10.17
4. 构建阿里云中央仓库
此处说明都是基于已有 Aliyun
账号的前提下,还没有的话,自行申请。
4.1. 阿里云操作
- 登录阿里云
https://cr.console.aliyun.com/
- 选择个人实例
- 创建命名空间
- 设置访问凭证
- 创建镜像仓库
点击 创建镜像仓库
后,选择 本地仓库
。
此后,我们对照着 操作指南
一步步操作,即可完成
4.2. 容器操作
4.2.1. 登录阿里云Docker Registry
docker login --username=wcngs@qq.com registry.cn-hangzhou.aliyuncs.com
4.2.2. 将镜像推送到Registry
这一步骤应该在拉取镜像之后,因为我这是新建仓库,所有没有镜像可被拉取的,选择直接推一个镜像上去。
docker tag etcd registry.cn-hangzhou.aliyuncs.com/rothschil/local_namespace:v1
docker push registry.cn-hangzhou.aliyuncs.com/rothschil/local_namespace:v1
4.2.3. 从Registry中拉取镜像
docker pull registry.cn-hangzhou.aliyuncs.com/rothschil/local_namespace:v1
5. 构建私有仓库
私有仓库是为了弥补很多场景下,内部安全考虑以及使用外部仓库不便捷的情况下,才考虑使用自行构建私有仓库。构建私有仓库的技术来源于 Docker Registry
。
5.1. Docker Registry
5.1.1. 启动
操作指令如下:
docker run -d -p 5000:5000 --restart=always --name registry -v /data/registry:/var/lib/registry registry:2
- -d : 以守护进程方式运行
- -p :将私有镜像仓库容器内部默认暴露的5000端口映射到宿主机的5000端口
- --restart=always :容器退出时总是重启容器
- --name registry :容器命名为
registry
- -v /data/registry:/var/lib/registry :将容器默认存储路径
/var/lib/registry
挂载到宿主机的/data/registry
目录 - registry:2 : 使用
Docker Registry
的V2
版本
5.1.2. 重命名
在推送私有镜像仓库之前,对镜像命名必须符合 IP:Port/repository
格式,我们对需要推送的镜像进行重命名。
docker tag boot_myapp:latest localhost:5000/boot_myapp
5.1.3. 推送
docker push localhost:5000/boot_myapp
5.1.4. 验证
我上面是推送在虚拟机上,所以在宿主机浏览器中访问虚拟机的端口 http://192.168.147.128:5000/v2/boot_myapp/tags/list。 192.168.147.128
是我虚拟机地址。
http://localhost:port/v2/${images_name}/tags/list
最后一步再查看宿主机的挂载磁盘 /data/registry
,我们的镜像已经发布到本地仓库中了。
5.2. 配置身份鉴权<可选>
上一节我们说到了,我们如何创建一个本地仓库,以及发布一个镜像到我们的本地仓库,这里存在一个问题,就是这个仓库是私有的,却是任何人都可以访问,没有到身份鉴权,所以在实际运用过程中,我们会对私有仓库添加一套身份鉴权操作,保护我们私有仓库的安全。
因为涉及到身份安全,需要一套安全证书,这里使用 openssl
。
5.2.1. 生成签名证书
mkdir -p /usr/local/registry/certs
openssl req -newkey rsa:2048 -nodes -sha256 -keyout /usr/local/registry/certs/domain.key -x509 -days 365 -out /usr/local/registry/certs/domain.crt
- -openssl req: 创建证书签名请求等功能;
- -newkey : 创建CSR证书签名文件和RSA私钥
- -rsa:2048: 指定创建的RSA私钥长度为2048;
- -nodes : 对私钥不进行加密;
- -sha256: 使用SHA256算法;
- -keyout: 创建的私钥文件名称及位置;
- -x509: 自签发证书格式;
- -days: 证书有效期;
- -out: 指定CSR输出文件名称及位置;
按照提示录入证书的基本信息即可!
5.2.2. 创建用户名
- 创建存储鉴权密码文件目录
mkdir -p /usr/local/registry/auth
- 安装
httpd
已安装的则略过本步骤
yum install -y httpd
- 创建用户和密码
htpasswd -Bbn root 123456 > /usr/local/registry/auth/htpasswd
5.2.3. 删除Docker Registry
此前用 Docker Registry
创建的容器删除,因为此前没有带身份鉴权。
docker rm -f ${CONTAINER ID}
5.2.4. 创建Docker Registry
docker run -id --name registry -p 5000:5000 --restart=always \
-v /data/registry:/var/lib/registry \
-v /usr/local/registry/certs:/certs \
-v /usr/local/registry/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
registry
5.2.5. 重命名和推送
使用 root/123456
创建的用户名和密码登录即可!
docker login localhost:5000
docker tag redis:4.0.10 localhost:5000/redis:4.0.10
docker push localhost:5000/redis:4.0.10
至此,我们的 Docker 私有化仓库就完成了!