Nexus Docker Repository mit NGinX Reverse Proxy einrichten

Privates Docker Repository mit Nexus

Ziel soll es sein ein secure repository für Docker Images bereitzustellen. In der Sprache von Docker bedeutet dieses, dass das Repository über HTTPS angesprochen wird. Dieses soll privat sein, da es nicht öffentliche Images beinhalten soll. Dazu werden 2 + 1 Domainnames benötigt, da wir ein Mapping in den Nexus Container auf unterschiedliche Ports vornehmen müssen. In diesem Beispiel gibt es die Hostnamen nexus, docker und docker-proxy.

FQDN Port
nexus.XXX.org 9000
docker.XXX.org 9001
docker-proxy.XXX.org 9002

Den NginX Reverse Proxy konfigurieren

Dazu benötigen wir folgende Einstellungen für den NGinX Reverse Proxy:

###############################
#                             #
# Public Nexus Repository     #
#                             #
# nexus.XXX.org               #
#                             #
###############################

#    
# Nexus Server
# map to port 9000
#

# Redirect http -> https
server {
    listen 80;
    server_name nexus.XXX.org;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;

    server_name nexus.XXX.org;

    # logging
    error_log /var/log/nginx/nexus_error.log debug;
    access_log /var/log/nginx/nexus_access.log;

    # Push large objects to nexus
    client_max_body_size 2G;

    # SSL
    include ssl/*.XXX.org;

    location / {
      # Use IPv4 upstream address instead of DNS name to avoid attempts by nginx to use IPv6 DNS lookup
      proxy_pass http://127.0.0.1:9000/;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
    }

}

#    
# Docker Repository
# map to port 9001
#

server {
    listen 443 ssl http2;

    server_name docker.XXX.org;

    # logging
    error_log /var/log/nginx/nexus_docker_error.log debug;
    access_log /var/log/nginx/nexus_docker_access.log;

    # Push large objects to nexus
    client_max_body_size 2G;

    # SSL
    include ssl/*.XXX.org;

    # optimize downloading files larger than 1G
    #proxy_max_temp_file_size 2G;

    location / {
      # Use IPv4 upstream address instead of DNS name to avoid attempts by nginx to use IPv6 DNS lookup
      proxy_pass http://127.0.0.1:9001/;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme; 
    }

}

#    
# Docker Proxy
# map to port 9002
#

server {
    listen 443 ssl http2;

    server_name docker-proxy.XXX.org;

    # logging
    error_log /var/log/nginx/nexus_docker_error.log debug;
    access_log /var/log/nginx/nexus_docker_access.log;

    # Push large objects to nexus
    client_max_body_size 2G;

    # SSL
    include ssl/*.XXX.org;

    location / {
      # Use IPv4 upstream address instead of DNS name to avoid attempts by nginx to use IPv6 DNS lookup
      proxy_pass http://127.0.0.1:9002/;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme; 
    }

}

Nexus Repository erstellen

Damit Docker Images gespeichert werden können, muss zunächst ein neues Repository vom Typ Docker Host angelegt werden. Wichtig hierbei ist, dass das Repostitory auf einen HTTP Connector mit dem Port aus dem Mapping, also 9002, übereinstimmt. Es muss auch nur der HTTP Connector sein, da wir uns per HTTPS auf dem Reverse Proxy später anmelden.

Docker Login

Um die Konfiguration zu Testen, kann man Docker Login verwenden.

docker login docker.XXX.org

Docker Proxy

Aufgrund eines Bugs in Nexus, ist die Konfiguration von Nexus für einen Docker Proxy nicht ganz so einfach, wie man es sich wünschen würde und es hat auch eher den Character eines Hacks.

Wie bereits oben beschrieben, ist ein weiterer Port 9002 in dem Mapping vorhanden. Der FQDN docker-proxy.XXX.org ist auf den Port 9002 gemappt.

In Nexus erstellen Sie nun ein weiteres Repository (Docker-Proxy) und vergeben dem Repository den Port 9002.