Setup a simple Docker registry to use it privately or share images which a team of developers.

Install Docker before performing any operations described here.

Personal local registry

Create a directory to permanently store images.

$ sudo mkdir -p /srv/registry/data

Start the registry container.

$ docker run -d \
  -p 5000:5000 \
  --name registry \
  -v /srv/registry/data:/var/lib/registry \
  --restart always \
  registry:2
b1a641f8d710eee34405ad575050179f5a1262f1c845806cc3c2b435dea1648c

Display running containers.

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
b1a641f8d710        registry:2          "/entrypoint.sh /etc…"   5 minutes ago       Up 5 minutes        0.0.0.0:5000->5000/tcp   registry

Pull Debian Stretch image from the official repository.

$ docker pull debian:stretch
stretch: Pulling from library/debian
723254a2c089: Pull complete
Digest: sha256:0a5fcee6f52d5170f557ee2447d7a10a5bdcf715dd7f0250be0b678c556a501b
Status: Downloaded newer image for debian:stretch

Tag local Debian Stretch image with an additional tag – local repository address.

$ docker tag debian:stretch localhost:5000/debian:stretch

Push the image to the local repository.

$ docker push localhost:5000/debian:stretch
The push refers to repository [localhost:5000/debian]
e27a10675c56: Pushed
stretch: digest: sha256:02741df16aee1b81c4aaff4c48d75cc2c308bade918b22679df570c170feef7c size: 529

Remove local images.

$ docker image remove debian:stretch
Untagged: debian:stretch
Untagged: debian@sha256:0a5fcee6f52d5170f557ee2447d7a10a5bdcf715dd7f0250be0b678c556a501b
$ docker image remove localhost:5000/debian:stretch
Untagged: localhost:5000/debian:stretch
Untagged: localhost:5000/debian@sha256:02741df16aee1b81c4aaff4c48d75cc2c308bade918b22679df570c170feef7c
Deleted: sha256:da653cee0545dfbe3c1864ab3ce782805603356a9cc712acc7b3100d9932fa5e
Deleted: sha256:e27a10675c5656bafb7bfa9e4631e871499af0a5ddfda3cebc0ac401dfe19382

Pull the Debian Stretch image from the local repository.

$ docker pull localhost:5000/debian:stretch
stretch: Pulling from debian
723254a2c089: Pull complete
Digest: sha256:02741df16aee1b81c4aaff4c48d75cc2c308bade918b22679df570c170feef7c
Status: Downloaded newer image for localhost:5000/debian:stretch

List stored images.

$ docker image ls
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
registry                2                   d1fd7d86a825        4 weeks ago         33.3MB
localhost:5000/debian   stretch             da653cee0545        2 months ago        100MB
hello-world             latest              f2a91732366c        2 months ago        1.85kB

Shared local registry

Create a directory to permanently store images.

$ sudo mkdir -p /srv/registry/data

Create a directory to permanently store certificates and authentication data.

$ sudo mkdir -p /srv/registry/security

Store domain and intermediate certificates using /srv/registry/security/registry.crt file, private key using /srv/registry/security/registry.key file.
Use valid certificates, and do not waste time with self-signed ones. This step is required to use basic authentication.

Install apache2-utils to use htpasswd utility.

$ sudo apt-get install apache2-utils

Create initial username and password. The only supported password format is bcrypt.

$ : | sudo tee /srv/registry/security/htpasswd
$ echo "password" | sudo htpasswd -iB /srv/registry/security/htpasswd username
Adding password for user username
$ cat /srv/registry/security/htpasswd
username:$2y$05$KjuSifCdzRiYmir9N.nu.OKHtEbSZxbUPR04zatI25G9Bqyq1cho.

Start the registry container.

$ docker run -d \
  -p 443:5000 \
  --name registry \
  -v /srv/registry/data:/var/lib/registry \
  -v /srv/registry/security:/etc/security \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/etc/security/registry.crt \
  -e REGISTRY_HTTP_TLS_KEY=/etc/security/registry.key \
  -e REGISTRY_AUTH=htpasswd \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/etc/security/htpasswd \
  -e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
  --restart always \
  registry:2
ac9279b49a1c040c5935fa4d5df19c186a9fb0bcc9583afcf3768dd42bc40143

Display running containers.

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
ac9279b49a1c        registry:2          "/entrypoint.sh /etc…"   17 seconds ago      Up 16 seconds       0.0.0.0:443->5000/tcp   registry

Pull Debian Stretch image from the official repository.

$ docker pull debian:stretch
stretch: Pulling from library/debian
723254a2c089: Pull complete
Digest: sha256:0a5fcee6f52d5170f557ee2447d7a10a5bdcf715dd7f0250be0b678c556a501b
Status: Downloaded newer image for debian:stretch

Tag local Debian Stretch image with an additional tag – local repository address.

$ docker tag debian:stretch registry.sleeplessbeastie.eu/debian:stretch

Provide login credentials to use the local repository.

$ docker push registry.sleeplessbeastie.eu/debian:stretch
e27a10675c56: Preparing
no basic auth credentials
$ docker pull registry.sleeplessbeastie.eu/debian:stretch
Error response from daemon: Get https://registry.sleeplessbeastie.eu/v2/debian/manifests/stretch: no basic auth credentials

Log in to the local registry.

$ docker login --username username registry.sleeplessbeastie.eu
Password: ********
Login Succeeded

Push the image to the local repository.

$ docker push registry.sleeplessbeastie.eu/debian:stretch
The push refers to repository [registry.sleeplessbeastie.eu/debian]
e27a10675c56: Pushed
stretch: digest: sha256:02741df16aee1b81c4aaff4c48d75cc2c308bade918b22679df570c170feef7c size: 529

Remove local images.

$ docker image remove debian:stretch
Untagged: debian:stretch
Untagged: debian@sha256:0a5fcee6f52d5170f557ee2447d7a10a5bdcf715dd7f0250be0b678c556a501b
$ docker image remove registry.sleeplessbeastie.eu/debian:stretch
Untagged: registry.sleeplessbeastie.eu/debian:stretch
Untagged: registry.sleeplessbeastie.eu/debian@sha256:02741df16aee1b81c4aaff4c48d75cc2c308bade918b22679df570c170feef7c
Deleted: sha256:da653cee0545dfbe3c1864ab3ce782805603356a9cc712acc7b3100d9932fa5e
Deleted: sha256:e27a10675c5656bafb7bfa9e4631e871499af0a5ddfda3cebc0ac401dfe19382

Pull the Debian Stretch image from the local repository.

$ docker pull registry.sleeplessbeastie.eu/debian:stretch
stretch: Pulling from debian
723254a2c089: Pull complete
Digest: sha256:02741df16aee1b81c4aaff4c48d75cc2c308bade918b22679df570c170feef7c
Status: Downloaded newer image for registry.sleeplessbeastie.eu/debian:stretch

List stored images.

$ docker image ls
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
registry                             2                   d1fd7d86a825        4 weeks ago         33.3MB
registry.sleeplessbeastie.eu/debian   stretch             da653cee0545        2 months ago        100MB
hello-world                          latest              f2a91732366c        2 months ago        1.85kB

Additional information