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