搭建docker私有镜像仓库及部署 web管理端


1.安装centos和docker

  centos内核版本在3.10以上(推荐centos7以上),docker在1.6版本以上,具体安装docker和启动服务略过

2.官方获取docker registry镜像并启动

  #dockerpull registry 拉取官方私有仓库镜像registry

#docker run -d -p 5000:5000 --restart=always--privileged=true  --name registry -v /home/docker_file/repos:/var/lib/registry registry:latest

  说明:

   -v /home/docker_file/repos:/var/lib/registry  默认情况下,registry会将仓库存放于容器内的/var/lib/registry目录下(不同版本registry的路径可能不一样,具体官网查看其dockerfile),通过此设置将registry仓库地址修改为本机目录的/home/docker_file/repos


  –privileged=true
CentOS7中的安全模块selinux把权限禁掉了,参数给容器加特权,不加上传镜像会报权限错误(OSError: [Errno 13] Permission denied:‘/tmp/registry/repositories/liibrary’)或者(Receivedunexpected HTTP status: 500 Internal Server Error)错误

注:启动成功可以输入docker服务器ip:5000则会返回空白页面,私有仓库默认端口5000

3.验证本地镜像仓库

  拉取alpine镜像,然后修改tag(原tag:docker.io/alpine:latest),再push到本地镜像仓库,命令如下;

  # docker tag  alpine:latest localhost:5000/alpine:latest

  # docker pushlocalhost:5000/alpine:latest 将alpine上传到本地镜像仓库

  删除images中的alpine:latest,重新拉取本地镜像仓库的alpine:latest测试,如下:

  #docker rmi alpine:latest

  #docker pull localhost:5000/alpine:latest

  通过docker images可查看localhost:5000/alpine:latest证明本地镜像仓库安装成功

  #curl http://localhost:5000/v2/_catalog 查看本地镜像的列表

  #curl  http://localhost:5000/v2/image_name/tags/list  获取某个镜像的标签列表

 

 4.远程访问私有镜像仓库

   以上配置是只能当前服务器可访问仓库,要远程访问registry,需要配置客户端的docker访问模式支持http,docker与dockerregistry交互默认使用的是https,而搭建的私有仓库一般只提供http服务。

4.1 修改docker配置文件/etc/sysconfig/docker(ubuntu为/etc/default/docker)

   #vi /etc/sysconfig/docker

4.2 修改配置文件如下

OPTIONS='--insecure-registryregistry.hub:5000'

ADD_REGISTRY='--add-registryregistry.hub:5000' 

   说明:registry.hub为docker私有仓库服务器的ip或域名

4.3 重启docker

   #systemctl restart  docker.service

 

4.4 测试

   可以直接拉取刚才创建的docker私有仓库服务器的镜像,无需registry的域名和端口。

 

5.部署registry的web管理端

   registry的web ui工具目前主流的有docker-registry-frontend和docker-registry-web,根据docker hub上的stars流行度来说,本次使用docker-registry-frontend来搭建registry的web ui管理端,目前此版本仅支持私有仓库镜像的浏览。

直接从docker hub中拉取运行即可

  使用方法:

   # docker run -d -eENV_DOCKER_REGISTRY_HOST=192.168.17.129 -e ENV_DOCKER_REGISTRY_PORT=5000  -p 8080:80konradkleine/docker-registry-frontend:v2

说明:执行此命令,会自动从docker hub中下载并运行docker-registry-frontend

参数说明:

   ENV_DOCKER_REGISTRY_HOST 指定对应registry私服的域名或ip

   ENV_DOCKER_REGISTRY_PORT指定对应registry私服的端口

  docker-registry-frontend运行容器使用apacheweb服务器暴露80端口,外部访问需要做服务器和容器端口绑定,此处绑定服务器的8080端口。

 

 其它常用参数:

 -e ENV_DOCKER_REGISTRY_USE_SSL=1     registry私服仅能通过HTTPs访问
   -e ENV_MODE_BROWSE_ONLY=true  仅浏览不能关联镜像模式启动

   -eENV_DEFAULT_REPOSITORIES_PER_PAGE=50  修改web端每页的镜像数,默认20

   -e ENV_DEFAULT_TAGS_PER_PAGE=5 修改web端镜像每页的tag数,默认10

 

docker-registry-frontend支持https访问,需要映射端口和关联https证书

,参数如下:


  -v  $PWD/server.crt:/etc/apache2/server.crt:ro

 -v $PWD/server.key:/etc/apache2/server.key:ro

 -p 443:443

5.其它问题

启动web管理端后如无法加载任何镜像,报错如下:


原因是docker-registry-frontend容器内无法访问注册服务器,解决办法是通过容器互联,使前者可以访问注册服务器的对应5000端口,命令如下:

docker run -d -eENV_DOCKER_REGISTRY_HOST=registry -e ENV_DOCKER_REGISTRY_PORT=5000 -p 8080:80--link registry:registry konradkleine/docker-registry-frontend:v2

问题分析请参照我的问题解决历程:

https://github.com/kwk/docker-registry-frontend/issues/181

最后贴一个镜像管理页面的成功运行图: