Docker images are stored as filesystem layers. Every command in the Dockerfile creates a layer. You can also create layers by using docker commit
from the command line after making some changes (via docker run
probably).
These layers are stored by default under /var/lib/docker
. While you could (theoretically) cherry pick files from there and install it in a different docker server, is probably a bad idea to play with the internal representation used by Docker.
When you push your image, these layers are sent to the registry (the docker hub registry, by default… unless you tag your image with another registry prefix) and stored there. When pulling, the layer id is used to check if you already have the layer locally or it needs to be downloaded. You can use docker history
to peek at which layers (other images) are used (and, to some extent, which command created the layer).
As for options to share an image without pushing to the docker hub registry, your best options are:
-
docker save
an image ordocker export
a container. This will output a tar file to standard output, so you will like to do something likedocker save 'dockerizeit/agent' > dk.agent.latest.tar
. Then you can usedocker load
ordocker import
in a different host. -
Host your own private registry. – Outdated, see comments
See the docker registry image. We have built an s3 backed registry which you can start and stop as needed (all state is kept on the s3 bucket of your choice) which is trivial to setup. This is also an interesting way of watching what happens when pushing to a registry -
Use another registry like quay.io (I haven’t personally tried it), although whatever concerns you have with the docker hub will probably apply here too.