Docker仓库
前言
镜像构建完成后,可以很容易的在当前机器上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry
就是这样的服务。
Docker Registry
一个 Docker Registry
中可以包含多个仓库Repository
;每个仓库可以包含多
个标签Tag
;每个标签对应一个镜像
。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的
各个版本。我们可以通过 <仓库名>:<标签>
的格式来指定具体是这个软件哪个版
本的镜像。如果不给出标签,将以 latest
作为默认标签。
以 Ubuntu
镜像 为例, ubuntu
是仓库的名字,其内包含有不同的版本标签,
如, 14.04
, 16.04
。我们可以通过 ubuntu:14.04
或者 ubuntu:16.04
来具体指定所需哪个版本的镜像。如果忽略了标签,比如 ubuntu
那将视为ubuntu:latest
。
仓库名经常以两段式路径 形式出现,比如 jwilder/nginx-proxy
,前者往往意
味着 Docker Registry
多用户环境下的用户名,后者则往往是对应的软件名。但这
并非绝对,取决于所使用的具体 Docker Registry
的软件或服务。
DockerHub
简介
Docker Registry
公开服务是开放给用户使用、允许用户管理镜像的 Registry
服
务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务
供用户管理私有镜像。最常使用的 Registry
公开服务是官方的 Docker Hub
,这也是默认的 Registry
,并拥有大量的高质量的官方镜像。
注册
Docker Hub
是Docker
官方维护的公共镜像注册中心,用户可以将自己的镜像推送到Docker Hub
免费的仓库中,要想使用Docker Hub
得先注册一个Docker Hub
账号.
账号注册地址:https://hub.docker.com/ (注意要想成功注册账号得先科学上网)
登录
可以通过执行 docker login
命令来输入用户名、密码和邮箱来完成注册和登
录。 注册成功后,本地用户目录的 .dockercfg 中将保存用户的认证信息。
1 | docker login -u 用户名 -p 密码 |
查找镜像
用户无需登录即可通过 docker search
命令来查找官方仓库中的镜像。
1 | docker@default:~$ docker search appium |
可以看到返回了很多包含关键字的镜像,其中包括镜像名字、描述、星级(表示该
镜像的受欢迎程度)、是否官方创建、是否自动创建。 官方的镜像说明是官方项目
组创建和维护的。
拉取镜像
使用docker pull
命令可以从DockerHub
拉取镜像。
1 | docker@default:~$ docker pull ubuntu |
私有仓库
为何使用私有仓库
我们在使用Docker的时候,经常需要使用到docker pull
命令从DockerHub
拉取我们需要的镜像,进行操作。这样其实有利也有弊,docker hub
是官方维护的公用仓库,也是最大、最全的docker
镜像仓库。每个人有一个DockerHub hub
的账号即可将自己的上传到DockerHub
上,方便随时拉取使用。
但是DockerHub
有个弊端就是受网络带宽影响,有时候下载速度稍微有些不好。docker官方呢,在DockerHub
上提供了一个registry
镜像,我们使用这个镜像就可以搭建一个私有的注册服务器。我们可以通过把常用的镜像都放到私有的registry
上,这样就避免了经常去DockerHub
上拉取的操作,效率可以得到一定的提高。此外,针对于公司内部使用的镜像,推送到本地的私有仓库中,以供公司内部相关人员使用。
搭建步骤
- 首先拉取
registry
镜像
1 | docker@default:~$ docker pull registry |
- 启动容器
1 | sudo docker run -d -p 5000:5000 registry |
默认情况下,会将仓库存放于容器内的/tmp/registry
目录下,这样如果容器被删除,则存放于容器中的镜像也会丢失,所以我们一般情况下会指定本地一个目录挂载到容器内的/tmp/registry
下,如下:
1 | sudo docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry |
-v
参数来将镜像文件存放在本地的指定路径
启动之后我们可以看到启动之后的容器。
1 | docker@default:/$ docker ps -a |
上传镜像
搭建好私有仓库,那么我们可以开始测试上传镜像到私有仓库。首先我们拉取hello-world
镜像做为上传对象。
1 | sudo docker pull hello-world |
tag标记
下载完镜像之后,我们可以使用docker tag
命令将该镜像归入到我们本地的仓库。
1 | docker@default:/$ docker tag hello-world 192.168.99.101:5000/hello-world |
192.168.99.101:5000
:iP地址为docker私有仓库的机器ip地址,端口号是前面registry
服务指定的端口号。- 创建tag之后我们可以看到多了一个
192.168.99.101:5000/hello-world
镜像,192.168.99.101:5000
是仓库名称,hello-world
是镜像名称。
push镜像
然后我们使用docker push
将镜像上传到私有仓库
1 | docker@default:/$ docker push 192.168.99.101:5000/hello-world |
从上面的提示内容可以看出,镜像并没有上传成功。这个问题可能是由于客户端采用https
,DockerRegistry
未采用https
服务所致。
解决方法:在”/etc/docker/“目录下,创建”daemon.json“文件。在文件中写入如下内容,然后保存退出后重启docker,问题解决。
1 | { "insecure-registries":["192.168.1.100:5000"] } |
再次上传镜像成功。
1 | docker@default:~$ docker push 192.168.99.101:5000/hello-world |
Tips:目前很多文章都是通过修改docker的配置文件“etc/systemconfig/docker”,重启docker来解决这个问题。但发现在docker18.06.1版本并无此文件,根据网上创建此文件,并填入相应内容,重启docker无效果,仍然报此错误。
验证pull镜像
镜像上传成功后,我们可以使用docker pull
命令验证镜像是否真的上传成功,首先先将本地的镜像192.168.99.101:5000/hello-world
删除。
1 | docker@default:/$ docker rmi 192.168.99.101:5000/hello-world |
然后再从私有仓库pull
我们上传的镜像。
1 | docker@default:/$ docker pull 192.168.99.101:5000/hello-world |
从上面执行的结果我们可以看到,我们已经从私有仓库成功下载了镜像。