Docker 是一个开源的容器引擎,可以让开发者把应用以及依赖打包到一个可移植的容器中。Docker 采用Go语言编写,当时学习Go语言的时候已经知道这个神器,但是一直没有合适的场景正式使用,现在机会来啦。
Registry 是Docker 镜像的仓库,使用Registry 能搭建私有的Docker仓库,方便分发自定义镜像。
环境
本文的内容在以下版本中测试通过,不同的版本可能存在不同的地方,以下内容仅供参考。
1 |
[root@CentOS72-40 /] |
Docker 安装
安装Docker 需要内核是3.10 以上64位的Linux 系统。查看Linux 内核版本,CentOS7.2是没问题的。(现在Mac 和 Windows 都可以安装Docker)
1 |
[root@CentOS72-40 ~]# uname -r |
CentOS 7 之后的默认防火墙是firewall,习惯使用iptables 做防火墙,所以还是修改为iptables 做防火墙。
停止firewall ,然后禁止firewall 开机启动。
1 |
[root@CentOS72-40 ~] |
检查iptables 的状态,若没有安装iptables 服务则需要安装iptables-services。
1 |
[root@CentOS72-40 ~] |
编辑iptables 防火墙文档,开放22和5000端口(5000端口供Registry对外提供服务)。
1 |
[root@CentOS72-40 ~]# vim /etc/sysconfig/iptables |
设置iptables 防火墙开机启动,启动防火墙使更改的配置生效。
1 |
[root@CentOS72-40 ~] |
创建Docker 的yum 的仓库。
1 |
[root@CentOS72-40 ~]# tee /etc/yum.repos.d/docker.repo <<-'EOF' |
安装docker-engine 会自动安装依赖 docker-engine-selinux。
大专栏 Docker 安装与Registry V2私有仓库搭建">1 |
[root@CentOS72-40 ~] |
设置开机启动docker,然后启动docker。
1 |
[root@CentOS72-40 ~] |
安装完docker之后将会发现创建docker0网卡。
1 |
[root@CentOS72-40 /]# ifconfig |
配置Registry
拉取2.5.1版本的Registry 镜像。
1 |
[root@CentOS72-40 /] |
启动Registry镜像。根据Registry的文档把/tmp/registry-dev 目录映射出来是有问题的,真正的数据不是存储再这个目录。不知道是不新版的存在这个目录,反正2.5.1版的Registry 数据不是保存在这里,进入容器发现真正存储镜像的时在/var/lib/registry 目录,所以把这个目录映射出来。(跟着官方文档居然也走不通,郁闷,会不会是官方故意挖个坑让大家踩的呢)
1 |
[root-40 /]# docker run -d -p 5000:5000 -v /data/registry:/var/lib/registry --name registry registry:2.5.1 72 |
打开http://172.18.2.40:5000/v2/_catalog 验证是否安装成功。
若是启用iptables的时候没有放开5000端口,在registry 运行的时候再放开。之后停了registry 重新打开registry 就会有下面的错误。不仅仅是Registry这个容器存在这个问题,所有容器的在运行中,主机的iptables 被修改过,停了容器再启动都会有这个问题。目前没有找到好的解决版本,但是重新启动docker 服务 systemclt restart docker
可以临时解决这个问题。
1 |
Error response from daemon: driver failed programming external connectivity on endpoint registry (4b748e54bb59d8bfe1f1bd961c6f0fcfbd8ec94c75c5d4880134bd2a453b0d51): 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. |
使用Registry
对已经存在的镜像wendyeq/tomcat8
打上带Registry地址的tag,版本号位1.0。然后推送到Registry,发现推送不了,原因是Registry V2采用https协议。
1 |
[root@M-CentOS72-36 ~]# docker tag wendyeq/tomcat8 172.18 :5000/wendyeq/tomcat8:1.0 |
解决这个问题的最简单方式是修改docker的启动脚本,添加-H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock --insecure-registry 172.18.2.40:5000
内容。
1 |
[root@M-CentOS72-36 ~]# vim /usr/lib/systemd/system/docker.service |
修改完之后就可以推送到Registry 的私有仓库啦。
1 |
[root@M-CentOS72-36 ~] |
总结
Docker 和 Registry 的安装都比较简单,但是Registry查找镜像好麻烦,特别是查看版本号,要好好研究一下Registry 的文档才行。