A Practical Introduction to the Docker Registry Server

Background

One of the key advantages of using Docker is it’s centralized image management server, called a Registry Server. The Docker project, as well as Red Hat, maintain public registry servers which host supported images. The Docker project also provides an Open Source version of the Registry server which can be deployed on premise in your own network.

Why

As I mentioned in my original article, one of the first things a user wants to do after learning about Docker, is fire up a Registry server. This allows one to create derivative works with Docker files, and push them somewhere to be consumed again and again, by themselves and others.

 

What

Use Cases

  • I have pulled the offical RHEL or Fedora image, modified it with a Dockerfile and now I want to save it somewhere.
  • I need a place to share the images I have created with others
  • I want something that is easy to maintain and upgrade

Architecture

A containerized version of the the Docker Registry is provided by the Docker team. This server is written in Python and the version at the time of this writing was 0.8.1. This server is now being referred to as the V1 server. It’s important to not that this server is delivered as a Docker image.

The V1 Docker Registry Server has been recently put into maintenance because the V2 server will now be where active development happens. That said, the V1 Registry server will be the current stable version for the foreseeable future and will receive security patches, etc.

 

Basic Operations

Install the Registry Container

The Docker Registry server provided as a repository with layers for each version released

docker pull registry
docker images registry

Output:

REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
registry            0.8.1               3e7767ddd728        3 days ago          427.9 MB
registry            0.7.3               c723c9b95ac0        3 days ago          424.1 MB
registry            latest              8e9a29f977a7        3 days ago          427.9 MB
registry            0.6.9               bee70978874c        3 days ago          461.9 MB
registry            0.8.0               cd3581c06bdc        10 weeks ago        442.5 MB
registry            0.6.8               346f0c4d40c3        4 months ago        447.8 MB
registry            0.7.2               8b65881eed3d        4 months ago        516 MB
registry            0.7.0               a6a394071526        4 months ago        516 MB
registry            0.7.1               cc32522f16d6        4 months ago        516 MB
registry            0.6.7               cd8d7a6d86d1        5 months ago        452.5 MB
registry            0.6.6               e260f5a77e52        6 months ago        443 MB
registry            0.6.5               e7bac0a3804b        6 months ago        433 MB
registry            0.6.3               1f7bbd131cd8        8 months ago        490 MB
registry            0.6.2               0b520d776e7d        8 months ago        466.6 MB
registry            0.6.1               9f98cb899f46        8 months ago        460.1 MB
registry            0.6.0               873f518b98ef        8 months ago        466.5 MB
registry            0.5.9               e8e5377f8307        8 months ago        466.3 MB
registry            0.6.4               b04ace768d59        8 months ago        490 MB

 

Basic Deployment

This will manually start the container in daemon mode. Notice the -p option will map port 5000 in the container to the underlying operating system. This means you will access the registry server as if it is installed and running on the underlying OS.

docker run -d -p 5000:5000 registry:latest

 

Advanced Operations

Registry Deployment (Manual)

This will create a fairly functional Registry container that can be used for longer term hosting of repositories. The -e option sets an environmental variable inside the container, while the -v option maps a volume into the Docker container

docker run -d -p 5000:5000 -e SEARCH_BACKEND=sqlalchemy -e DOCKER_REGISTRY_CONFIG=/srv/docker/conf.d/config.yml -v /srv/docker/registry:/srv/docker/registry -v /srv/docker/conf.d:/srv/docker/conf.d registry

 

Registry Deployment on RHEL7 (Container)

Create a unit file

[Unit]
Description=Containerized Registry server for Docker

[Service]
Type=simple
ExecStart=/usr/bin/docker run -d -p 5000:5000 -e SEARCH_BACKEND=sqlalchemy -e DOCKER_REGISTRY_CONFIG=/srv/docker/conf.d/config.yml -v /srv/docker/registry:/srv/docker/registry -v /srv/docker/conf.d:/srv/docker/conf.d --name=docker-registry-container registry
ExecStop=/usr/bin/docker stop docker-registry-container
ExecStopPost=/usr/bin/docker rm docker-registry-container
RemainAfterExit=yes
Restart=no

[Install]
WantedBy=multi-user.target

 

Registry Deployment on RHEL6 (Container)

To deploy on RHEL6, it is necessary to create an init script similar to the following

#!/bin/sh
#
# docker-registry-container: ran as a container
#
# chkconfig:   345 95 5
# description: Runs Docker Registry server as a container

# Source function library.
. /etc/rc.d/init.d/functions

prog="docker-registry-container"

start() {
    echo -n $"Starting $prog: "
    /usr/bin/docker run -d -p 5000:5000 -e SEARCH_BACKEND=sqlalchemy -e DOCKER_REGISTRY_CONFIG=/srv/docker/conf.d/config.yml -v /srv/docker/registry:/srv/docker/registry -v /srv/docker/conf.d:/srv/docker/conf.d --name=docker-registry-container registry
}

stop() {
    echo -n $"Stopping $prog: "
    /usr/bin/docker stop docker-registry-container
    /usr/bin/docker rm docker-registry-container
}

restart() {
    stop
    start
}

status() {
    /usr/bin/docker ps docker-registry-container
}


case "$1" in
    start)
        $1
        ;;
    stop)
        $1
        ;;
    restart)
        $1
        ;;
    status)
        $1
        ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart}"
        exit 2
esac
exit $?

 

Registry Deployment on RHEL7 (RPM Package)

The Docker Registry server is also provided as an RPM with configuration in a manner similar to other RHEL services.

Install Docker Registry

yum install -y docker-registry

 

Create custom data directory

mkdir -p /srv/docker/data

 

Modify the configuration file

vim /etc/docker-registry.yml
dev:
    storage: local
    storage_path: /srv/docker/data
    loglevel: debug

 

Enable and start service

systemctl enable docker-registry.service
systemctl start docker-registry.service

 

Tags: , , , , , ,

Trackbacks/Pingbacks

  1. Running Docker in Production | Crunch Tools - June 8, 2015

    […] A Practical Introduction to the Docker Registry Server […]

  2. Core Builds in the Age of Service | Crunch Tools - September 17, 2015

    […] to describe business solutions such as a ticket system, as well as, technical solutions such as a Docker Registry server. For the point of this article, I will be using the technical definition. For Docker, the […]

Leave a Reply