2. Contents
1. Whatâs a registry?
2. Advanced configuration
a. Search index
b. Mirroring
c. Adding a redis cache
d. More!
3. Extending the code
3. Whatâs a registry?
⢠Storage component for docker images
⢠Open-source python app
⢠docker/docker-registry on github
⢠Current stable version: 0.8.1
⢠Available as an official image
docker run -d -p 5000:5000 registry:0.8.1
4. Whatâs a registry?
⢠Several storage backends supported
⢠Filesystem
⢠Boto (S3, Google Compute, ...)
⢠OpenStack Swift
5. Advanced configuration
The registry image is great for quick setup and testing, but
we can make it even better with some tinkering!
⢠Enabling search
⢠Mirroring another registry (even the official one!)
⢠Adding a redis cache
⢠And more!
6. Search index
Enabling a basic search index is easy!
docker run -d -p 5000:5000 -e
SEARCH_BACKEND=sqlalchemy registry:0.8.1
7. Search index
Letâs put our SQLite database in a volume.
docker run -d -p 5000:5000
-e SEARCH_BACKEND=sqlalchemy
-e SQLALCHEMY_INDEX_DATABASE=sqlite:////opt/sqlitedb/reg.db
-v /opt/sqlitedb:/opt/sqlitedb
registry:0.8.1
8. Search index
Also, we want to keep our image store persistent across
restarts!
docker run -d -p 5000:5000
-e SEARCH_BACKEND=sqlalchemy
-e SQLALCHEMY_INDEX_DATABASE=sqlite:////opt/sqlitedb/reg.db
-e STORAGE_PATH=/opt/registry
-v /opt/registry/storage:/opt/registry
-v /opt/sqlitedb:/opt/sqlitedb
registry:0.8.1
9. Search index
This is quite a mouthful... Letâs make a Dockerfile instead.
$ docker build -t myregistry .
$ docker run -d -p 5000:5000 -v
/opt/registry/storage:/opt/registry -v
/opt/registry/index:/opt/sqlitedb myregistry
Thatâs better!
13. Mirroring
Better method: Enable mirroring on your registry!
ENV MIRROR_SOURCE https://registry-1.docker.io
ENV MIRROR_SOURCE_INDEX https://index.docker.io
14. Mirroring
⢠On the first pull, immutable data (metadata, layers,
image ancestry) is stored locally on the mirror.
⢠The source is always contacted to retrieve mutable data
(list of tags, <tag / image ID> mappings)...
⢠... unless you enable the redis cache, then tag data is
kept for some time.
⢠Set MIRROR_TAGS_CACHE_TTL accordingly!
15. Adding a redis cache
First letâs start up a redis container.
$ docker run --name rediscache -d redis:2.8.13
Then weâre going to edit config/config_sample.yml
cache:
host: _env:REDISCACHE_PORT_6379_TCP_ADDR
port: _env:REDISCACHE_PORT_6379_TCP_PORT
db: 0
cache_lru:
host: _env:REDISCACHE_PORT_6379_TCP_ADDR
port: _env:REDISCACHE_PORT_6379_TCP_PORT
db: 1
16. Adding a redis cache
⢠Copy the config_sample.yml file where our Dockerfile
from before is.
⢠Add the following line to our Dockerfile:
ADD ./config_sample.yml /docker-registry/
config/config_sample.yml
⢠Create a link with our rediscache container when
starting up the registry
docker run -d -p 5000:5000 --link rediscache:rediscache
-v /opt/registry/storage:/opt/registry -v
/opt/registry/index:/opt/sqlitedb myregistry
17. Adding a redis cache
⢠Create a link with our rediscache container when
starting up the registry
docker run -d -p 5000:5000 --link rediscache:rediscache
-v /opt/registry/storage:/opt/registry -v
/opt/registry/index:/opt/sqlitedb myregistry
⢠All set!
18. More configuration!
⢠Use an nginx or Apache frontend to enforce basic auth.
⢠You can then do: docker login my.registry.com
⢠Only works over HTTPS!
⢠Enable e-mail notifications when an exception is
encountered
⢠See the email_notifications section of the
configuration
19. Extending the code
⢠Youâll need time and some Python proficiency.
⢠But for advanced usage, it can be worth it!
⢠If you make something cool, think about giving back to the
community! We accept pull requests.
20. Extending the code
⢠You can implement a new storage driver by inheriting
docker_registry.core.driver.Base
⢠Leverage the signals API in docker_registry.lib.signals
⢠Implement a new search backend by inheriting
docker_registry.lib.index.Index
⢠Other ideas? Talk to us, let us know if we can help!