一、镜像仓库简介
Docker的镜像仓库是一个用于存储和管理Docker镜像的中央位置。镜像仓库的主要作用是提供一个集中的地方,让用户可以上传、下载、删除和共享Docker镜像。镜像仓库又可以分为公共镜像仓库和私有仓库镜像仓库:
-
公共镜像仓库
Docker Hub 是 Docker 官方提供的公共镜像仓库,也是最大的 Docker 镜像仓库之一。它提供了大量的公共镜像供用户使用。只不过Docker Hub 在国内访问速度较慢,一些国内的云服务商提供了类似于 Docker Hub 且更为稳定、快速的公共镜像仓库。例如,网易云镜像服务、DaoCloud 镜像服务、阿里云镜像服务等。 -
私有镜像仓库
在某些情况下,企业或个人可能需要在私有网络或受限制的环境中使用Docker镜像。这时就可以搭建自己的私有镜像仓库来存储和共享这些镜像,同时可以使用身份验证和授权来控制访问。Docker Registry 是 Docker 提供的官方仓库服务,将 Docker Registry 部署在自己的服务器上,并通过简单的配置来实现私有仓库的搭建。
二、搭建私有镜像仓库
搭建私有镜像仓库时,一般是拉取和运行 Docker 官方提供的 Registry 镜像来实现,只不过官网没有提供图形化界面,第三方提供了图形化界面的镜像可以拉取 docker-registry-ui 这个镜像。
2.1 通过 Registry 镜像搭建基础版的私有镜像仓库
(1)首先通过docker命令来拉取registry
镜像:
docker pull registry
(2)再到服务器上创建一个数据存储卷挂载到容器中的/var/lib/registry 目录,推送到私有镜像仓库的镜像都是存储到这个目录的。
mkdir -p /Users/smile/Desktop/soft/registry
(3)最后通过registry镜像启动容器。
docker run -d -p 5005:5000 -v /Users/smile/Desktop/soft/registry:/var/lib/registry registry
(4)容器运行成功后就可以往当前的这个私人镜像仓库里面推送和拉取镜像了。通过访问http://你的IP地址:5005/v2/_catalog
可以查看当前私有镜像服务中包含的镜像,只不过这样通过registry镜像启动容器只能算的上是一个基础版本的私人镜像仓库,具备仓库管理的完整功能,但是没有图形化界面。
2.2 搭建有图形化界面的私有镜像仓库
要搭建有图形化界面的私有镜像仓库,其实就是在已经通过registry镜像启动容器的前提下
,再通过docker-registry-ui 这个镜像再启动一个图形化界面容器。存储以及管理镜像还是在registry镜像启动的容器中完成,docker-registry-ui 镜像启动的容器只负责从registry镜像启动的容器中查询存储的镜像信息然后展示在页面上,所以这里通过docker-compose来同时启动这两个镜像的容器。
(1)首先拉取joxit/docker-registry-ui
镜像
docker pull joxit/docker-registry-ui
(2)再到服务器上创建一个registry-ui的安装目录
mkdir -p /Users/smile/Desktop/soft/registry-ui
(3)进入到registry-ui目录,然后创建并编辑 docker-compose.yml 文件
# 进入到registry-ui目录
cd registry-ui
# 创建并编辑 docker-compose.yml 文件
vim docker-compose.yml
# docker-compose.yml文件内容
version: '3.0' ## Docker Compose文件使用的是3版本的语法和功能
services: ## 指定要启动的服务
registry: ## 第一个启动的服务名
image: registry ## 第一个启动的服务使用的镜像
volumes: ## 指定启动服务时挂载的目录
- /Users/smile/Desktop/soft/registry:/var/lib/registry
- /Users/smile/Desktop/soft/registry/config.yml:/etc/docker/registry/config.yml
ports: ## 指定启动服务时主机端口的映射
- 5005:5000
registry-ui: ## 第二个启动的服务
image: joxit/docker-registry-ui ## 第二个启动的服务使用的镜像
ports: ## 指定启动服务时主机端口的映射
- 5006:80
environment:
- REGISTRY_TITLE=私有仓库
## 由于registry-ui启动后的容器需要访问 registry 镜像运行的容器,以便获取registry仓库中存放的镜像列表信息。
## 所以127.0.0.1就是对应启动registry服务的主机ip,5005就是对应启动registry服务的主机映射到容器的端口。
- REGISTRY_URL=http://127.0.0.1:5005
depends_on: ## 表明 registry-ui 依赖于 registry,这样就会先启动registry
- registry
(4)在 registry-ui 目录下运行 docker-compose 命令来执行docker-compose.yml配置文件启动容器。
docker-compose up -d
(5)最后打开浏览器输入 http://你的IP地址:5006
访问搭建好的 docker 私有镜像仓库的图像化页面。这里虽然页面能正常显示,但是还有两个问题需要解决
。
(6)第一个问题:默认为https,不允许http方式推送镜像。解决方式如下:
- centos系统:修改docker配置文件
/etc/docker/daemon.json
,在里面添加下面配置
{
## 配置http方式,指定启动registry镜像的主机ip+主机映射端口
"insecure-registries": ["http://127.0.0.1:5005"]
}
我是mac系统,使用的是Docker Desktop运行的,在设置里面找到Docker Engine,在里面加上上面的配置。
- 修改完后重载配置和重启docker服务。
sudo systemctl daemon-reload
sudo systemctl restart docker
(7)第二个问题:docker-registry-ui 镜像启动的容器调用registry镜像启动的容器获取存储的镜像时存在跨域问题。
解决方法:在registry镜像启动的容器中的config.yml
配置文件中添加docker-registry-ui 镜像启动的容器访问地址,允许跨域访问,一般是在启动registry镜像启动的容器时,在主机上新建一个同样的config.yml
配置文件,在主机上先改好,启动时再挂载到容器中。也可以启动后再进入到容器中去改,只不过稍微复杂点。
1.先到主机上创建文件并进行编辑:
vim config.yml
2. 输入下面内容:
version: 0.1
log:
fields:
service: registry
storage:
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
## 这里配registry-ui服务的主机ip+主机映射端口
Access-Control-Allow-Origin: ['http://127.0.0.1:5006']
Access-Control-Allow-Methods: ['HEAD', 'GET', 'OPTIONS', 'DELETE']
Access-Control-Allow-Headers: ['Authorization', 'Accept']
Access-Control-Max-Age: [1728000]
Access-Control-Allow-Credentials: [true]
Access-Control-Expose-Headers: ['Docker-Content-Digest']
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
3. 启动容器的时将这个config.yml文件挂载到容器的/etc/docker/registry/config.yml,我上面docker-compose.yml文件中启动registry容器时已经添加上去了。
做好上面这些修改好,把之前启动有问题的容器删除,重新在执行下docker-compose up -d
命令重新启动这两个服务的容器。
三、私有仓库镜像管理
(1)首先需要使用 tag
命令重新指定要推送的镜像的标签。因为要想将服务器上的 Docker 镜像推送到刚才搭建的私有镜像仓库中,必须指定该私有镜像的仓库的ip+端口。要想在使用push
命令推送镜像时同时指定要推送的私有镜像的仓库的ip+端口,就只能重新将镜像打个标签,且标签中必须带有要推送的私有镜像仓库的ip+端口。
docker tag nginx:latest 127.0.0.1:5005/nginx:latest
(2)使用push命令推送这个新打的tag镜像到私有仓库:
docker push 127.0.0.1:5005/nginx:latest
(3)使用pull命令拉取私有镜像仓库中的镜像:
docker pull 127.0.0.1:5005/nginx:latest
(4)删除私有仓库上传的镜像:
docker exec aff70d955cf7 rm -rf /var/lib/registry/docker/registry/v2/repositories/nginx