Docker私有仓库部署实战

本文记录以 Docker 官方提供的镜像 Registry 创建本地私有仓库,创建方式和启动一个普通镜像的方式是一样。
两台安装好 docker 环境的主机
服务端:192.168.3.82 私有仓库服务器在,运行 registry 容器
客户端:192.168.3.83 测试客户端,用于上传、下载镜像文件 1.在私有仓库服务器快速创建镜像仓库,
运行如下代码:

docker pull registry
mkdir /docker/registry -p
docker run -itd -v /data/docker/registry:/var/lib/registry -p 5000:5000 \
-e "REGISTRY_STORAGE_DELETE_ENABLED=true" --restart=always --name registry registry:latest

运行上述命令后,会从 DockerHub 上拉取 registry 镜像并在本地启动 Registry 服务,并监听 5000 端口。 
参数说明
1)-itd:在容器中打开一个伪终端进行交互操作,并在后台运行;
2)-v:把宿主机的/docker/registry 目录绑定到容器/docker/registry 目录(这个目录是 registry 容器中存放镜像文件的目录),来实现数据的持久化;
3)-p:映射端口;访问宿主机的 5000 端口就访问到 registry 容器的服务了;
4)--restart=always:这是重启的策略,假如这个容器异常退出会自动重启容器;
5)--name registry:创建容器命名为 registry,可自定义任何名称;
6)registry:latest:这个是刚才 pull 下来的镜像

查看远程仓库文件:

curl http://localhost:5000/v2/_catalog {"repositories":[]}

同样也可以使用浏览器访问 http://server-ip:5000/v2/\_catalog, 结果相同,都是空的没有任何文件。

客户端操作

docker pull nginx
docker tag nginx:latest 192.168.3.82:5000/nginx:v1
docker images


上面的操作方法将镜像打了个标签。 这个过程其实描述了 镜像仓库的地址,这种仓库设计方法很巧妙

docker push 192.168.3.82:5000/nginx:v1

Push 过程中会遇到如下问题。仓库要求使用 https 形式进行上传。
The push refers to repository [docker.new-coder.cn:5000/nginx]
Get https://docker.new-coder.cn:5000/v2/: http: server gave HTTP response to HTTPS client
解决的方法: 增加可信地址进去, 配置完成后需要重启 docker,是在客户机上配置,并非仓库机上配置。

vim /etc/docker/daemon.json
{
  "insecure-registries":["docker.new-coder.cn:5000"]
}

docker push 192.168.3.82:5000/nginx:v1
curl http://docker.new-coder.cn:5000/v2/_catalog  #查看仓库中镜像
curl http://docker.new-coder.cn:5000/v2/dh_data/tags/list #查看某个镜像的具体信息

下载镜像进行验证,首先要删除掉本地的镜像。

docker pull 192.168.3.82:5000/nginx:v1

下面研究下如何删除镜像

curl --header "Accept: application/vnd.docker.distribution.manifest.v2+json"  -I -X HEAD \
http://docker.new-coder.cn:5000/v2/nginx/manifests/v1

执行完成以后得到了如下的信息:

HTTP/1.1 200 OK
Content-Length: 948
Content-Type: application/vnd.docker.distribution.manifest.v2+json
Docker-Content-Digest: sha256:
Docker-Distribution-Api-Version: registry/2.0
Etag: "sha256:"
X-Content-Type-Options: nosniff
Date: Fri, 24 May 2019 00:56:55 GMT

删除镜像的命令结构如下,伪代码:

DELETE /v2/<name>/manifests/<reference>

name:镜像名称
reference: 镜像对应 sha256 值

注意删除的时候必须开启镜像可删除选项。

curl --header "Accept: application/vnd.docker.distribution.manifest.v2+json"  -I -X \
 DELETE http://docker.new-coder.cn:5000/v2/nginx/manifests/sha256:

删除完成后进行垃圾回收,在镜像服务器上执行:

docker exec -it registry  /bin/registry garbage-collect  /etc/docker/registry/config.yml
关于我
loading
在线编辑器