仓库(Repository)是集中存放镜像的地方



一个容易混淆的概念是注册服务器(Registry)。

实际上注册服务器是管理仓库的具体服务器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。

从这方面来说,仓库可以被认为是一个具体的项目或目录。例如对于仓库地址dl.dockerpool.com/ubuntu来说,dl.dockerpool.com是注册服务器(Registry),ubuntu是仓库(Repository)

 

 



1.Docker Hub(公共仓库)



登录——docker login



注册成功后,本地用户目录的 .dockercfg中将保存用户的认证信(Linux中)

然后之后就能够进行之前学习的一些操作,如拉取镜像等

 

 



2.私有仓库——docker-registry



docker-registry是官方提供的工具,可以用于构建私有的镜像仓库

有时候,我们并不想把自己的项目公开,只想自己使用。这时我们就需要自己建立自己的docker hub



1) 安装运行 docker-registry



userdeMacBook-Pro:~ user$ docker run -d -p 5000:5000 registry
Unable to find image 'registry:latest' locally
latest: Pulling from library/registry
d6a5679aa3cf: Pull complete 
ad0eac849f8f: Pull complete 
2261ba058a15: Pull complete 
f296fda86f10: Pull complete 
bcd4a541795b: Pull complete 
Digest: sha256:5a156ff125e5a12ac7fdec2b90b7e2ae5120fa249cf62248337b6d04abc574c8
Status: Downloaded newer image for registry:latest
80a3cb29464481d17c7c7640d7763ea6820cee39cd0c83ce959a76e7b7a6219f
userdeMacBook-Pro:~ user$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
80a3cb294644        registry            "/entrypoint.sh /etc…"   4 minutes ago       Up 4 minutes        0.0.0.0:5000->5000/tcp   pensive_meninsky



这将使用官方的 registry 镜像来启动本地的私有仓库。(我没有进行下面的配置)

运行了上面的命令后,其实就相当于启动了一个服务器,然后我们就可以往上面push和pull了

 

下面是相应的环境配置,你也可以不设置,使用默认值

Amazon S3 服务:



$ sudo docker run \
-e SETTINGS_FLAVOR=s3 \
-e AWS_BUCKET=acme-docker \
-e STORAGE_PATH=/registry \
-e AWS_KEY=AKIAHSHB43HS3J92MXZ \
-e AWS_SECRET=xdDowwlK7TJajV1Y7EoOZrmuPEJlHYcNP2k4j49T
-e SEARCH_BACKEND=sqlalchemy \
-p 5000:5000 \
registry



此外,还可以指定本地路径(如 /home/user/registry-conf )下的配置文件config.yml(我本地下并没有改文件,看看即可):



$ sudo docker run -d -p 5000:5000 -v /home/user/registry-conf:/registry-conf -e DOCKER_REGISTRY_CONFIG=/registry-conf/config.yml registry



默认情况下,仓库会被创建在容器的 /tmp/registry下。可以通过 -v 参数来将镜像文件存放在本地的指定路径。

例如下面的例子将设置会将上传的镜像放到 /opt/data/registry 目录



sudo docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry



 



2)在私有仓库上传、下载、搜索镜像——docker tag

格式:docker tag IMAGE[:TAG]  [REGISTRYHOST/][USERNAME/]NAME[:TAG]



创建好私有仓库之后,就可以使用 docker tag来标记一个镜像,然后推送它到仓库,就能够从别的机器上下载该镜像了。

⚠️:你image的标签一定得是你服务器的ip地址加端口.比如下面的命令docker tag 0254 192.168.1.103:5000/testNginx,否则你的镜像并不会上传到你自己的仓库上,而是会上传到docker hub上



先在本机查看已有的镜像:



userdeMacBook-Pro:~ user$ docker images
REPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZE
test/nginx                                 v1                  02548ab0445a        28 minutes ago      107MB
nginx                                      v3                  beda48ecf85b        27 hours ago        109MB
nginx                                      v2                  5dda481d7ed1        28 hours ago        109MB
nginx                                      latest              568c4670fa80        2 weeks ago         109MB
ubuntu                                     14.04               f17b6a61de28        3 weeks ago         188MB
registry                                   latest              2e2f252f3c88        3 months ago        33.3MB
alpine                                     latest              196d12cf6ab1        3 months ago        4.41MB
hello-world                                latest              4ab4c602aa5e        3 months ago        1.84kB



 

然后就对镜像进行标记:



userdeMacBook-Pro:~ user$ docker tag 0254 192.168.1.103:5000/testNginx
Error parsing reference: "192.168.1.103:5000/testNginx" is not a valid repository/tag: invalid reference format: repository name must be lowercase
userdeMacBook-Pro:~ user$ docker tag 0254 192.168.1.103:5000/testnginx
userdeMacBook-Pro:~ user$ docker images
REPOSITORY                                 TAG                 IMAGE ID            CREATED             SIZE
192.168.1.103:5000/testnginx               latest              02548ab0445a        33 minutes ago      107MB
test/nginx                                 v1                  02548ab0445a        33 minutes ago      107MB
nginx                                      v3                  beda48ecf85b        27 hours ago        109MB
nginx                                      v2                  5dda481d7ed1        28 hours ago        109MB
nginx                                      latest              568c4670fa80        2 weeks ago         109MB
ubuntu                                     14.04               f17b6a61de28        3 weeks ago         188MB
registry                                   latest              2e2f252f3c88        3 months ago        33.3MB
alpine                                     latest              196d12cf6ab1        3 months ago        4.41MB
hello-world                                latest              4ab4c602aa5e        3 months ago        1.84kB



然后docker push上传标记后的镜像:



userdeMacBook-Pro:~ user$ docker push 192.168.1.103:5000/testnginx
The push refers to repository [192.168.1.103:5000/testnginx]
Get https://192.168.1.103:5000/v2/: http: server gave HTTP response to HTTPS client



出现问题,解决办法,添加"insecure-registries":["192.168.1.103:5000"]:

docker 从入门到实战 pdf docker技术入门与实战pdf_网络

然后重启apply & restart

之后再重新运行一遍,因为你会发现registry容器也关闭了:



userdeMacBook-Pro:~ user$ docker push 192.168.1.103:5000/testnginx
The push refers to repository [192.168.1.103:5000/testnginx]
480dc0877295: Retrying in 1 second 
received unexpected HTTP status: 503 Service Unavailable
userdeMacBook-Pro:~ user$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
userdeMacBook-Pro:~ user$ docker run -d -p 5000:5000 registry
9baa1039f10d5037b1e6c393155233cfdee1ce068b7e4859d7d856c373d33ce8
userdeMacBook-Pro:~ user$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
9baa1039f10d        registry            "/entrypoint.sh /etc…"   3 seconds ago       Up 2 seconds        0.0.0.0:5000->5000/tcp   tender_kowalevski
userdeMacBook-Pro:~ user$ docker push 192.168.1.103:5000/testnginx
The push refers to repository [192.168.1.103:5000/testnginx]
480dc0877295: Pushed 
latest: digest: sha256:f682f1e8e7f792404f93977b9931a07c6180b4e84d4daadbb47ea4489d368e49 size: 528



然后一查看,成功上传:



userdeMacBook-Pro:~ user$ cat .docker/daemon.json 
{
  "debug" : true,
  "insecure-registries" : [
    "192.168.1.103:5000"
  ],
  "experimental" : true,
  "registry-mirrors" : [
    "https://aic2v8yz.mirror.aliyuncs.com"
  ]
}
userdeMacBook-Pro:~ user$ curl -XGET http://192.168.1.103:5000/v2/_catalog
{"repositories":["testnginx"]}



然后就能够到另一台电脑上使用下面的命令去拉取镜像了:



docker pull 192.168.1.103:5000/testnginx



 



3) 仓库配置文件



Docker 的 Registry 利用配置文件提供了一些仓库的模板(flavor),用户可以直接 使用它们来进行开发或生产部署:



模板:



在 config_sample.yml文件中,可以看到一些现成的模板段:



  • common : 基础配置
  • local : 存储数据到本地文件系统
  • s3 : 存储数据到 AWS S3 中
  • dev : 使用 local模板的基本配置
  • test : 单元测试使用
  • prod : 生产环境配置(基本上跟s3配置类似)
  • gcs : 存储数据到 Google 的云存储
  • swift: 存储数据到 OpenStack Swift 服务
  • glance : 存储数据到 OpenStack Glance 服务,本地文件系统为后备
  • glance-swifte : 存储数据到 OpenStack Glance 服务,Swift 为后备
  • elliptics : 存储数据到 Elliptics key/value 存储