ubuntuusers.de

Docker-Anwendung eigene IP verpassen?

Status: Ungelöst | Ubuntu-Version: Server 24.04 (Noble Numbat)
Antworten |

Reihner

Anmeldungsdatum:
14. Juni 2017

Beiträge: 168

Wohnort: Klendathu

Hallo ihr, und auch du da in der Ecke,

Ich habe eine Frage zu Docker-Anwedungen an sich, also wo mehrere einzelne Container zusammen geschaltete sind. Ich bin mir ziemlich sicher das dies schon mal diskutiert/erklärt/gefragt wurde. Leider finde ich es nicht oder ich habe einen Denkfehler.

  • Wie kann ich der ganzen Anwendung eine Eigene IP verpassen ohne die interne IP-Struktur zu zu beschädigen?

So sieht die Anwendung aus ...

networks:
  internal:
    name: internal
    external: false

services:
  redis:
    container_name: immich_redis
    image: redis:7-alpine
    restart: unless-stopped
    networks:
      - internal
    healthcheck:
      test: redis-cli ping || exit 1

  db:
    container_name: immich_db
    image: tensorchord/pgvecto-rs:pg16-v0.3.0
    restart: unless-stopped
    networks:
      - internal
    volumes:
      - /share/Container/immich/pgdata:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: immich
      POSTGRES_USER: immich
      POSTGRES_PASSWORD: 123456
      POSTGRES_INITDB_ARGS: '--data-checksums'
    healthcheck:
      test: pg_isready --dbname='immich' --username='immich' || exit 1; Chksum="$$(psql --dbname='immich' --username='immich' --tuples-only --no-align --command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')"; echo "checksum failure count is $$Chksum"; [ "$$Chksum" = '0' ] || exit 1
      interval: 5m
      start_interval: 30s
      start_period: 5m
    command:
      [
        'postgres',
        '-c',
        'shared_preload_libraries=vectors.so',
        '-c',
        'search_path="$$user", public, vectors',
        '-c',
        'logging_collector=on',
        '-c',
        'max_wal_size=2GB',
        '-c',
        'shared_buffers=512MB',
        '-c',
        'wal_compression=on',
      ]

  db_backup:
    container_name: immich_db_backup
    image: prodrigestivill/postgres-backup-local:16
    restart: unless-stopped
    environment:
      POSTGRES_HOST: db
      POSTGRES_CLUSTER: 'TRUE'
      POSTGRES_USER: immich
      POSTGRES_PASSWORD: 123456
      POSTGRES_DB: immich
      SCHEDULE: "@daily"
      POSTGRES_EXTRA_OPTS: '--clean --if-exists'
      TZ: Europe/Berlin
    volumes:
      - /share/Container/immich/pgdata-backup:/backups
    depends_on:
      - db
    networks:
      - internal

  immich:
    container_name: immich
    image: ghcr.io/immich-app/immich-server:release
    restart: unless-stopped
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities:
                - gpu
                - compute
                - video
    depends_on:
      - db
      - redis
    networks:
      - internal
      
    ports:
      - 2283:2283
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /share/Container/immich/library:/usr/src/app/upload
      - /share/internes NAS/Eigene Bilder:/mnt/bilder
    environment:
      DB_HOSTNAME: db
      DB_USERNAME: immich
      DB_DATABASE_NAME: immich
      DB_PASSWORD: 123456
      TZ: Europe/Berlin
    healthcheck:
      disable: false

  immich-machine-learning:
    container_name: immich-machine-learning
    image: ghcr.io/immich-app/immich-machine-learning:release
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities:
                - gpu
    restart: unless-stopped
    depends_on:
      - db
      - redis
    networks:
      - internal
    volumes:
      - /share/Container/immich/model-cache:/cache
    environment:
      DB_HOSTNAME: db
      DB_USERNAME: immich
      DB_DATABASE_NAME: immich
      DB_PASSWORD: 123456
      TZ: Europe/Berlin
    healthcheck:
      disable: false

... und die will ich über eine eigene IP, nicht die IP des Servers wo Docker läuft, erreichen können .. oder zumindest den immich-Server an sich.

BillMaier Team-Icon

Supporter

Anmeldungsdatum:
4. Dezember 2008

Beiträge: 6494

Mir wäre nicht bekannt, dass es so etwas für Docker gibt. Für Kubernetes gibt es dafür die Services mit loadBalancerIP , aber auch die brauchen dann einen separaten LoadBalancer (außerhalb oder innerhalb des Clusters), der sich dann um das Routing kümmert.

Darf ich fragen, was du genau damit vor hast?

Wenn es dir nur darum geht, mehrere http(s)-Endpoints an einer Adresse zu betreiben, dann wäre ein ReverseProxy wie traefik eine gute Wahl: https://doc.traefik.io/traefik/routing/providers/docker/

Die IP ist dann aber immer noch die des Hosts.

Wenn du zusätzliche IPs auf Hosts haben willst, kannst du dir keepalived anschauen. Das wäre aber eher was bei mehreren Nodes. Für „eine IP pro Docker Service“ ist das nicht geeignet, weil das außerhalb der Docker Services gepflegt werden muss und damit sehr umständlich wird und nicht skaliert. Außerdem liegt da einfach nur eine weitere IP an deinem Host an. Ist glaub nicht dein Anwendungsfall.

Viele Grüße

BillMaier

encbladexp Team-Icon

Ehemaliger
Avatar von encbladexp

Anmeldungsdatum:
16. Februar 2007

Beiträge: 17521

---
service:
  bla:
    ports:
      - "1.2.3.4:1234:1234"

Ist was du suchst, dem Host gibst du dann halt noch 1.2.3.4 als weitere IP, schon lauscht der Dienst nur auf dieser einen IP. Geht auch mit anderen Interfaces die der Host kennt, so langer er das Interface und diese IP (auch) hat.

BillMaier Team-Icon

Supporter

Anmeldungsdatum:
4. Dezember 2008

Beiträge: 6494

Wieder was gelernt

Reihner

(Themenstarter)

Anmeldungsdatum:
14. Juni 2017

Beiträge: 168

Wohnort: Klendathu

encbladexp schrieb:

---
service:
  bla:
    ports:
      - "1.2.3.4:1234:1234"

Ist was du suchst, dem Host gibst du dann halt noch 1.2.3.4 als weitere IP, schon lauscht der Dienst nur auf dieser einen IP. Geht auch mit anderen Interfaces die der Host kennt, so langer er das Interface und diese IP (auch) hat.

Das klingt ja einfach! Dazu habe ich jedoch ein paar technische Nachfragen:

  • muss bzw. sollte ich das bei jedem Port angeben:

---
service:
  bla:
    ports:
      - "1.2.3.4:1234:1234"
      - "1.2.3.4:1235:1235"
      - "1.2.3.4:1236:1236"

oder reicht es, wenn ich Das nur einmal angebe:

---
service:
  bla:
    ports:
      - "1.2.3.4:1234:1234"
      - "1235:1235"
      - "1236:1236"

um den gesamten Container mit allen Ports auf diese IP zu hängen?

  • Ich nehme an das ich, wie oben im Beispiel von Immich, dies dann für jeden einzelnen Container angeben muss mit:

---
service:
  bla:
    image: X
    ports:
      - "1.2.3.4:1234:1234"

  bla:
    image: y
    ports:
      - "1.2.3.4"

  bla:
    image: Z
    ports:
      - "1.2.3.4"

oder kann ich das mit einer einzelnen Zeile, in der compose.yml, für alle enthaltenen Container festlegen?

ich bin mir gerade nicht sicher wie ich das testen kann/könnte.

encbladexp Team-Icon

Ehemaliger
Avatar von encbladexp

Anmeldungsdatum:
16. Februar 2007

Beiträge: 17521

Du musst das pro Port der exposed wird machen. Default ist 0.0.0.0 / any.

Testen kannst du das einfach selbst, denn was du konfiguriert hast ist unter docker container ls sichtbar.

Antworten |