1. 拉取 Docker Registry
Docker Registry 是 Docker 的镜像仓库项目,通过它来部署私有的镜像仓库,用于镜像的存储与分发。
它同样也是一个镜像,直接使用「docker pull」拉取下来:
# docker pull registry
如果要指定某个版本,加上tag,上面默认拉取最新版本。
拉取成功,镜像信息如下:
[root@localhost ~]# docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/registry latest f32a97de94e1 2 weeks ago 25.8 MB
2. 运行仓库镜像
使用「docker run」来运行这个仓库容器:
[root@localhost ~]# docker run -itd -v /var/registry:/data/registry -p 5000:5000 --restart=always --name bluerepo f32a9
969b57b7312612197a1732b3f051af164c01e25160f61f3f8448e...
运行成功,且容器ID = 969b5
【options】:
-it:为容器分配一个伪终端
-d:后台模式运行容器
-v:将宿主机的目录绑定并映射到仓库容器的目录,用于存放上传到该仓库的镜像文件,例如上面,是将宿主机的/var/registry目录绑定到容器的/data/registry目录
-p:映射端口,在宿主机上的应用容器,有自己的私有IP,如果想要访问这个应用容器中的某个应用,对外部来说比较难,但docker提供的这个 -p 参数可以将宿主机上的端口映射到应用容器的端口,例如上面,是将宿主机的5000端口映射到容器的5000端口,访问宿主机的5000端口即可访问这个仓库的服务。
—restart=always:若容器异常退出会自动重启容器
—name:给容器命名
另外,可以使用「docker ps」查看:
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
969b57b73126 f32a9 "/entrypoint.sh /e..." 40 minutes ago Up 40 minutes 0.0.0.0:5000->5000/tcp
最后一列「ports」,表明宿主机的 5000 端口被映射到了容器的 5000 端口。
此时,执行curl http://127.0.0.1:5000/v2/_catalog
获得如下响应:
{"repositories":[]}
响应结果是一个空的 json 数组,表示目前仓库里还没有任何镜像。
OK,私有仓库已经创建和启动完毕了,接下来试试怎样使用?
3. 上传镜像到私有仓库
现在,想将另一台服务器(192.168.1.7)中的nginx镜像上传到该仓库中(宿主机IP:192.168.1.8)
①查看下本地宿主机上的nginx镜像信息:
[root@localhost ~]# docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/nginx latest 881bd08c0b08 3 weeks ago 109 MB
需要给这个镜像添加一个带有私有仓库IP的TAG,这样后面才能成功推送到私有仓库:
# docker tag 881bd 192.168.1.8:5000/nginx:v2.9
执行完成后会出现一个新的镜像:
[root@localhost ~]# docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.1.8:5000/nginx v2.9 881bd08c0b08 3 weeks ago 109 MB
docker.io/nginx latest 881bd08c0b08 3 weeks ago 109 MB
REPOSITORY = 192.168.1.8:5000/nginx。
②将镜像推送到私有仓库中
[root@localhost ~]# docker push 192.168.1.8:5000/nginx:v2.9
The push refers to a repository [192.168.1.8:5000/nginx]
Get https://192.168.1.8:5000/v1/_ping: http: server gave HTTP response to HTTPS client
显示上传失败,原因是 推送镜像到仓库用的是https ,但现在是http, 修改下该服务器的daemon配置即可(虽然官方不推荐这种方式,但简单,对于内部网络而言已经基本满足要求,免去了制作和部署证书这些繁琐的步骤,有兴趣的话可以google下),修改 /etc/docker/daemon.json:
修改前:
{
"registry-mirrors":["http://f138hde2.m.daocloud.io"]
}
修改后:
{
"registry-mirrors":["http://f138hde2.m.daocloud.io"],
"insecure-registries": [ "192.168.1.8:5000"]
}
执行# systemctl restart docker
使配置生效。
再次上传镜像到私有仓库:
[root@localhost ~]# docker push 192.168.1.8:5000/nginx:v2.9
The push refers to a repository [192.168.1.8:5000/nginx]
3e9eb35b1c23: Pushed
c59b3ca455e3: Pushed
6744ca1b1190: Pushing [=======> ] 8.126 MB/55.28 MB
OK,显示正在上传中。
③查看下私有仓库中的镜像信息
[root@localhost ~]# curl 192.168.1.8:5000/v2/_catalog
{"repositories":["nginx"]}
一个 nginx 镜像已经存在仓库中了。
4. 从私有仓库下载镜像到本地
[root@localhost ~]# docker pull 192.168.1.8:5000/nginx:v2.9
Trying to pull repository 192.168.1.8:5000/nginx ...
v2.9: Pulling from 192.168.1.8:5000/nginx
f7e2b70d04ae: Pull complete
08dd01e3f3ac: Pull complete
d9ef3a1eb792: Pull complete
Digest: sha256:7734a210432278817f8097acf2f72d20e2ccc7402a0509810c44b3a8bfe0094a
Status: Downloaded newer image for 192.168.1.8:5000/nginx:v2.9
执行成功。