搭建Docker registry私有仓库(容器方式)


目前网上搭建Docker Registry私有仓库的资料确实很多,但是大部门看着一步步走,最终也可能不成功。原因可能是系统,Docker的版本问题所致。

本次我使用的版本为:docker registry 2.2

docker 版本: 1.11.2

系统:Centos7

内核:3.10.0-327.el7.x86_64

带有TLS认证的registry容器

 
1、添加一个官方源:
 
  1. sudo tee /etc/yum.repos.d/docker.repo <<-'EOF' 
  2. [dockerrepo] 
  3. name=Docker Repository 
  4. baseurl=https://yum.dockerproject.org/repo/main/centos/7/ 
  5. enabled=1 
  6. gpgcheck=1 
  7. gpgkey=https://yum.dockerproject.org/gpg 
  8. EOF 

2、yum安装docker

  1. yum install docker-engine -y 

3、启动Docker,并配置开机启动:

  1. systemctl start docker 
  2. systemctl enable docker 

4、查看版本,新版本的变化:

  1. [root@bogon ~]# docker -v 
  2. Docker version 1.11.2, build b9f10c9 
 

5、pull仓库的镜像: 

  1. docker pull registry:2.2 
6、pull下来后就可以看到上图的镜像了;把此段写到一个sh,然后执行就可了。
 
  1. #前提条件系统安装了openssl-devel包: 
  2. #设置变量名 
  3. localdomain=$HOSTNAME 
  4. #创建SSL相关目录: 
  5. mkdir ~/certs 
  6. #生成SSL密钥: 
  7. openssl req -nodes -subj "/C=CN/ST=GuangDong/L=DongGuan/CN=$localdomain" -newkey rsa:4096 -keyout ~/certs/$localdo 
  8. main.key -out ~/certs/$localdomain.csr 
  9.  
  10. openssl x509 -req -days 3650 -in ~/certs/$localdomain.csr -signkey ~/certs/$localdomain.key -out ~/certs/$localdom 
  11. ain.crt 
  12.  
  13. #运行容器: 
  14. docker run -d -p 5000:5000 --restart=always --name registry \ 
  15. -v ~/certs:/certs \ 
  16. -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/$localdomain.crt \ 
  17. -e REGISTRY_HTTP_TLS_KEY=/certs/$localdomain.key \ 
  18. registry:2.2 
  19.  
  20. #添加ca证书到Docker 容器目录下: 
  21.  
  22. mkdir -p /etc/docker/certs.d/$localdomain:5000 
  23. cp ~/certs/$localdomain.crt /etc/docker/certs.d/$localdomain:5000/ca.crt 

运行:sh t.sh

 

 
  1. [root@registry ~]# docker ps -a 
  2. CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES 
  3. 510564b4e92e        registry:2.2        "/bin/registry /etc/d"   26 seconds ago      Up 26 seconds       0.0.0.0:5000->5000/tcp   registry 
查看镜像,并打上TAG:

 把镜像push到仓库上:

 

 
可以看到成功上传到仓库了;
中间遇到了一些错误:
 
  1. docker run -d -v /opt/docker/registry/:/var/lib/registry -p 5000:5000 --restart=always --name=registry registry:2.2 
Registry服务默认会将上传的镜像保存在容器的/var/lib/registry,我们将主机的/opt/docker/registry目录挂载到该目录,即可实现将镜像保存到主机的/opt/docker/registry目录了。
 
 
#如果执行上面创建命令提示:【端口被占用】
 
  1. docker: Error response from daemon: driver failed programming external connectivity on endpoint registry1 (0ff13e39c37d400fc79f04b72f5668c21d219730c4b728702f760e8ad48b787d): Bind for 0.0.0.0:5000 failed: port is already allocated. 
 
解决方法:修改一个端口,或者把占用端口的容器停止,再创建新容器;
 
 
#创建容器时提示:已经存在别名为registry的容器了;
 
  1. docker: Error response from daemon: Conflict. The name "/registry" is already in use by container c56b82e62245df74860c68c54d4d3c4d16578422f7c67664a8cb70ac5f19d726. You have to remove (or rename) that container to be able to reuse that name.. 
一般为相同名字的容器正在运行或者已经停止。解决方法:删除相同名字的容器,再重新创建;如果容器在测试时可以加上参数:--rm=true  退出时自动删除;
 
 
#删除容器时提示:很明显是容器正在运行着,需要停止后再删除
 
  1. [root@docker ~]# docker rm c56b82e62245 
  2. Error response from daemon: You cannot remove a running container c56b82e62245df74860c68c54d4d3c4d16578422f7c67664a8cb70ac5f19d726. Stop the container before attempting removal or use -f 
  3.  
  4. docker stop c56b82e62245 && docker rm c56b82e62245 
  5. 或者加上参数:-f 
  6. docker rm -f c56b82e62245 
  7. 批量删除容器: 
  8. docker rm -f $(docker ps -qa)