仓库(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"]:
然后重启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 存储