惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Schneier on Security
F
Fortinet All Blogs
博客园_首页
The GitHub Blog
The GitHub Blog
V
Visual Studio Blog
D
DataBreaches.Net
aimingoo的专栏
aimingoo的专栏
爱范儿
爱范儿
B
Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
N
Netflix TechBlog - Medium
阮一峰的网络日志
阮一峰的网络日志
P
Proofpoint News Feed
D
Docker
Engineering at Meta
Engineering at Meta
大猫的无限游戏
大猫的无限游戏
The Cloudflare Blog
罗磊的独立博客
云风的 BLOG
云风的 BLOG
Microsoft Azure Blog
Microsoft Azure Blog
T
The Exploit Database - CXSecurity.com
博客园 - 三生石上(FineUI控件)
量子位
The Last Watchdog
The Last Watchdog
MyScale Blog
MyScale Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
The Blog of Author Tim Ferriss
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
小众软件
小众软件
Cloudbric
Cloudbric
博客园 - 司徒正美
H
Help Net Security
人人都是产品经理
人人都是产品经理
Application and Cybersecurity Blog
Application and Cybersecurity Blog
L
LangChain Blog
Latest news
Latest news
M
MIT News - Artificial intelligence
T
Threat Research - Cisco Blogs
博客园 - Franky
S
Security Affairs
W
WeLiveSecurity
F
Full Disclosure
Know Your Adversary
Know Your Adversary
Google DeepMind News
Google DeepMind News
The Hacker News
The Hacker News
Cyberwarzone
Cyberwarzone
美团技术团队
PCI Perspectives
PCI Perspectives
C
Check Point Blog
Spread Privacy
Spread Privacy

CAYZLH

MacBook上备忘录APP的快捷键和手势 让Google屏蔽某些搜索结果 WSL自定义安装Ubuntu typora自动上传图片配置 自建giscus服务 Windows下结束指定端口的进程 批量修改maven多模块版本号 使用winsw部署SpringBoot项目 Gson简易指南 docker搭建Consul集群 使用Docker部署SpringBoot项目 Docker使用redis镜像 Docker使用rabbitmq Docker使用zookeeper Docker使用MySQL Dockerfile常用指令 Docker免sudo操作 雷鸟电视去广告 使用ADB卸载MIUI系统应用 利用GitHub做图床 将网站变成灰色 Github上传大文件 Android远程调试命令adb vscode快捷键的使用 SpringBoot文件上传异常处理 SpringBoot封装JedisUtils工具类 SpringBoot自动部署脚本 使用Spring读取文件的几种方式 Spring统一异常返回 利用Github做Maven私服 Redis常用指令 Maven常用指令 使用mysqldump导出数据 SpringBoot动态切换多数据源 Java8的日期处理实践 lambda表达式语法 Stream表达式语法 使用Optional优雅地判空 Android Support vs AndroidX 「Vue」Runtime-Complier和Runtime-only的区别 RecyclerView使用记录 动态设置布局之LayoutInflater Redis分布式锁的几种方案 打造一个舒服的写作环境(Hexo) 深入了解与使用ThreadLocal Maven中dependencyManagement的作用 Redis配置认证密码 nginx简单配置示例 Linux(macOS)换源 Linux搭建Git服务器 Linux配置ssh使用公钥登录远程服务器 Linux下find与exec的使用 Linux排查Java问题工具单 Linux常用命令 MySql数据库优化细节 API签名验证方案 Java集合框架 Redis基础知识总结 Spring事务管理 Redis为什么这么快 SpringBoot实现Jwt单点登录 SpringBoot实现Redis分布式锁 Spring面向切面编程(知识梳理) SpringBoot异步请求和异步调用 Mybatis中用到的几种设计模式 Docker Swarm RocketMQ相关流程图/原理图 SonarQube的安装与使用 宝塔面板部署vue项目 Tomcat的三种接收请求处理方式 Docker知识扫盲 安装Jenkins并用于部署SpringBoot项目 Tomcat单机多实例部署 Maven中Scope的分类 Springboot集成Shiro(前后端分离) Linux搭建frp服务(内网穿透) Redis高逼格指令 Dockerfile使用介绍 Redis的使用场景 Docker的网络模式
Docker私有仓库的搭建与使用
Ant丶 · 2019-01-30 · via CAYZLH

转载自:spring-cloud-book

和Maven一样,Docker不仅提供了一个中央仓库,同时也允许我们搭建私有仓库。如果读者对Maven有所了解,将会很容易理解私有仓库的优势:

  • 节省带宽,镜像无需从中央仓库下载,只需从私有仓库中下载即可
  • 对于私有仓库中已有的镜像,提升了下载速度
  • 便于内部镜像的统一管理

下面我们来讲解一下如何搭建、使用私有仓库

准备工作

准备两台安装有Docker的CentOS7的机器,主机规划如下(仅供参考):

主机 IP 角色
node0 192.168.11.143 Docker开发机
node1 192.168.11.144 Docker私有仓库

安装、使用私有仓库

网上有很多docker-registry 的教程,但是docker-registry 已经过时,并且已经2年不维护了。详见https://github.com/docker/docker-registry ,故而本文不做探讨,对docker-registry 有兴趣的童鞋可以查阅本节的参考文档。

本节讲解registry V2,registry V2需要Docker版本高于1.6.0。registry V2要求使用https访问,那么我们先做一些准备,为了方便,这边模拟以域名reg.itmuch.com 进行讲解。

使用域名搭建https的私有仓库

  • 首先修改两台机器的hosts,配置192.168.11.144 reg.itmuch.com 的映射
echo '192.168.11.144 reg.itmuch.com'>> /etc/hosts
  • 既然使用https,那么我们需要生成证书,本文讲解的是使用openssl自签名证书,当然也可以使用诸如Let’s Encrypt 等工具生成证书,首先在node1机器上生成key:
mkdir -p ~/certs
cd ~/certs
openssl genrsa -out reg.itmuch.com.key 2048

再生成密钥文件:

openssl req -newkey rsa:4096 -nodes -sha256 -keyout reg.itmuch.com.key -x509 -days 365 -out reg.itmuch.com.crt

会有一些信息需要填写:

Country Name (2 letter code) [XX]:CN									# 你的国家名称
State or Province Name (full name) []:JS # 省份
Locality Name (eg, city) [Default City]:NJ # 所在城市
Organization Name (eg, company) [Default Company Ltd]:ITMUCH # 组织名称
Organizational Unit Name (eg, section) []:ITMUCH # 组织单元名称
Common Name (eg, your name or your server's hostname) []:reg.itmuch.com # 域名
Email Address []:eacdy0000@126.com # 邮箱

这样自签名证书就制作完成了。

  • 由于是自签名证书,默认是不受Docker信任的,故而需要将证书添加到Docker的根证书中,Docker在CentOS 7中,证书存放路径是/etc/docker/certs.d/域名

node1 端:

mkdir -p /etc/docker/certs.d/reg.itmuch.com
cp ~/certs/reg.itmuch.com.crt /etc/docker/certs.d/reg.itmuch.com/

node0 端:将生成的证书下载到根证书路径

mkdir -p /etc/docker/certs.d/reg.itmuch.com
scp root@192.168.11.144:/root/certs/reg.itmuch.com.crt /etc/docker/certs.d/reg.itmuch.com/
  • 重新启动node0node1 的Docker
service docker restart
  • node1 上启动私有仓库

首先切换到家目录中,这一步不能少,原因是下面的-v 挂载了证书,如果不切换,将会引用不到证书文件。

cd ~

启动Docker私有仓库(注意:如果直接粘贴运行,请删除掉注释):

docker run -d -p 443:5000 --restart=always --name registry \
-v `pwd`/certs:/certs \ # 将“当前目录/certs”挂载到容器的“/certs”
-v /opt/docker-image:/opt/docker-image \
-e STORAGE_PATH=/opt/docker-image \ # 指定容器内存储镜像的路径
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/reg.itmuch.com.crt \ # 指定证书文件
-e REGISTRY_HTTP_TLS_KEY=/certs/reg.itmuch.com.key \ # 指定key文件
registry:2

其中,之所以挂载/opt/docker-image目录,是为了防止私有仓库容器被删除,私有仓库中的镜像也会丢失。

  • node0 上测试,将镜像push到私服
docker pull kitematic/hello-world-nginx
docker tag kitematic/hello-world-nginx reg.itmuch.com/kitematic/hello-world-nginx # 为本地镜像打标签
docker push reg.itmuch.com/kitematic/hello-world-nginx # 将镜像push到私服

会发现如下内容:

The push refers to a repository [reg.itmuch.com/kitematic/hello-world-nginx]
5f70bf18a086: Pushed
b51acdd3ef48: Pushed
3f47ff454588: Pushed
....
latest: digest: sha256:d3e1883b703c39556f2f09da14cc3b820f69a43436655c882c0c0ded0dda6a4b size: 3226

说明已经push成功。

  • 从私服中下载镜像:
docker pull reg.itmuch.com/kitematic/hello-world-nginx

配置登录认证

在很多场景下,我们需要用户登录后才能访问私有仓库,那么我们可以如下操作:

建立在上文生成证书,同时重启过Docker服务的前提下,我们讲解一下如何配置:

  • 为防止端口冲突,我们首先删除或停止之前启动好的私有仓库:
docker kill registry
  • 在node1机器上安装httpd-tools
yum install httpd-tools
  • 在node机器上创建密码文件,并添加一个用户testuser ,密码是testpassword
cd ~
mkdir auth
htpasswd -Bbn testuser testpassword > auth/htpasswd
  • 在node1机器上切换到~ 目录,并启动私有仓库(注意:如果直接粘贴运行,请删除掉注释):
docker run -d -p 443:5000 --restart=always --name registry2 \
-v /opt/docker-image:/var/lib/registry \ # 挂载容器内存储镜像路径到宿主机
-v `pwd`/certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/reg.itmuch.com.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/reg.itmuch.com.key \
-v `pwd`/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
registry:2
  • 测试:
docker push reg.itmuch.com/kitematic/hello-world-nginx

提示:

461f75075df2: Image push failed 
no basic auth credentials

说明需要认证。

我们登陆一下,执行:

docker login reg.imuch.com

再次执行

docker push reg.itmuch.com/kitematic/hello-world-nginx

就可以正常push镜像到私有仓库了。

注意:如果想要从私有仓库上下载镜像,同样需要登录。