Implementierung von Diensten im Docker für den Zugriff auf Hostdienste

Implementierung von Diensten im Docker für den Zugriff auf Hostdienste

1. Szenario

Verwenden Sie Windows und WSL2 für die tägliche Entwicklungs- und Testarbeit. Bei wsl2 treten jedoch häufig Netzwerkprobleme auf. Heute teste ich beispielsweise ein Projekt, dessen Kernfunktion darin besteht, Postgres-Daten mithilfe der Open-Source-Komponente Synch mit Clickhouse zu synchronisieren.

Zum Testen erforderliche Komponenten

  1. postgres
  2. Kafka
  3. Tierpfleger
  4. Redis
  5. Synchronisierungscontainer

Beim Testen zu Beginn wurde als Lösung gewählt, die oben genannten fünf Dienste mit Docker-Compose zu orchestrieren, und network_modules verwendete den Hosts-Modus. In Anbetracht des Abhörsicherheitsmechanismus von Kafka erfordert dieser Netzwerkmodus keine separate Angabe der freigegebenen Ports.

Die Datei docker-compose.yaml sieht wie folgt aus

Version: "3"
 
Leistungen:
  postgres:
    Bild: failymao/postgres:12.7
    Containername: postgres
    Neustart: sofern nicht gestoppt
    privilegiert: true # Docker-Compose-Umgebungsdatei festlegen Befehl: [ "-c", "config_file=/var/lib/postgresql/postgresql.conf", "-c", "hba_file=/var/lib/postgresql/pg_hba.conf" ]
    Bände:
      - ./config/postgresql.conf:/var/lib/postgresql/postgresql.conf
      - ./config/pg_hba.conf:/var/lib/postgresql/pg_hba.conf
    Umfeld:
      POSTGRES_PASSWORD: abc123
      POSTGRES_USER: postgres
      POSTGRES_PORT: 15432
      POSTGRES_HOST: 127.0.0.1
    Gesundheitscheck:
      Test: sh -c "sleep 5 && PGPASSWORD=abc123 psql -h 127.0.0.1 -U postgres -p 15432 -c '\q';"
      Intervall: 30s
      Zeitüberschreitung: 10 s
      Wiederholungsversuche: 3
    Netzwerkmodus: "Host"
 
  Tierpfleger:
    Bild: failymao/zookeeper:1.4.0
    Containername: Zookeeper
    Neustart: immer
    Netzwerkmodus: "Host"
 
  Kafka:
    Bild: failymao/kafka:1.4.0
    Containername: Kafka
    Neustart: immer
    hängt ab von:
      - Tierpfleger
    Umfeld:
      KAFKA_ADVERTISED_HOST_NAME: kafka
      KAFKA_ZOOKEEPER_CONNECT: localhost:2181
      KAFKA_LISTENERS: PLAINTEXT://127.0.0.1:9092
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://127.0.0.1:9092
      KAFKA_BROKER_ID: 1
      KAFKA_LOG_RETENTION_HOURS: 24
      KAFKA_LOG_DIRS: /data/kafka-data #Daten mountnetwork_mode: "host"
 
  Produzent:
    hängt ab von:
      - Redis
      - Kafka
      - Tierpfleger
    Bild: long2ice/synch
    Containername: Produzent
    Befehl: sh -c "
      30 schlafen &&
      synch --alias pg2ch_test produzieren"
    Bände:
      - ./synch.yaml:/synch/synch.yaml
    Netzwerkmodus: "Host"
 
  # Ein Verbraucher verbraucht einen Datenbankverbraucher:
    tty: wahr
    hängt ab von:
      - Redis
      - Kafka
      - Tierpfleger
    Bild: long2ice/synch
    Containername: Verbraucher
    Befehl: sh -c
      "schlafe 30 &&
      synch --alias pg2ch_test verwenden --schema pg2ch_test"
    Bände:
      - ./synch.yaml:/synch/synch.yaml
    Netzwerkmodus: "Host"
 
  Redis:
    Hostname: Redis
    Containername: Redis
    Bild: redis:latest
    Bände:
      - redis:/Daten
    Netzwerkmodus: "Host"
 
Bände:
  Redis:
  Kafka:
  Tierpfleger:

Während des Tests mussten wir Postgres- und Wal2Json-Komponenten verwenden. Es war sehr mühsam, die Komponenten separat im Container zu installieren. Nach mehreren Versuchen scheiterten wir. Daher entschieden wir uns, den Postgres-Dienst auf dem Host-Computer zu installieren. Der Synchronisierungsdienst im Container verwendet die IP und den Port des Host-Computers.

Aber nach dem Neustart des Dienstes kann der Synchronisierungsdienst immer noch nicht gestartet werden, und das Protokoll zeigt, dass Postgres keine Verbindung herstellen kann. Die Synchronisierungskonfigurationsdatei lautet wie folgt

Kern:
  debug: true # wenn auf True gesetzt, werden SQL-Informationen angezeigt.
  insert_num: 20000 # wie viele Zahlen sollen übermittelt werden, es wird empfohlen, bei der Produktion 20000 einzustellen
  insert_interval: 60 # wie viele Sekunden gesendet werden sollen, empfehlen wir die Einstellung 60 bei der Produktion
  # Aktivieren Sie dies, um automatisch eine Datenbanksynchronisierung in ClickHouse zu erstellen und Monitordaten einzufügen
  Überwachung: wahr
 
Redis:
  Gastgeber: Redis
  Port: 6379
  Anzahl der Zeichen: 0
  Passwort:
  Präfix: synch
  sentinel: false # Redis-Sentinel aktivieren
  sentinel_hosts: # Redis-Sentinel-Hosts
    127.0.0.1:5000
  sentinel_master: Meister
  queue_max_len: 200000 # maximale Streamlänge, redundante werden mit FIFO gelöscht
 
Quelldatenbank:
  -db_typ: postgres
    Alias: pg2ch_test
    broker_type: kafka # unterstützt derzeit Redis und Kafka
    Host: 127.0.0.1
    Port: 5433
    Benutzer: postgres
    Passwort: abc123
    Datenbanken:
      - Datenbank: pg2ch_test
        auto_create: wahr
        Tabellen:
          - Tabelle: pgbench_accounts
            auto_full_etl: wahr
            clickhouse_engine: ZusammenklappenMergeTree
            sign_column: Zeichen
            Versionsspalte:
            partition_by:
            Einstellungen:
 
Klickhaus:
  # Shard-Hosts werden beim Cluster nach dem Zufallsprinzip eingefügt
  Gastgeber:
    – 127.0.0.1:9000
  Benutzer: Standard
  Passwort: ''
  cluster_name: # Cluster-Modus aktivieren, wenn nicht leer, und es muss mehr als einen Host geben, wenn aktiviert.
  distributed_suffix: _all # Suffix für verteilte Tabellen, im Cluster verfügbar
 
Kafka:
  Server:
    – 127.0.0.1:9092
  topic_prefix: synchronisieren

Diese Situation ist sehr merkwürdig. Stellen Sie zunächst sicher, dass Postgres gestartet ist und der Abhörport (hier 5433) normal ist. Sowohl localhost als auch die Host-Eth0-Netzwerkkartenadresse melden Fehler.

2. Lösung

Google-Antwort, siehe hochgelobte Antwort von Stackoverflow, das Problem ist gelöst, die ursprüngliche Antwort lautet wie folgt

Wenn Sie Docker für Mac oder Docker für Windows 18.03+ verwenden, stellen Sie einfach über den Host host.docker.internal eine Verbindung zu Ihrem MySQL-Dienst her (anstelle der 127.0.0.1 in Ihrer Verbindungszeichenfolge).

Wenn Sie Docker-for-Linux 20.10.0+ verwenden, können Sie auch den Host host.docker.internal verwenden, wenn Sie Ihren Docker gestartet haben

Container mit der Option --add-host host.docker.internal:host-gateway.

Ansonsten lesen Sie weiter unten

Verwenden Sie ** --network="host" ** in Ihrem Docker-Run-Befehl, dann zeigt 127.0.0.1 in Ihrem Docker-Container auf Ihren Docker-Host.

Weitere Einzelheiten finden Sie im Quellbeitrag.

Im Hostmodus greifen Dienste in Containern auf Dienste auf dem Hostcomputer zu

Um den Fehler zu beheben, ändern Sie die Postgres-Abhöradresse in host.docker.internal. Überprüfen Sie die Datei /etc/hosts des Hostcomputers wie folgt

root@failymao-NC:/mnt/d/pythonProject/pg_2_ch_demo# cat /etc/hosts
# Diese Datei wurde automatisch von WSL generiert. Um die automatische Generierung dieser Datei zu stoppen, fügen Sie den folgenden Eintrag zu /etc/wsl.conf hinzu:
# [Netzwerk]
# generateHosts = false
127.0.0.1 lokaler Host
 
10.111.130.24 host.docker.internal

Sie können die Zuordnung zwischen der Host-IP und dem Domänennamen sehen. Durch Zugriff auf den Domänennamen wird dieser in die Host-IP aufgelöst und greift auf den Host-Dienst zu.

Abschließend ist die Konfiguration des Synch-Dienstes wie folgt:

Kern:
  debug: true # wenn auf True gesetzt, werden SQL-Informationen angezeigt.
  insert_num: 20000 # wie viele Zahlen sollen übermittelt werden, es wird empfohlen, bei der Produktion 20000 einzustellen
  insert_interval: 60 # wie viele Sekunden gesendet werden sollen, empfehlen wir die Einstellung 60 bei der Produktion
  # Aktivieren Sie dies, um automatisch eine Datenbanksynchronisierung in ClickHouse zu erstellen und Monitordaten einzufügen
  Überwachung: wahr
 
Redis:
  Gastgeber: Redis
  Port: 6379
  Anzahl der Zeichen: 0
  Passwort:
  Präfix: synch
  sentinel: false # Redis-Sentinel aktivieren
  sentinel_hosts: # Redis-Sentinel-Hosts
    127.0.0.1:5000
  sentinel_master: Meister
  queue_max_len: 200000 # maximale Streamlänge, redundante werden mit FIFO gelöscht
 
Quelldatenbank:
  -db_typ: postgres
    Alias: pg2ch_test
    broker_type: kafka # unterstützt derzeit Redis und Kafka
    Host: host.docker.internal
    Port: 5433
    Benutzer: postgres
    Passwort: abc123
    Datenbanken:
      - Datenbank: pg2ch_test
        auto_create: wahr
        Tabellen:
          - Tabelle: pgbench_accounts
            auto_full_etl: wahr
            clickhouse_engine: ZusammenklappenMergeTree
            sign_column: Zeichen
            Versionsspalte:
            partition_by:
            Einstellungen:
 
Klickhaus:
  # Shard-Hosts werden beim Cluster nach dem Zufallsprinzip eingefügt
  Gastgeber:
    – 127.0.0.1:9000
  Benutzer: Standard
  Passwort: ''
  cluster_name: # Cluster-Modus aktivieren, wenn nicht leer, und es muss mehr als einen Host geben, wenn aktiviert.
  distributed_suffix: _all # Suffix für verteilte Tabellen, im Cluster verfügbar
 
Kafka:
  Server:
    – 127.0.0.1:9092
  topic_prefix: Host synchronisieren: host.docker.internal
Kern:
  debug: true # wenn auf True gesetzt, werden SQL-Informationen angezeigt.
  insert_num: 20000 # wie viele Zahlen sollen übermittelt werden, es wird empfohlen, bei der Produktion 20000 einzustellen
  insert_interval: 60 # wie viele Sekunden gesendet werden sollen, empfehlen wir die Einstellung 60 bei der Produktion
  # Aktivieren Sie dies, um automatisch eine Datenbanksynchronisierung in ClickHouse zu erstellen und Monitordaten einzufügen
  Überwachung: wahr
 
Redis:
  Gastgeber: Redis
  Port: 6379
  Anzahl der Zeichen: 0
  Passwort:
  Präfix: synch
  sentinel: false # Redis-Sentinel aktivieren
  sentinel_hosts: # Redis-Sentinel-Hosts
    127.0.0.1:5000
  sentinel_master: Meister
  queue_max_len: 200000 # maximale Streamlänge, redundante werden mit FIFO gelöscht
 
Quelldatenbank:
  -db_typ: postgres
    Alias: pg2ch_test
    broker_type: kafka # unterstützt derzeit Redis und Kafka
    Gastgeber: 
    Port: 5433
    Benutzer: postgres
    Passwort: abc123
    Datenbanken:
      - Datenbank: pg2ch_test
        auto_create: wahr
        Tabellen:
          - Tabelle: pgbench_accounts
            auto_full_etl: wahr
            clickhouse_engine: ZusammenklappenMergeTree
            sign_column: Zeichen
            Versionsspalte:
            partition_by:
            Einstellungen:
 
Klickhaus:
  # Shard-Hosts werden beim Cluster nach dem Zufallsprinzip eingefügt
  Gastgeber:
    – 127.0.0.1:9000
  Benutzer: Standard
  Passwort: ''
  cluster_name: # Cluster-Modus aktivieren, wenn nicht leer, und es muss mehr als einen Host geben, wenn aktiviert.
  distributed_suffix: _all # Suffix für verteilte Tabellen, im Cluster verfügbar
 
Kafka:
  Server:
    – 127.0.0.1:9092
  topic_prefix: synchronisieren

3. Fazit

Wenn Sie beim Starten eines Containers im Modus --networks="host" auf Dienste auf dem Host im Container zugreifen möchten, ändern Sie die IP in `host.docker.internal`

4. Referenzen

https://stackoverflow.com/questions/24319662/from-inside-of-a-docker-container-how-do-i-connect-to-the-localhost-of-the-mach

Dies ist das Ende dieses Artikels über die Implementierung von Diensten in Docker, die auf Hostdienste zugreifen. Weitere relevante Inhalte zum Docker-Zugriff auf den Host finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • So verwenden Sie einen Docker-Container für den Zugriff auf das Host-Netzwerk
  • So greifen Sie in Docker auf den lokalen Computer (Hostcomputer) zu
  • Lösung, wenn der Docker-Container nicht auf den Host-Port zugreifen kann
  • Lösung für den Docker-Container, der keine Schreibberechtigung für das Host-Verzeichnis hat
  • Zusammenfassung der Dateninteraktion zwischen Docker-Container und Host
  • Lösen Sie das Problem des 8-Stunden-Unterschieds zwischen Docker-Container und Host-Computer

<<:  Zusammenfassung des CSS-Zählers und des Inhalts

>>:  Detaillierte Erklärung verschiedener Bildformate wie JPG, GIF und PNG

Artikel    

Artikel empfehlen

VMWare Linux MySQL 5.7.13 Installations- und Konfigurationstutorial

In diesem Artikel finden Sie das Tutorial zur Ins...

So verwenden Sie xshell zum Herstellen einer Verbindung zu Linux in VMware (2 Methoden)

【Vorwort】 Ich möchte vor Kurzem das Prüfungssyste...

Anwendung und Implementierung des Datencache-Mechanismus für kleine Programme

Informationen zum Miniprogramm-Datencache Datenca...

Zusammenfassung einiger Tipps zum MySQL-Indexwissen

Inhaltsverzeichnis 1. Grundkenntnisse der Indizie...

So zeigen Sie kleine Symbole in der Browsertitelleiste einer HTML-Webseite an

Genau wie dieser Effekt ist auch die Methode sehr...

HTML-Grundlagen_Allgemeine Tags, allgemeine Tags und Tabellen

Teil 1 HTML <html> – Start-Tag <Kopf>...

Mybatis-Statistiken zur Ausführungszeit jeder SQL-Anweisung

Hintergrund In letzter Zeit werde ich in Intervie...

Unterschiede im Stundentrennzeichen zwischen Browsern

Beim Erstellen einer Webseite verwenden Sie manchm...

So stellen Sie zabbix_agent in Docker bereit

zabbix_agent-Bereitstellung: Empfehlung: zabbix_a...