但有时候使用Docker Hub这样的公共仓库可能不方便,这种情况下用户可以使用registry创建一个本地仓库供私人使用,这点跟Maven的管理类似。
使用私有仓库有许多优点:
1)节省网络带宽,针对于每个镜像不用每个人都去中央仓库上面去下载,只需要从私有仓库中下载即可; 2)提供镜像资源利用,针对于公司内部使用的镜像,推送到本地的私有仓库中,以供公司内部相关人员使用。
目前Docker Registry已经升级到了v2,最新版的Docker已不再支持v1。Registry v2使用Go语言编写,在性能和安全性上做了很多优化,重新设计了镜像的存储格式。如果需要安装registry v2,只需下载registry:2.2即可。Docker官方提供的工具docker-registry可以用于构建私有的镜像仓库。废话不多说了,下面记录下Docker私有仓库构建的过程:
选择一台服务器(内外网地址:192.168.1.23/103.110.186.23),用于搭建私有仓库。(前提是该机器安装了Docker) 1)从Docker官方仓库里下载registry镜像 [[email protected] ~]# docker pull registry ---------------------------------------------------------------- 或者: [[email protected] ~]# docker pull registry:2.1.1 ---------------------------------------------------------------- 下载完之后,可以通过该镜像启动一个容器 [[email protected] ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/registry latest 047218491f8c 3 weeks ago 33.17 MB 默认情况下,会将私有仓库存放于容器内的/tmp/registry目录下,这样如果容器被删除,则存放于容器中的镜像也会丢失。 所以一般情况下会指定本地一个目录挂载到容器内的/tmp/registry下,如下: [[email protected] ~]# docker run -d --name=my_registry -p 5000:5000 -v /opt/data/registry:/tmp/registry registry 9fe45329bda17f61da04e6e8d2faf124fb22665a25270421bb8979a419809446 [[email protected] ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9fe45329bda1 registry "/entrypoint.sh /etc/" 2 seconds ago Up 2 seconds 0.0.0.0:5000->5000/tcp my_registry 由上可以看到,已经启动了一个容器,地址为:192.168.1.23:5000。 2)测试 接下来可以把一个本地镜像push(如下面的tomcat7镜像)到私有仓库中。 [[email protected] ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat7 latest 2ec9e2eb978a 3 days ago 562.3 MB 修改一下该镜像的tag标识。 [[email protected] ~]# docker tag tomcat7 192.168.1.23:5000/tomcat7 接下来把上面修改tag后的镜像上传到私有仓库。 [[email protected] ~]# docker push 192.168.1.23:5000/tomcat7 The push refers to a repository [192.168.1.23:5000/tomcat7] unable to ping registry endpoint https://192.168.1.23:5000/v0/ v2 ping attempt failed with error: Get https://192.168.1.23:5000/v2/: http: server gave HTTP response to HTTPS client v1 ping attempt failed with error: Get https://192.168.1.23:5000/v1/_ping: http: server gave HTTP response to HTTPS client 出现上面错误的原因分析: 因为Docker从1.3.X之后,与docker registry交互默认使用的是https,然而此处搭建的私有仓库只提供http服务,所以当与私有仓库交互时就会报上面的错误。 为了解决这个问题需要在启动docker server时增加启动参数为默认使用http访问。 需要在docker的配置文件/etc/sysconfig/docker (ubuntu系统中的docker配置文件时/etc/default/docker )添加参数“--insecure-registry=192.168.1.23:5000”。 ----------------------------------------------------------------------------------------------------------- 注意:这个是在客户机的docker配置文件里添加的。 比如说在A机器上将它的镜像上传到192.168.1.23的私有仓库上,那么就在A机器的本地docker配置文件中添加。 我这里测试用的是同一台机器,即将192.168.1.23本机的镜像上传到它的仓库内。 ----------------------------------------------------------------------------------------------------------- [[email protected] ~]# vim /etc/sysconfig/docker ....... OPTIONS=‘--selinux-enabled --log-driver=journald‘ 改为 OPTIONS=‘--selinux-enabled --log-driver=journald --insecure-registry=192.168.1.23:5000‘ [[email protected] ~]# service docker restart 由于docker服务重启后,所有容器都会被关闭。所以需要在docker重启后再次启动容器 [[email protected] ~]# docker start my_registry my_registry [[email protected] ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9fe45329bda1 registry "/entrypoint.sh /etc/" 39 minutes ago Up 10 minutes 0.0.0.0:5000->5000/tcp my_registry 再次提交到私有仓库 [[email protected] ~]# docker push 192.168.1.23:5000/tomcat7 The push refers to a repository [192.168.1.23:5000/tomcat7] c6d7ce9e90d7: Pushed 34e7b85d83e4: Pushed latest: digest: sha256:5fdcbaf254cb44dd26645f606cccea8de76118baff03485e40853c691a15956d size: 720 [[email protected] ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE 192.168.1.23:5000/tomcat7 latest 2ec9e2eb978a 3 days ago 562.3 MB tomcat7 latest 2ec9e2eb978a 3 days ago 562.3 MB docker.io/registry latest 047218491f8c 3 weeks ago 33.17 MB 可以看到镜像已经push到私有仓库中去了。 接下来删除本地的tomcat7镜像,然后从私有仓库中pull下来该镜像。 [[email protected] ~]# docker rmi tomcat7:latest //或者docker rmi tomcat7:latest [[email protected] ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE 192.168.1.23:5000/tomcat7 latest 2ec9e2eb978a 3 days ago 562.3 MB docker.io/registry latest 047218491f8c 3 weeks ago 33.17 MB 然后根据私有仓库里的镜像创建tomcat容器 [[email protected] ~]# docker run -t -i -d --name=tomcat -p 8888:8080 192.168.1.23:5000/tomcat7 /bin/bash 9c0f5d6249a1e4671df932cb299ca151dbac02d1063d261fe82a860d5fa19f7b [[email protected] ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9c0f5d6249a1 192.168.1.23:5000/tomcat7 "/bin/bash" 4 seconds ago Up 3 seconds 0.0.0.0:8888->8080/tcp tomcat 9fe45329bda1 registry "/entrypoint.sh /etc/" 53 minutes ago Up 24 minutes 0.0.0.0:5000->5000/tcp my_registry [[email protected] ~]# docker attach tomcat [[email protected] /]# /usr/local/tomcat7/bin/startup.sh Using CATALINA_BASE: /usr/local/tomcat7 Using CATALINA_HOME: /usr/local/tomcat7 Using CATALINA_TMPDIR: /usr/local/tomcat7/temp Using JRE_HOME: /usr Using CLASSPATH: /usr/local/tomcat7/bin/bootstrap.jar:/usr/local/tomcat7/bin/tomcat-juli.jar Tomcat started. [[email protected] /]# 宿主机的iptables里开放映射端口8888的访问,然后外部访问容器的tomcat服务:
时间: 2024-10-23 17:30:52