Docker仓库分为公有仓库和私有仓库
公有仓库是由Docker官方或其他第三方提供的开放性镜像仓库,其中最著名的就是Docker Hub。在Docker Hub上,用户可以浏览、搜索、下载和上传各种类型的Docker镜像,包括官方镜像、社区镜像和个人镜像等。Docker Hub还提供了一些高级功能,如自动化构建、组织管理、Webhooks等。公有仓库是Docker生态系统中非常重要的组成部分,它使得用户可以快速找到和共享Docker镜像,并与其他用户进行协作和交流。
私有仓库是由企业或个人自己搭建和管理的镜像仓库,通常用于存储和分享私有的Docker镜像。私有仓库可以帮助用户更好地控制镜像的访问和安全性,同时也提供了更高的灵活性和自定义性。在私有仓库中,用户可以创建自己的命名空间、团队和镜像仓库,并设置访问权限、认证方式、镜像复制等功能。当用户需要在企业内部或特定的云环境中使用Docker镜像时,私有仓库是一个非常有用的选择。
Docker Registry是一个用于存储和分发Docker镜像的开源项目。它提供了集中式的镜像管理、版本控制、安全性控制、访问控制等功能,使得Docker镜像的存储和共享更加便捷和可靠。在Docker生态系统中,Docker Registry是一个非常重要的组件,它可以帮助企业或个人构建自己的私有镜像仓库,并与Docker Hub等公共Registry进行交互和协作。
我们可使用docker-registry项目或者Docker Registry 2.0来搭建私有仓库,但docker-registry已被官方标记为过时,所以一般使用Docker Registry 2.0
使用以下命令就直接启动registry容器:
docker run -d -p 5000:5000 --restart=always --name registry2 registry:2
Registry默认的存储位置为/var/lib/registry,可以通过-v参数来映射本地的路径到容器内。
docker run -d -p 5000:5000 --restart=always --name registry2 -v /opt/data/registry:/var/lib/registry registry:2
Registry默认的配置文件地址为/etc/docker/registry/config.yml,如果我们想使用主机上的配置文件,也可以将本地目录挂载到该目录,在启动命令添加以下命令即可,path为主机配置文件的路径
-v /path/config.yml:/etc/docker/registry/config.yml
私有仓库配置
私有仓库需要启用TLS认证,否则会报错。我们可以通过两种方法来解决
1、添加DOCKER_OPTS变量
Linux位置:/etc/default/docker 或 /etc/sysconfig/docker
修改Registry server上的Docker daemon的配置,为DOCKER_OPTS增加–insecure-registry:
DOCKER_OPTS="--insecure-registry ip:port ....”
ip:port为Registry server的ip和端口
如果采用insecure registry的模式,那么所有与Registry交互的主机上的Docker Daemon都要配置:–insecure-registry选项,所以使用Registry 的客户端也需要配置–insecure-registry
2、生成TLS证书
前提:先创建域名
修改一下/etc/hosts文件:
ip mydockerhub.com
#创建文件夹
mkdir -p certs
#生成证书
openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/myrepo.key -x509 -days 365 -out certs/myrepo.crt
注:CN要填入跟访问的地址相同的域名,例如这里应该为myrepo.com。
生成结果为秘钥文件myrepo.key,以及证书文件myrepo.crt。 其中证书文件需要发送给用户,并且配置到用户Docker Host上,注意路径需要跟域名一致,例如:
将生成的证书文件复制到客户端的ca文件
/etc/docker/certs.d/myrepo.com:5000/ca.crt
docker run -d -p 5000:5000 --restart=always --name registry2 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/myrepo.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/myrepo.key \
registry:2
REGISTRY_HTTP_TLS_CERTIFICATE为证书文件,REGISTRY_HTTP_TLS_KEY为密钥文件
首先使用标签指定仓库:
语法:
docker tag <镜像名称>:<标签> <仓库名称>/<镜像名称>:<标签>
示例:
#registry.example.com:5000为docker reistry的域名和端口
docker tag myimage:latest registry.example.com:5000/myimage:latest
推送镜像
docker push registry.example.com:5000/myimage:latest
这个命令将本地的myimage:latest镜像推送到名为registry.example.com:5000的远程Docker仓库中。
拉取镜像
docker pull registry.example.com:5000/myimage:latest