Docker Registry in xCAT

Docker Registry is a stateless, highly scalable server side application that stores and lets you distribute Docker images.

This document describes how to set up a local private docker registry on Ubuntu 15.04 on x86_64.

Note

Ensure that docker registry is not already set up on this docker host.

Setting Up Docker Host

Install Docker version 1.6.0 or newer.

Setting Up Docker Registry Manually

Docker registry needed to be set up on xCAT’s MN.

This section describes two methods of setting up docker registry manually.

First, create some folders where files for this tutorial will live.

mkdir /docker-registry && cd $_
mkdir certs

Copy xCAT server certificate and key to certs folder.

cp /etc/xcat/cert/server-cert.pem certs/domain.crt
cp /etc/xcat/cert/server-key.pem certs/domain.key

Method 1: Start Docker Registry Directly

Create Configuration File

Define configuration file docker-registry under /docker-registry/ folder as below.

#!/bin/bash

docker_command=$1
if [ $docker_command = "start" ]; then
    docker_ps_result=$(docker ps -a | grep "registry")
    if [ -z $docker_ps_result ]; then
        docker run -d -p 5000:5000 --restart=always --name registry \
          -v `pwd`/data:/data \
          -e REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/data \
          -v `pwd`/certs:/certs \
          -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
          -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
          registry:2
    else
        docker start registry
    fi
elif [ $docker_command = "stop" ]; then
    docker stop registry
else
    echo "The parameter is wrong."
fi

Starting Docker Registry as a Service

Create docker-registry.service file in /etc/systemd/system/, add the following contents to it.

[Unit]
Description=Docker Registry

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/docker-registry
ExecStart=/bin/bash docker-registry start
ExecStop=/bin/bash docker-registry stop

[Install]
WantedBy=default.target

Start registry service:

service docker-registry start

Method 2: Managing Docker Registry with Compose

Docker Compose it is a tool for defining and running Docker applications. It could help setting up registry.

Install Docker Compose

Compose can also be run inside a container, from a small bash script wrapper. To install compose as a container run:

curl -L https://github.com/docker/compose/releases/download/1.5.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

Create Configuration File

Define configuration file docker-compose.yml under /docker-registry/ folder as below.

registry:
  restart: always
  image: registry:2
  ports:
    - 5000:5000
  environment:
    REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
    REGISTRY_HTTP_TLS_CERTIFICATE: /certs/domain.crt
    REGISTRY_HTTP_TLS_KEY: /certs/domain.key
  volumes:
    - ./data:/data
    - ./certs:/certs

The environment section sets environment variables in the Docker registry container. The Docker registry app knows to check this environment variable when it starts up and to start saving its data to the /data folder as a result.

Starting Docker Registry as a Service

Create docker-registry.service file in /etc/systemd/system/, add the following contents to it.

[Uint]
Description=Docker Registry

[Service]
Type=simple
Restart=on-failure
RestartSec=30s
WorkingDirectory=/docker-registry
ExecStart=/usr/local/bin/docker-compose up

[Install]
WantedBy=default.target

Start registry service:

service docker-registry start

Accessing Docker Registry from other docker host

Copy ca.crt file from xCAT MN to a client machine. Client machine must be a docker host.

scp username@xCAT_MN_ip:/etc/xcat/cert/ca.pem /etc/docker/certs.d/domainname:5000/ca.crt

List Available Images in Registry

curl -k https://domainname:5000/v2/_catalog

Pull Images from Registry

Just use the “tag” image name, which includes the domain name, port, and image name.

docker pull domainname:5000/imagename

Push Images to Registry

Before the image can be pushed to the registry, it must be tagged with the location of the private registry.

docker tag imagename domainname:5000/imagename

Now we can push that image to our registry.

docker push domainname:5000/imagename

note: If there is a problem with the CA certificate, edit the file /etc/default/docker so that there is a line that reads: DOCKER_OPTS="--insecure-registry domianname:5000" . Then restart Docker daemon service docker restart .