What is the differenece between Docker Registry and Docker Index? - docker

I am new to docker and just going through the online links to understand how it works. However I am not getting much clarity on Docker Registry and Docker Index. I get that part that your docker image will be there on registry and client uses pull command to daemon which in turn get the image from registry. But I also read that you can get and image from Index as well then what is the difference between these two?
Thank you.

I think Where are Docker images stored? gives a good explanation:
An index manages user accounts, permissions, search, tagging, and all that nice stuff that's in the public web interface.
A registry stores and serves up the actual image assets, and it delegates authentication to the index.
When you run docker search, it's searching the index, not the registry. In fact, it might be searching multiple registries that the index is aware of.
When you run docker push or docker pull, the index determines if you are allowed to access or modify the image, but the registry is the piece that stores it or sends it down the wire to you after the index approves the operation. Also, the index figures out which registry that particular image lives in and forwards the request appropriately.
Beyond that, when you're working locally and running commands like docker images, you're interacting with something that is neither an index or a registry, but a little of both.

There is a slight difference, mostly because there were 2 API's developed, which were originally developed to be served by separate services.
https://github.com/docker/docker-registry implements the registry API, while the Docker Hub implements both.
I know of one open source implementation of the Index, which can be added to a docker-registry -

There is no difference. Both usually refers to Docker official image repository. You can also find it referred as Docker repository and Docker Hub. All of them usually refers to the same.
You also can find or set up an alternate repository and host there images, but then you would refer that repository as your repository or a particular name (e.g.: totum repository).

I'm not sure about Docker Registry. But a docker registry is a service that stores images, allowing you to pull and push them. distribution/registry is probably the most popular implementation. Docker Index is the former name of Docker Hub. There's also an index server, which is seemingly what's left from the registry v1 api if you extract the registry v2 api from it. Namely, searching for images. And apparently Docker Hub has both a docker registry and an index server.
More on it here.

Related

How to get to Docker Hub for an image from command line?

I used the following command: docker pull balenalib/beaglebone-black:latest
I am now trying to find the page for this image on Docker Hub. I search balenalib/beaglebone-black:latest and thousands of results come up, but seemingly not the one I typed in.
I finally found it here by manipulating the URL directly.
Is there a better way to do this? Can I get to that URL by using a command from terminal?
For Docker's registry's web fronted (https://hub.docker.com), there are two primary 'views':
Users|Organizations:
e.g. https://hub.docker.com/u/balenalib
NB "hub.docker.com/u/"
Users'|Organizations' Images
e.g. https://hub.docker.com/r/balenalib/beaglebone-black
NB "hub.docker.com/r/"
In the case of Docker's registry, the docker pull includes an implicit|optional docker.io/ prefix as it defaults to Docker's registry but there are other registries:
docker pull docker.io/balenalib/beaglebone-black:latest
So there's a form docker pull [registry]/[user]/[image]:[tag]
And, if you're using Linux and Chrome, you could browse to it on DockerHub using:
USER=balenalib # for example
IMAGE=beaglebone-black # for example
google-chrome https://hub.docker.com/r/${USER}/${IMAGE}
NB I find this a confusing use of similar terms, but a registry (such as Docker's) includes many repositories. In your example, using the Docker registry, balenalib/beaglebone-black is one repository in it.

Tag not found in repository docker.io/minio

We have been using locked version of the Minio image (RELEASE.2016-10-07T01-16-39Z), but now it seems to have been removed.
I'm getting this from Docker:
Pulling minio (minio/minio:RELEASE.2016-10-07T01-16-39Z)...
Pulling repository docker.io/minio/minio
ERROR: Tag RELEASE.2016-10-07T01-16-39Z not found in repository docker.io/minio/minio
I'm finding Docker hub hard to navigate. Where can I find a list of available versioned images, or a mirror to my exact image?
You can find the available tags for minio/minio on that repository's tag page.
If you have the image you want already downloaded on any of your systems, you can push it to Docker Hub yourself, then pull it onto your other systems. This has the benefit that you can control whether you delete that image (it's your account, not someone else's).
You can also use a private registry, if you want, which would prevent Docker from deleting the image from Docker Hub against your will for some reason. But that is extra work you may not wish to do (you would have to host the registry yourself, set it up, maintain it...)
We removed the docker version due to incompatibilities, from the recent releases it won't happen.

How to list images in docker registry being on registry server?

Currently I'm pushing images from one machine to another. The success of it I can determine base on HTTP status from pushing machine or base on logs from the registry server. At this point I want to search through what really is in my registry on my server. What I found till now is the API calls from outside and that if even when you call it you have to know exact name of the image and how it is tagged. In my case, I want just to enlist what images currently are in my registry when I have direct access to it. I did not find any related command.
The docker CLI doesn't have functionality to search a registry, but you can use the registry's REST API. Assuming you're using the registry:2 image, then you can list all the repositories using the catalog endpoint:
curl https://my-registry:5000/v2/_catalog
{"repositories":["busybox","redis","ubuntu"]}
And then you can query the tags for a repository:
curl https://my-registry:5000/v2/busybox/tags/list
{"name":"busybox","tags":["2","latest"]}
Here's the full Registry API spec.

Docker build tag repository name

One can easily build docker images through docker build command.
What I'm wondering is the t flag that you can give when building the image. For example:
$ docker build -t ouruser/sinatra:v2 .
According to documentation, the t flag is for tagging and naming purposes. Name is the part before ':', and tag is the part after it. So in our example, the name is ouruser/sinatra, and the tag is v2.
I thought this would be the image name and tag. But apparently, the name is actually some repository name? Why do I think it is? Well, because if you would after this list the images with command:
docker images
You would get a listing like this:
REPOSITORY TAG IMAGE ID CREATED SIZE
ouruser/sinatra latest 5db5f8471261 11 hours ago 446.7 M
Bang! Major shock! You thought you were creating an image with name, and instead, you specified some repository! Related to this, I have some questions:
Where is this repository located?
Can I name the image without creating a repository?
Where and how is this repository used, or could be used?
Where can I find more information about this repository? I only found this, and it doesn't tell much to be honest: docker build docs
Why is it common to use names that consist of two parts like this: somename/someothername?
Thank you for your help!
I believe the confusion here is the word "repository." In Docker, a repository is any group of builds of an image with the same name, and potentially multiple tags. A "registry" server, like hub.docker.com or your own private registry, holds multiple repositories, e.g. the redis repository on the public registry. That one repository has multiple tags for different versions of the build.
So with that background, to answer your questions:
ouruser/sinatra is located on your local Docker host until you do a docker push
No, the repository and the tag is the name of the image.
While local on your system, you can use this image locally. Once you push it up to a registry, you can then pull it down to any other Docker host that has access to that registry. And if you do a docker save you can save that image for a docker load on another host.
I'm sure there is documentation covering this somewhere on docs.docker.com, but I learned from a class.
The username/imagebase format came about to support pushing to your own namespace in hub.docker.com. Without that, whoever makes the first "Redis" image calls it "redis" while the next person makes their own repository called "redis-improved", and we quickly get into a jumble of confusing names where it's not clear who made what and what is a reputable image. That naming isn't required for images you make locally, but is still encouraged since images you pull from hub.docker.com may lack a username if they are maintained by Docker themselves. Without your username, you won't know which images you pulled down and which you built yourself.

Modern status of private Docker registries/repos

So it's great that the public Docker registry exists; that way, if I want an out-of-the-box image for a MySQL server, or an nginx proxy, I can just use one pulled from the public registry as-is.
But obviously the public repo is no place to store my closed-source, application images. So I asked the Google Gods for the available options surrounding setting up private Docker registries, similar to how I publish all my binaries to a local Artifactory server. And I find the lack of private registry support most disturbing.
The main articles I found were:
https://docs.docker.com/registry/deploying/
https://github.com/docker/docker-registry
https://blog.docker.com/2013/07/how-to-use-your-own-registry/
However they are old and I know there have been recent major changes in Docker (libcontainer -> runc) that likely obsolesces them. So I ask: are there modern, Artifactory-like tools out there for hosting private Docker registries? If not, is there an easy recipe for rolling your own?
Bonus points if someone can explain to me the difference between: Docker indexes, registries and repositories.
First, the terminology:
A repository is a collection of images e.g the redis repository contains images for various versions of redis. A particular image is selected by specifying a tag e.g redis:3.0. If no tag is specified when pulling an image, it defaults to the latest tag.
A registry is a collection of repositories, the primary example being the Docker Hub.
"index" I think is old terminology that you can forget about.
(I expect bonus points now ;) )
As #Abdullah Jibaly points out, you can have private repositories on the Docker Hub.
You can also run your own registry, instructions are on the Docker distribution GitHub project. This is in no way obsoleted by runc (nor does it really have anything to do with runc).
There are also other hosted registry solutions such as http://quay.io.
https://hub.docker.com supports private images as well (similar to the github model), I'd start with that first.
I had the same task to look into recently. If you don't want to use the already mentioned private cloud offerings, there is (in the meanwhile) support for private (on premise) docker registries with:
JFrog Artifactory
Sonatype Nexus 3
GitLab
OpenShift

Resources