7 / 7
Dec 2024

Hallo,

ich beziehe mich auf das Posting Zugriff Datenbank (Docker)

Wenn ich die Anweisungen unter “Datenbank im Host-Netz” ausführe (Debian 12, egroupware-docker 23.1.20240930-1), erhalte ich Zugriff über die interne IP des Datenbank Containers (z.B. 172.19.0.x) auf Port 3306.

Als sehr erfahrener Linux Nutzer aber Docker Neuling hatte ich allerdings Schwierigkeiten herauszufinden, auf welcher IP Port 3306 überhaupt verfügbar sein sollte. Ich ging zunächst von 127.0.0.1 im Host aus. Auch wenn das dem Standard Docker User Vielleicht total klar ist, könnte es für andere Neulinge ganz hilfreich, wenn ihr im o.g. Beitrag noch den Hinweis ergänzt, wie man die Container IP herausfindet und somit Zugriff auf Port 3306 erlangen kann.

Vielleicht habe ich auch etwas ganz falsch verstanden und das könnte ebenfalls klar gestellt werden. :slight_smile:

Viele Grüße
xero

  • created

    Dec '24
  • last reply

    Dec '24
  • 6

    replies

  • 164

    views

  • 3

    users

  • 1

    like

  • 3

    links

Hallo Stefan,

danke für die schnelle Rückmeldung.

Sollte somit auf dem Host auf Port 3306 ansprechbar sein.

Tut es das nicht?

Korrekt, funktioniert so nicht. Genau diese Settings (127.0.0.1:3306:3306) habe ich verwendet und ging zunächst auch davon aus, dass die Datenbank unter 127.0.0.1:3306 auf dem Host erreichbar werden sollte, das ist aber nicht der Fall in meiner frischen Debian 12 Installation. Wenn es wie beschrieben funktionieren würde, sollte der Port dann unter 127.0.0.1:3306 in netstat sichtbar sein? 3306 ist auf dem Host nicht belegt.

Wie/womit willst du an die DB?
Und warum?

Wir müssen für eine Integration mit einem internen System ein paar Informationen aus der Datenbank lesen, die eben nicht über eine API abrufbar sind. Der Zugriff ist von aussen voll abgesichert.

Grüße
xero

Ich habe noch einmal bei mir geschaut.
Auf meiner privaten EGw komme ich lokal auf die Docker-DB, getestet mit Webmin.
Ebenso komme ich per phpMyAdmin drauf.
Beides habe ich vor längerem mal eingerichtet.

Hast du versucht dich auf dem Host mit der DB zu verbinden?


Unser API bietet die Funktionalität, welche wir in Projekten für Kunden umgesetzt haben.
Kunde beauftragt, wir setzen um und geben das als OSS frei. So kommen die EGw-Funktionen zustande.
Ihr könntet also prüfen, ob eine API-Erweiterung für euch Sinn macht…

Mit einem DB-Direktzugriff hätte ich immer Bauchschmerzen.

Auch im lokalen Netz muss das sicher sein.

Stefan

Ich habe erneut eine frische Installation in einem Standard Debian 12 Host ausgeführt, wie aus dem How-To:

echo 'deb http://download.opensuse.org/repositories/server:/eGroupWare/Debian_12/ /' | sudo tee /etc/apt/sources.list.d/server:eGroupWare.list
sudo apt install gnupg
wget -nv https://download.opensuse.org/repositories/server:eGroupWare/Debian_12/Release.key -O - | sudo tee /etc/apt/trusted.gpg.d/server:eGroupWare.asc
sudo apt update
apt install egroupware-docker
cd /etc/egroupware-docker
vi docker-compose.override.yml   # "db:/ports:/- 127.0.0.1:3306:3306" Zeilen unter "services:" eingefügt
vi latest-docker-compose.override.yml   # sicherheitshalber auch hier, um das auszuschließen
docker-compose restart # Container alle korrekt neugestartet, keine doppelten Container

netstat -nlp | grep 3306
telnet 127.0.0.1 3306
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused

Einfacher Verbindungstest mittels telnet und nicht mit MariaDB Client Tools schlägt fehl. 127.0.0.1:3306 auch in netstat nicht sichtbar (ich vermute das sollte er aber!?).

Ansonsten ist die Datenbank über die Container IP 172.19.0.x:3306 vom Host aus erreichbar.

Ich habe noch einmal bei mir geschaut.
Auf meiner privaten EGw komme ich lokal auf die Docker-DB, getestet mit Webmin.
Ebenso komme ich per phpMyAdmin drauf.
Beides habe ich vor längerem mal eingerichtet.

Hast du versucht dich auf dem Host mit der DB zu verbinden?

Ja, alles vom Host aus.

Erscheint bei dir auf dem Host der Port 3306 in netstat als docker-proxy?

Hast du in der Firewall noch Forwards/NAT, die bei mir evtl. nicht automatisch eingerichtet werden (iptables -nvL | grep 3306 ; iptables -nvL -t nat | grep 3306)?

Grüße
xero

Habe die Lösung nun mit viel Debugging gefunden.

Nach ergänzen des ‘ports’ Settings für ‘db’ in docker-compose.override.yml führt ein docker-compose restart nicht mehr zum gewünschten Resultat (ggf. seit Docker in Debian 12?). Notwendig ist nun:

# docker-compose up -d
....
Recreating egroupware-db ... done
....

Ausführlich

Dies führt dazu, dass der Container angehalten, neu gebaut und gestartet wird (aus der manpage zu ‘up’: “… so that changes in docker-compose.yml are picked up…”)

egroupware-watchtower is up-to-date
Recreating egroupware-db ... done
egroupware is up-to-date
egroupware-push is up-to-date
egroupware-nginx is up-to-date

Ginge auch explizit nur für den DB Container: docker-compose up -d db
Ich vermute das dürfte auch auf alle anderen Anpassungen in den override Files zutreffen. Ggf. wäre hier also die Doku bei euch aktualisieren?

Danach ist der Port auch in netstat zu finden

# netstat -nlp | grep 3306
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      12345/docker-proxy

Auch wenn für den Erfahrenen docker Nutzer sicher irrelevant, zur Debugging Referenz, falls mal wieder jemand auf das Problem in anderem Kontext stossen sollte, docker inspect sollte bei korrekter Durchleitung folgendes zeigen

# docker inspect egroupware-db
    ...
    "HostConfig": {
        "PortBindings": {
            "3306/tcp": [
                {
                    "HostIp": "127.0.0.1",
                    "HostPort": "3306"
                }
            ]
        },
    ...
    },
    "NetworkSettings": {
       ...
        "Ports": {
            "3306/tcp": [
                {
                    "HostIp": "127.0.0.1",
                    "HostPort": "3306"
                }
            ]
        },

Grüße

xero