578 Star 1.6K Fork 702

大目 / spring-cloud-book

Create your Gitee Account
Explore and code with more than 8 million developers,Free private repositories !:)
Sign up
This repository doesn't specify license. Please pay attention to the specific project description and its upstream code dependency when using it.
Clone or Download
3.5 Docker私有仓库的搭建与使用.md 7.07 KB
Copy Edit Web IDE Raw Blame History
大目 authored 2016-10-28 16:43 . 勘误

3.5 Docker私有仓库的搭建与使用

和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镜像到私有仓库了。

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

参考文档:

官方文档:https://docs.docker.com/registry/deploying/#/running-a-domain-registry

Docker Registry V2 htpasswd认证方式搭建:http://www.tuicool.com/articles/vMZZveM

Docker Registry V2搭建:http://www.tuicool.com/articles/6jEJZj

Docker Registry V2搭建:http://tomhat.iteye.com/blog/2304098

Docker Registry V1搭建:http://blog.csdn.net/wsscy2004/article/details/26279569

非认证的Docker Registry V1搭建:http://blog.csdn.net/wangtaoking1/article/details/44180901

带认证的Docker Registry V1搭建:http://snoopyxdy.blog.163.com/blog/static/601174402015823741997/

Docker专题汇总:http://www.zimug.com/360.html

Docker疑难解答:https://segmentfault.com/q/1010000000938076

Comment ( 3 )

Sign in to post a comment

Java
1
https://gitee.com/itmuch/spring-cloud-book.git
git@gitee.com:itmuch/spring-cloud-book.git
itmuch
spring-cloud-book
spring-cloud-book
master

Search