Docker Registry mit Amazon S3

SchaubildDocker Images brauchen Platz. Manchmal sogar ziemlich viel. Schwupps, schon ist die private Docker Registry voll. Und dann beginnt der Nörgelnerv…

Wo krieg ich mehr Platte her? Muss ich was löschen? Kann ich etwas archivieren? Wie verträgt sich das eigentlich mit dem Backup?

Alles Schnee von gestern. Verbinde Deine Docker Registry mit Amazon S3 und pack die Docker Images in die Cloud.

Zuaten

 

Zubereitung

1 – Leg den S3 Bucket an

Geh auf die AWS Management Console => S3 => Create Bucket. Leg einen neuen Bucket an und merk dir den Bucket Name und die Region.

In diesem neuen S3 Bucket werden später die Docker Images von der Docker Registry abgelegt.

 

2 – Generier die AWS Security Credentials

Geh auf die AWS Management Console => Identity & Access Management => Create New Users. Leg einen neuen Benutzer an, merk dir die Access Key ID und den Secret Access Key.

Die AWS Security Credentials brauchst Du, um später mit der Docker Registry die AWS-API ansprechen zu können. Genauer: die Docker Registry nutzt den neuen Benutzer, um damit auf den S3 Bucket zuzugreifen.

 

3 – Vergib die Zugriffsberechtigungen

Über Permissions => Inline Policies => Custom Policy musst du dem neuen Benutzer die folgenden Berechtigungen zuweisen (copy & paste ins Feld „Policy Document“). Hinterleg in den Zeilen 11 und 22 deinen Bucket Name:

{
  "Version":"2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:GetBucketLocation",
        "s3:ListBucket",
        "s3:ListBucketMultipartUploads"
      ],
      "Resource": "arn:aws:s3:::DeinBucketName"
    },
    {
      "Effect": "Allow",
      "Action": [
        "s3:AbortMultipartUpload",
        "s3:DeleteObject",
        "s3:GetObject",
        "s3:ListMultipartUploadParts",
        "s3:PutObject"
      ],
      "Resource": "arn:aws:s3:::DeinBucketName/*"
    }
  ]
}
Mit Policies kannst Du die Berechtigungen für Deinen Benutzer sehr detailliert steuern. Hier vergibst du die notwendigen Zugriffsrechte auf den neuen S3-Bucket „DeinBucketName“. Docker Registry benötigt diese Rechte für „pull“ und „push“ der Docker Images.

 

4 – Starte die Docker Registry

Ergänze im folgenden docker-compose.yml deine Access Key ID (Zeile 6), den Secret Access Key (Zeile 7), den Bucket Name (Zeile 8) und die Region (Zeile 9).

version: '2'
services:
  registry:
    environment:
      - REGISTRY_STORAGE=s3
      - REGISTRY_STORAGE_S3_ACCESSKEY=DeineAccessKeyID
      - REGISTRY_STORAGE_S3_SECRETKEY=DeinSecretAccessKey
      - REGISTRY_STORAGE_S3_BUCKET=DeinBucketName
      - REGISTRY_STORAGE_S3_REGION=DeineRegion
      - REGISTRY_STORAGE_S3_V4AUTH=true
    image: registry:2.4
    ports:
      - 5000:5000
    restart: always
Vorsicht bei der Region! Hier darf leider nicht der Wert aus der AWS Management Console eingetragen werden (z.B. Frankfurt), sondern nur der zugehörige AWS Code (z.B. eu-central-1).

Starte die Docker Registry:

$ docker-compose up -d

 

FERTIG

Los geht’s – jetzt kannst du testen ob alles funktioniert:

Pull ein Image aus dem Docker Hub und erstell ein Tag für deine eigene Docker Registry:

$ docker pull busybox && docker tag busybox localhost:5000/busybox

Push das Image in deine Docker Registry:

$ docker push localhost:5000/busybox

Pull das Image aus deiner Docker Registry:

$ docker pull localhost:5000/busybox

Kontrollier über die AWS Management Console ob Dein Bucket jetzt tatsächlich Daten enthält.

 


 

Tipps & Tricks

Du brauchst Zertifikate für deine Domain und ein wenig mehr Konfiguration im docker-compose.yml. Alle Details findest du in der Docker Doku im Kapitel „Deploying a registry server – Running a domain registry“.
Das kannst du mit dem zusätzlichen Environment-Parameter „REGISTRY_STORAGE_S3_SECURE“ im docker-compose.yml konfigurieren. True => HTTPS (default), false => HTTP.
Die serverseitige Verschlüsselung AWS SSE-KMS wird unterstützt.

 


 

Quellen

“Overview of Docker Registry Documentation”, 01.06.2016
“Docker Distribution – S3 storage driver”, 01.06.2016
“How Amazon Simple Storage Service (Amazon S3) Uses AWS KMS”, 01.06.2016
“Protecting Data Using Server-Side Encryption with AWS KMS–Managed Keys (SSE-KMS)”, 01.06.2016