SSL及Nginx代理搭建环境的Docker仓库

使用私有仓库有许多优点:节省网络带宽,针对于每个镜像不用每个人都去中央仓库上面去下载,只需要从私有仓库中下载即可;提供镜像资源利用,针对于公司内部使用的镜像,推送到本地的私有仓库中,以供公司内部相关人员使用。

我的环境:CentOS-7-x86_64-Everything-1511

Docker版本:Version: 1.10.3,API version: 1.22,Go version: go1.5.3

在下载Linux发行版的时候需要下载较新的版本,Docker所支持的Linux kernel版本过低会出现问题。

一、安装Docker

CentOS中更新源后安装docker,官网https://docs.docker.com/engine/installation/linux/centos/

安装完成Docker环境之后不要去关闭CentOS的防火墙和Selinux,因为Docker的安全机制是基于iptables的,关闭selinux会是的Docker的安装出错。

Docker: Error response from daemon: failed to create endpoint registry on network bridge: iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 5000 -j DNAT --to-destination 172.17.0.2:5000 ! -i docker0: iptables: No chain/target/match by that name.

(exit status 1).

二、安装Docker Registry

目前Docker Registry已经升级到了v2,最新版的Docker已不再支持v1。Registry v2使用Go语言编写,在性能和安全性上做了很多优化,重新设计了镜像的存储格式。

1.官网安装 registry

https://docs.docker.com/registry/

2.使用Docker-compose安装(推荐)

Docker-compose是一个非常有用的Docker运行,管理的工具。你可以通过定义compose文件,使用简单的一条命令同时起多个Docker Container运行不同的服务。Docker-compose对于开发,测试,环境保存以及CI都提供了非常大的便利。

Docker-compose是用Python开发的一个工具,所以可以用pip直接安装。

需要注意的是,docker-compose可能对requests module的版本有限制,而本机上可能安装了更高版本的requests模块,造成运行时报错。可以使用pip-conflict-checker检查版本冲突,卸载不合适的版本,重新安装一个合适的版本。

实际使用操作中使用pip安装的docker-compose可能在执行时还会报代码有bug。

所以推荐直接从github中下载稳定的release版本安装。

安装htpasswd

因为需要使用nginx提供安全验证的功能,需要一个地方放置用户名和密码对。

使用由httpd-tools提供的htpasswd工具生成用户名密码对。

安装httpd-tools.

三、运行Registry Container并使用Nginx做代理

运行nginx和registry容器

创建一个工作目录,例如/data/programs/docker,并在该目录下创建docker-compose.yml文件,将以下docker-compose.yml内容复制粘贴到你的docker-compose.yml文件中。

内容大致意思为,基于“nginx:1.9” image运行nginx容器,暴露容器443端口到host 443端口。并挂载当前目录下的nginx/目录为容器的/etc/nginx/config.d目录。

nginx link到registry容器。基于registry:2 image创建registry容器,将容器5000端口暴露到host 5000端口,使用环境变量指明使用/data为根目录,并将当前目录下data/文件夹挂载到容器的/data目录。

配置nginx

在nginx目录中创建registry.conf文件配置nginx。配置nginx与registry的关系,转发端口,以及其他nginx的配置选项。复制,粘贴如下内容到你的registry.conf文件中:

配置文件创建完成后,回到工作目录执行docker-compose up运行registry和nginx容器。

执行docker-compose up后。注意是否有容器启动失败的消息,如果容器启动失败的消息,需要检查网络,是否能从dockerhub上pull image(需代理,或使用使用国内镜像,使用国内镜像需更改docker-compose.yml文件中image项)。也由可能粘贴配置文件错误,需仔细检查。

启动后也可以使用docker ps命令查看是否两个容器都正常运行。

确定docker容器都正常运行后,用curl 命令验证功能是否正常运行。使得localhost:5000和localhost:443访问registry都应该返回{}。

#都是返回{}

使用ctrl-c退出docker-compose,继续后面的步骤。

添加用户名和密码

在/data/programs/docker/nginx目录下执行下面命令创建用户名和密码对,如果要创建多个用户名和密码对,则不是使用“-c“选项。

然后修改Registry.conf文件,取消下面三行的注释。

再次执行docker-compose up运行registry,这时使用localhost:5000端口访问得到的结果为”{}”,但是使用localhost:443访问将得到”401 Authorisation Required“的提示。加入用户名和密码验证才能得到与直接访问registry 5000端口相同的结果。

四、加入SSL验证

如果你有经过认证机构认证的证书,则直接使用将证书放入nginx目录下即可。如果没有,则使用openssl创建自己的证书。

进行/data/programs/docker/nginx目录,生成一个新的root key

生成根证书(一路回车即可)

为server创建一个key。(这个key将被nginx配置文件registry.con中ssl_certificate_key域引用)

制作证书签名请求。注意在执行下面命令时,命令会提示输入一些信息,”Common Name”一项一定要输入你的域名(官方说IP也行,但是也有IP不能加密的说法),其他项随便输入什么都可以。不要输入任何challenge密码,直接回车即可。

签署认证请求

配置nginx使用证书

修改registry.conf配置文件,取消如下三行的注释

运行Registry

执行docker-compose up -d在后台运行Registry,并使用curl验证结果。这时使用localhost:5000端口仍然可以直接访问Registry,但是如果使用443端口通过nginx代理访问,因为已经加了SSL认证,所以使用http将返回“400 bad request”

应该使用https协议

由于是使用的未经任何认证机构认证的证书,并且还没有在本地应用自己生成的证书。所以此时会提示使用的是未经认证的证书,可以使用“-k"选项不进行验证。

五、Docker客户端使用Registry

添加证书

Centos 6/7 添加证书具体步骤如下:

安装ca-certificates包

使能动态CA配置功能

将key拷贝到/etc/pki/ca-trust/source/anchors/

使新拷贝的证书生效

证书拷贝后,需要重启docker以保证docker能使用新的证书

Docker pull/push image测试

制作要push到registry的镜像

#查看本地已有镜像

#为本地镜像打标签

push测试

#不登陆直接push镜像到registry,会提示失败

#登陆后,再试

#可以push 镜像到registry

搜索镜像

pull测试

#不登陆registry直接pull镜像也会失败

#登陆后再测试

#登陆后可以pull

六、CentOS 7安装Docker及常用命令

原文发布于微信公众号 - SDNLAB(SDNLAB)

原文发表时间:2016-04-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏未闻Code

使用Docker Swarm搭建分布式爬虫集群

在爬虫开发过程中,你肯定遇到过需要把爬虫部署在多个服务器上面的情况。此时你是怎么操作的呢?逐一SSH登录每个服务器,使用git拉下代码,然后运行?代码修改了,于...

25620
来自专栏Rainbond开源「容器云平台」

Docker 网络构造:Docker如何使用Linux iptables和Interfaces

28320
来自专栏Jerry的SAP技术分享

Kubenetes里pod和service绑定的实现方式

我之前的文章 如何在Kubernetes里创建一个Nginx service介绍了如何创建一个Kubernetes pod和service,使用的方法是命令ku...

17130
来自专栏北京马哥教育

docker容器技术系列六:docker容器的数据管理

刚接触docker时总在思考两个问题: 1、docker容器如何实现将数据持久化呢?比如一个httpd容器中用户上传的文件或者访问日志等! 2、如何实现便捷的更...

29580

Docker Hub:保存并分享你的Docker镜像

原文地址:https://dzone.com/articles/docker-hub-save-and-share-your-docker-images

335110
来自专栏openshift持续集成

构建Docker镜像两种方式的比较-Dockerfile方式和S2I方式

写Dockerfile是构建Docker镜像最通常的方式,接触过Docker的童鞋多少了解一些。前段时间研究OpenShift(paas的一种),发现了另外一种...

41470
来自专栏编程坑太多

『中级篇』docker-swarm中的Service创建维护和水平扩展(45)

PS:docker service 内部有很多复杂的操作,虽然各位老铁用了简单的 一个创建一个删除,但是底层里面会知道有多个容器,在那个机器上边,这些机器里面...

10230
来自专栏KaliArch

Kubernetes+Prometheus+Grafana部署笔记

Kubernetes(通常写成“k8s”)Kubernetes是Google开源的容器集群管理系统。其设计目标是在主机集群之间提供一个能够自动化部署、可拓展、应...

53740
来自专栏魏艾斯博客www.vpsss.net

军哥 LNMP 1.5 测试版发布

33030
来自专栏编程坑太多

跟我一起学docker(五)--仓库

19740

扫码关注云+社区

领取腾讯云代金券