Docker Netzwerk ohne IPv6

CoMo

Commander
Registriert
Dez. 2015
Beiträge
2.812
Hallo,

Ich habe mir hier mal ein Docker samt Portainer aufgesetzt. Zunächst mal habe ich IPv6 für die Default Bridge aktiviert:
Code:
root@Docker:~# cat /etc/docker/daemon.json
{
  "data-root": "/mnt/storage/docker-data",
  "log-driver": "journald",
  "log-level": "warn",
  "debug": false,
  "ipv6": true,
  "fixed-cidr-v6": "2001:db8:1::/64"
}

Funktioniert soweit.

Nun habe ich Uptime Kuma als Stack direkt aus dem Github Repo deployed. Also von hier https://github.com/louislam/uptime-kuma

Problem: Das legt ein eigenes Netzwerk an, uptime-kuma_default. Und da gibt es dann kein IPv6.

Lege ich das Netzwerk vorher händisch an, kann der Stack nicht deployed werden:

Code:
Failed to deploy a stack: time="2024-09-19T17:21:38Z" level=warning msg="a network with name uptime-kuma_default exists but was not created by compose.\nSet external: true to use an existing network" network uptime-kuma_default was found but has incorrect label com.docker.compose.network set to ""

Hänge ich den Container händisch an das default Bridge Network, funktioniert alles. Aber sobald der Container neu deployed wird, hängt er wieder nur am "eigenen" Netz.

Was ist denn der beste Weg, um das Problem zu lösen?
 
Ich habe es nicht ganz überflogen, aber vielleicht findest du hier was.
 
Ich habe jetzt mit Hilfe von ChatGPT ein Skript erstellt, dass neue Container automatisch an die default bridge hängt:

/opt/attach_docker_ct_to_default_bridge.sh

Code:
#!/bin/bash

# Define the container name patterns as an environment variable
PATTERNS="*uptime-kuma* *thelounge*"

# Monitor Docker events
echo "Starting Docker event monitoring..."
docker events --filter 'event=create' | while read -r event
do
  # Output the raw event for debugging
  echo "Raw event data: $event"

  # Extract the container ID from the event
  container_id=$(echo "$event" | awk '{print $4}')
 
  # Output the extracted container ID for debugging
  echo "Extracted container ID: $container_id"

  # Check if the container ID is valid
  if [ ! -z "$container_id" ]; then
    # Get the container name
    container_name=$(docker inspect --format '{{.Name}}' "$container_id" | sed 's/^.\(.*\)/\1/')
   
    # Output the container name for debugging
    echo "Container Name: $container_name"
   
    # Check if the container name matches any of the patterns
    match_found=false
    for pattern in $PATTERNS; do
      if [[ $container_name == $pattern ]]; then
        echo "Pattern match found for container $container_name"
        match_found=true
        break
      fi
    done

    if $match_found; then
      echo "Connecting container $container_name to the Bridge network..."
     
      # Check if the container is already connected to the Bridge network
      if ! docker network inspect bridge --format '{{json .Containers}}' | grep -q "$container_id"; then
        docker network connect bridge "$container_id"
        echo "Container $container_name connected to the Bridge network."
      else
        echo "Container $container_name is already connected to the Bridge network."
      fi
    else
      echo "No pattern match found for container $container_name."
    fi
  else
    echo "Invalid container ID received: $container_id"
  fi
done

Code:
# /etc/systemd/system/attach_docker_ct_to_default_bridge.service
[Unit]
Description=Docker Events Monitor
After=network.target

[Service]
ExecStart=/opt/attach_docker_ct_to_default_bridge.sh
Restart=always
User=root
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

Funktioniert, kommt mir aber sehr frickelig vor. Gerne bessere Vorschläge.
 
Alternativ geht auch network_mode: bridge

Code:
services:
  uptime-kuma:
    image: louislam/uptime-kuma:1
    container_name: uptime-kuma
    volumes:
      - ./uptime-kuma-data:/app/data
    ports:
      - 3001:3001
    restart: always
    network_mode: bridge
 
Docker-Compose kopieren und nach eigenen Wünschen anpassen.

Mache ich auch in einigen Projekten. Und wenn es Updates gibt, dann schaue ich, ob ich diese zu meiner Kopie übernehmen muss.
 
Ich deploye den Stack direkt aus dem Github Repository. Wie soll ich das anstellen?

waterfox_CVGFVroNbw.png
 
Ach ja, du machst es über Portainer. Den nutze ich nicht.

Hast du eigenen Git-Server? Wenn ja, bei sich spiegeln, Branch erstellen, Änderungen eintragen und dann vom eigenen Git-Server ziehen?
 
Ja gut, dann muss ich doch auch ständig händisch eingreifen, wenn sich der Code Upstream ändert? Das soll ja alles vollautomatisch funktionieren inkl. Container Updates.
 
Dann frag bei dem Projekt, ob die auch eine ipv6 version von Docker-Compose anlegen können. ;) Oder mach einen Pull-Request.

Aber sobald ich nicht den Standard nutze, muss ich meine Lösung finden, mit der ich leben kann.
 
Du kannst ja bei 3 bleiben. Das Projekt auf GitHub clonen. Im eigenen Branch die Änderungen vornehmen. Natürlich musst due die Updates in deinem Clone immer wieder nachziehen.
 
Du kannst beliebig viele Stacks anlegen und für jeden Stack beliebig viele Container. Das ist doch der Sinn hinter der ganzen Geschichte…

Da du keinen ReverseProxy (traefik oder Npm) verwendest musst du natürlich auf die Ports achten weil auf dem Host jeder Port nur einmal geöffnet werden kann.

Du kannst also einfach einen neuen Kuma Stack anlegen (Kuma 2). Meine Compose File in den Webeditor fallen lassen, die Ports anpassen (-> nur den vorderen Teil! 1234:3001 als Beispiel) und den Container deployen.

Danach prüfst du ob der Container auf den Default Bridge Netzwek läuft und IPv6 unterstützt. Dann kannst du diesen nutzen und theoretisch zusätzlich die persistenten Daten von deinem alten Stack umziehen und den alten danach löschen.
 
Da ist vermutlich die Lösung mit dem Skript nun die einfachere. So funktionieren Auto-Updates und der Container hängt immer am Bridge Netzwerk. Dann lass ich das wohl einfach so. Danke für alle Tipps.

blablub1212 schrieb:
Da du keinen ReverseProxy (traefik oder Npm) verwendest

Ich verwende zoraxy, weil das viel mehr fancy aussah als die bekannten Lösungen 😛
 
Du kannst das ganze stark abkürzen und vor allem auf das Skript verzichten wenn du einfach ein Network definierst:

Code:
services:
    uptimekuma:
        restart: unless-stopped
        ports:
            - 3001:3001
        volumes:
            - ./data/:/app/data
            - /var/run/docker.sock:/var/run/docker.sock:ro
        container_name: uptimekuma
        image: louislam/uptime-kuma:1
        networks:
            - traefiknet

networks:
  traefiknet:


und solltest du ein anderen Service in das Network nehmen wollen:

Code:
version: "3"

services:
  whoami:
    image: traefik/whoami:latest
    container_name: whoami
    restart: unless-stopped
    networks:
       - traefiknet

networks:
  traefiknet:
    external: true
 
Hab ich. Eine Docker Compose ist kein Arch Linux. Diese erstellt man für seine eigenen Bedüfrnisse und nimmt die im Git Repo nur als Beispiel. Immer die default aus dem Git zu nehmen wird nicht klappen, zumindest wenn du mehrere Sachen miteinander verknüpfst.
 
Zurück
Oben