Hallo zusammen,
ich schaffe es einfach nicht zwei container mit jeweils mysql zu starten :-(
Der zweite container meckert immer, dass der port 3306 belegt ist, obwohl ich mit Port bereites alle Varianten durchgetestet habe.
Jedes mysql für sich mit den gleichen ports und expose kann zum Testen gestartet werden und läuft soweit auch.
Wer könnte mir mal bitte expose und ports erklären und ein lauffähiges Beispiel geben, damit ich beide Datenbanken gleichzeitig starten kann?
Viele Grüße
Christian
Dieser ist der aktuell laufende container, es sind noch weitere container mit in dieser docker-compose.yml , die ich jetzt weg gelassen haben.
version: '3.3'
networks:
net:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.27.0.0/24
services:
mysql:
image: hypriot/rpi-mysql
restart: always
network_mode: host
expose:
- "3306"
- "33060"
ports:
- "3306:3306"
- "33060:33060"
volumes:
- ./mysql/init.sql:/docker-entrypoint-initdb.d/fhem-init.sql
- ./mysql/data:/var/lib/mysql
- ./mysql/log:/var/log
- ./mysql/mycustom.cnf:/etc/mysql/conf.d/custom.cnf
environment:
- MYSQL_ROOT_PASSWORD=xxxxx
- MYSQL_DATABASE=fhem
- MYSQL_USER=fhemuser
- MYSQL_PASSWORD=xxxxx
Hier kann ich bei ports und expose angeben was ich will, es kommt immer post 3306 bereits belegt
version: '3.3'
networks:
net:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.27.0.0/24
services:
mysql:
image: hypriot/rpi-mysql
restart: always
network_mode: host
expose:
- '3306'
- '33060'
ports:
- '3306:3307'
- '33060:33070'
volumes:
- ./mysql/init.sql:/docker-entrypoint-initdb.d/fhem-init.sql
- ./mysql/data:/var/lib/mysql
- ./mysql/log:/var/log
- ./mysql/mycustom.cnf:/etc/mysql/conf.d/custom.cnf
environment:
- MYSQL_ROOT_PASSWORD=xxxxx
- MYSQL_DATABASE=fhem
- MYSQL_USER=fhemuser
- MYSQL_PASSWORD=xxxxx
Und hier noch die Meldungen
docker-compose up
WARNING: Some networks were defined but are not used by any service: net
Recreating fhem_2021_mysql_1 ... done
Attaching to fhem_2021_mysql_1
mysql_1 | 201109 16:44:30 [Warning] Using unique option prefix key_buffer instead of key_buffer_size is deprecated and will be removed in a future release. Please use the full name instead.
mysql_1 | 201109 16:44:30 [Note] mysqld (mysqld 5.5.60-0+deb7u1) starting as process 1 ...
mysql_1 | 201109 16:44:30 [Warning] Using unique option prefix myisam-recover instead of myisam-recover-options is deprecated and will be removed in a future release. Please use the full name instead.
mysql_1 | 201109 16:44:30 [Note] Plugin 'FEDERATED' is disabled.
mysql_1 | 201109 16:44:30 InnoDB: The InnoDB memory heap is disabled
mysql_1 | 201109 16:44:30 InnoDB: Mutexes and rw_locks use GCC atomic builtins
mysql_1 | 201109 16:44:30 InnoDB: Compressed tables use zlib 1.2.7
mysql_1 | 201109 16:44:30 InnoDB: Using Linux native AIO
mysql_1 | 201109 16:44:30 InnoDB: Initializing buffer pool, size = 128.0M
mysql_1 | 201109 16:44:30 InnoDB: Completed initialization of buffer pool
mysql_1 | 201109 16:44:30 InnoDB: highest supported file format is Barracuda.
mysql_1 | 201109 16:44:30 InnoDB: Waiting for the background threads to start
mysql_1 | 201109 16:44:31 InnoDB: 5.5.60 started; log sequence number 1605465
mysql_1 | 201109 16:44:31 [Note] Server hostname (bind-address): '0.0.0.0'; port: 3306
mysql_1 | 201109 16:44:31 [Note] - '0.0.0.0' resolves to '0.0.0.0';
mysql_1 | 201109 16:44:31 [Note] Server socket created on IP: '0.0.0.0'.
mysql_1 | 201109 16:44:31 [ERROR] Can't start server: Bind on TCP/IP port: Address already in use
mysql_1 | 201109 16:44:31 [ERROR] Do you already have another mysqld server running on port: 3306 ?
mysql_1 | 201109 16:44:31 [ERROR] Aborting
mysql_1 |
mysql_1 | 201109 16:44:31 InnoDB: Starting shutdown...
mysql_1 | 201109 16:44:32 InnoDB: Shutdown completed; log sequence number 1605465
mysql_1 | 201109 16:44:32 [Note] mysqld: Shutdown complete
mysql_1 |
fhem_2021_mysql_1 exited with code 1
Zitat von: balli1187 am 09 November 2020, 18:18:36
Hast du mal die Expose-Blöcke komplett weggelassen?!
Wenn ich das richtig im Kopf habe, hat man "früher" die genutzten Ports per Expose an den Host übergeben. "Port" ist die Weiterentwicklung, da man hier eine genaue Definition zwischen internen und externen Ports vornehmen kann.
Expose habe ich komplett raus genommen.
ports:
- '3307:3306'
- '33070:33060'
oder auch
ports:
- '3306:3307'
- '33060:33070'
Das hat alles keinerlei Wirkung, selbst wenn ich den Container im Portainer mit remove entfernt habe.
Das Log sieht noch genau so aus und Port 3306 wird als belegt angezeigt. Die andere Datenbank läuft ja auch.
Von Balli1187:
Mal gecheckt was auf den Ports hängt?
Wurde glaub ich ein paar Posts zuvor schon diskutiert.
Andere Frage: was hast du mit den mysql-Instanzen vor? Wenn du nur von FHEM aus darauf zugreifen willst, reicht es aus, wenn die Container im gleichen Netzwerk sind. Ein weiterreichen an den Host ist nur notwendig wenn du von außen darauf zugreifen willst.
Zitat
Mal gecheckt was auf den Ports hängt?
Da ist natürlich die erste Datenbank Instanz :-)
Zitat
Andere Frage: was hast du mit den mysql-Instanzen vor? Wenn du nur von FHEM aus darauf zugreifen willst, reicht es aus, wenn die Container im gleichen Netzwerk sind. Ein weiterreichen an den Host ist nur notwendig wenn du von außen darauf zugreifen willst.
Bisher greife ich von außen auch darauf zu.
In einem zweiten Netz würden dann beide eine eigene IP:3306 Zuweisung haben, das wäre okay, wenn auch grafana mit in das Netz kommt.
Leider muss ich jedoch Fhem mit Host Netz betreiben, weil ich einen SMAEM betreibe und der kann nicht über NAT laufen :-(
Wer könnte mir eine .yml Konfiguration liefern, bei der Fhem mit zwei Netzen im Docker Container arbeitet? Auch da sind meine Versuche bisher gescheitert, weshalh nun alles im selben Host Netz läuft.
Also ... im Containmer sind die Port egal, aber außerhalb, d.h. auf dem Host System, müssen sie natürlich unterschiedlich sein.
Auf einem System darf es nur jeweils eine IP:Port Configuration geben.
https://docs.docker.com/config/containers/container-networking/
Der erste Port in der Config giebt den Host-Port an, also den des Container-Servers. Für mysql müsstest Du auf einem Container:
3306:3306
und auf dem 2.
3307:3306
Mekre, der erste Port ist Unterschiedlich.
Wenn die Container dagegen direkt von einem anderem Container im gleichen Projekt angesprochen werden (gemeinsame docker-compose.yml) brauchst Du dagegen die Ports NICHT rauszulinken! Dann ist es ein zusätzliches Sicherheitsfeature, da dann myswql von "außen" nicht erreichbar.
Hinweis: Vom Container Server und allen anderen Containern auf dem System ist dagegen auch ein nicht rausgelingter mysql-Port erreichbar ....
Zitat von: Wernieman am 10 November 2020, 07:55:02
Wenn die Container dagegen direkt von einem anderem Container im gleichen Projekt angesprochen werden (gemeinsame docker-compose.yml) brauchst Du dagegen die Ports NICHT rauszulinken! Dann ist es ein zusätzliches Sicherheitsfeature, da dann myswql von "außen" nicht erreichbar.
Hinweis: Vom Container Server und allen anderen Containern auf dem System ist dagegen auch ein nicht rausgelingter mysql-Port erreichbar ....
Und da wird das Problem sein, dass der Port 3306 innerhalb des Projektes doppelt ist und deshalb erst garnicht an den Host gegeben wird.
Dann muss ich mal schauen, ob ich zweimal ein Host Netz definieren kann und die beiden mysql Datenbanken dann in zwei Projekten trenne.
Vielen dank erstmal, ich berichte weiter
Christian
Nein .. wenn Du 2 Container hast, kannst Du 2 mal den gleichen Port verwenden.
jeder Container hat seine eigene IP, also ist IP:Port eindeutig ..... fast wie bei einer VM (wobei Container aber keine VMs sind!)
Zitat von: Wernieman am 10 November 2020, 08:35:08
Nein .. wenn Du 2 Container hast, kannst Du 2 mal den gleichen Port verwenden.
jeder Container hat seine eigene IP, also ist IP:Port eindeutig ..... fast wie bei einer VM (wobei Container aber keine VMs sind!)
Leider habe ich ein Host Netzwerk, wodurch alle Container die Host IP-Adresse haben.
Dann wäre es wahrscheinlich einfacher für mysql ein zusätzliches Netzwerk zu konfigurieren und somit zu Deinem Beispiel zu kommen.
O.K. ... da hast Du recht ....
Hier in der Firma verwenden wir Docker für unsere Wepaplikationen und natürlich verwendet man dort kein "host-Netz". Kannst Du das mit dem "Host-Netz" nicht auf die notwendigen Container einschränken?
Zitat von: Wernieman am 10 November 2020, 09:37:10
Kannst Du das mit dem "Host-Netz" nicht auf die notwendigen Container einschränken?
Da bin ich halt noch nicht so fit und wollte hier Unterstützung finden ;-)
Wenn ich das richtig sehe, ist in der Konf als Network mode host angegeben. Müsste aber m. E. Bridge sein, damit die Ports entsprechend umbiegen kannst. Bei host werden die Ports einfach durchgereicht.
Siehe hier: https://docs.docker.com/network/host/
Zitat von: guhu am 10 November 2020, 10:02:01
Wenn ich das richtig sehe, ist in der Konf als Network mode host angegeben. Müsste aber m. E. Bridge sein, damit die Ports entsprechend umbiegen kannst. Bei host werden die Ports einfach durchgereicht.
Siehe hier: https://docs.docker.com/network/host/
Okay, so ist das jetzt bei mir.
Und was muss ich nun im zweiten .yml angeben, damit die Container dort eine eigene IP-Adresse aus dem Hausnetz bekommen?
Geht das parallel zum host Netz, dass bereits besteht?
Das Host Netz in der einen .yml wird benötigt, damit ich dort ein SMAEM mit udp erreichen kann. Um es einfach zu halten habe ich die anderen Container dann alle dort mit rein konfiguriert.
Es würde nicht stören, wenn hierfür nur der Fhem Container ein Host Netz hat und die anderen eigene Ip Adressen im Haus Netz erhalten.
Nun muss ich für eine Migration eine zweite mysql starten, die jedoch auf den selben 3306 Port geht, was natürlich nicht klappt.
Hier bräuchte ich die Definition für ein separates Netz, in dem die Container gerne auch eigene IP Adressen bekommen.
Ich gestehe meine Unwissenheit über komplexere Netzwerke ein und bestätige, dass ich die Docker Netzwerkkonfiguration nur in Teilen Verstehe.
Gruß
Christian
Nimm Bridge networks und mappe dann die Ports.
also bspw. Docker 1 : 3306 - 3306
Docker 2: 3306 - 3307
Die haben dann alle die IP des Hosts, aber die beiden Datenbanken sind über die unterschiedlichen Ports ansprechbar.
Intern arbeiten die Docker dann mit 3306 (beide), extern mit 3306 und 3307
Ich würde Pro Projekt eine eigene docker-compose.yml pflegen .. mit eigenem Netz.
Kann man anders machen, hat sich hier in der Firma so durchgesetzt.
Also wegen udp brauchst Du kein HomeNetz. Eher wegen "anycast" und ähnlichem?
Zitat von: Wernieman am 10 November 2020, 11:21:34
Also wegen udp brauchst Du kein HomeNetz. Eher wegen "anycast" und ähnlichem?
Ja, ich glaube so etwas war das Problem.
Zitat von: Wernieman am 10 November 2020, 11:21:34
Ich würde Pro Projekt eine eigene docker-compose.yml pflegen .. mit eigenem Netz.
Das versuche ich auch so zu implementieren, da ich jetzt die Umgebung für 2021 aufsetze, nur das mit den Netzen war mir alles nicht so klar.
Nun habe ich es, dank Euch, etwas weiter geschafft. Vielen, vielen Dank für Eure Geduld.
1) docker-compose.yml nur Netzwerk Teile.
- Alle Expose waren überflüssig.
- Fhem ist jetzt wegen des SMAEM im "network_mode: host"
- Alle anderen Container nutzen das "bridge" Netzerk und geben Ports, die vom Hausnetz erreicht werden sollen, weiter.
version: '3.3'
networks:
net:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.27.0.0/24
volumes:
snip...
services:
fhem:
snip...
network_mode: host
snip...
portainer:
snip...
networks:
- net
ports:
- "9000:9000"
snip...
mysql:
snip...
networks:
- net
snip...
ports:
- "3306:3306"
- "33060:33060"
snip...
zigbee2mqtt:
snip...
networks:
- net
snip...
grafana:
snip...
networks:
- net
ports:
- "4000:3000"
snip...
renderer:
snip...
networks:
- net
ports:
- "8081:8081"
snip...
2) Um nun die zweite Datenbank mit in die bestehende Konfiguration auf zu nehmen verwende ich jetzt das hier.
- Es wird ein neuer Projektname verwendet
- Das bestehende Netzwerk wird verwendet
version: '3.3'
# hier ist kein Netzwerk definiert
services:
mysql:
snip...
# auch hier ist kein Netzwerk definiert, wodurch das default Netzwerk verwendet wird und
# die Ports dort zusätzlich erstellt werden
ports:
- '3307:3306'
- '33070:33060'
snip...
Genau. Du könntest noch gucken, ob Du die Ports 33060, 33070 überhaupt brauchst. Nur für die DB brauchst Du die ja nicht.
Zitat von: guhu am 10 November 2020, 13:05:26
Genau. Du könntest noch gucken, ob Du die Ports 33060, 33070 überhaupt brauchst. Nur für die DB brauchst Du die ja nicht.
Das hatte ich bereits in der Doku nachgelesen, der Port 33060 ist für x-Protokol , was ich glaube ich garnicht verwende. Somit schmeiße ich den auch noch raus.
Momentan läuft bereits ein sync zur zweiten Datenbank, was auch dringend notwendig war, denn in der Alten Datenbank ist wohl ein Block Fehler,
der jedoch auf der Logischen Ebene nicht aufgefallen ist. ein Copy auf Betriebssystemebene scheitert allerdings bereits. Puh, noch rechtzeitig bemerkt ;-)
Auch weitere Services sind bereits umgezogen. 2021 kann kommen :-)
Dann bist Du zu Hause weiter als ich .. stecke seit Monaten in der Planungsphase ...
Zitat von: Wernieman am 10 November 2020, 13:33:14
Dann ist Du zu Hause weiter als ich .. stecke seit Monaten in der Planungsphase ...
Für was?
Das ging eigentlich total schnell.
Naja .. nicht nur FHEM, sondern den Kompletten Server ...
Liegt auch eher daran, das ich privat aktuell keinen Bock habe, mich damit zu Beschäftigen ;o)
Gibt übrigens auch einen Spruch dafür:
Der Schuster hat die schlechtesten Schuhe ....
Zitat von: Wernieman am 10 November 2020, 14:02:59
Naja .. nicht nur FHEM, sondern den Kompletten Server ...
Liegt auch eher daran, das ich privat aktuell keinen Bock habe, mich damit zu Beschäftigen ;o)
Gibt übrigens auch einen Spruch dafür:
Der Schuster hat die schlechtesten Schuhe ....
Mein Umfeld läuft auf einem RPI 4 mit 4 Gb Ram und einer ssd 250 GB
Bisher leider aber auf des SD Stick, was mir nun Angst gemacht hat.
Nun habe ich Docker erst mal auf die ssd umgezogen, damit das schreiben auf dem SD Stick ein Ende hat.
Das Endziel ist halt von ssd zu Booten, was aber bisher mit dem RPI 4 bei mir nicht klappen will.
Hast Du den das fhem Umfeld schon in Docker? Ansonsten kann ich Dir die .yml Files schicken.
Aktuell läuft es auf einem X86 und daneben steht (nicht aktiv) der neue X86 .... mit Basiskonfig.
Verwendest Du den "offiziellen FHEM Container"? Der ist mir eigentlich zu "Fett" und ich würde mir einen eigenen Bauen ....
Zitat von: Wernieman am 10 November 2020, 14:15:36
Aktuell läuft es auf einem X86 und daneben steht (nicht aktiv) der neue X86 .... mit Basiskonfig.
Verwendest Du den "offiziellen FHEM Container"? Der ist mir eigentlich zu "Fett" und ich würde mir einen eigenen Bauen ....
Hast Du zu wenig RAM und Disk geordert??? Das wäre mir den Aufwand nicht wert.
Ich stehe halt auf Arbeitsteilung und verwende nur gelieferte Container.
X86 mit Win oder Linux?
Fhem bereits im Docker?
ZitatX86 mit Win oder Linux?
LOL .... Du kennst mich hier im Forum zu wenig ... ;o)
Nur Linux ...
ZitatIch stehe halt auf Arbeitsteilung und verwende nur gelieferte Container.
Prinzipiell nichts dagegen. Werde ich bei anderen auch so machen. Wegen des FHEM Container (auch schon im passenden Thread gesagt): Container an sich sollen Microservice sein. Der FHEM dagegen ist eine Eierlegende Wollmichsau .... und das spricht, meiner Meinung nach, gegen die Philosophie von Containern.
Ich hoffe aber, Du guckst darauf, das die Verwendeten Container auch aktuell gehalten werden? Bin da schon im Beruf "auf die Schnauze gefallen"....
Es ist auch Prinzipiell nicht schwierig, einen einfachen FHEM Container automatisch aufzusetzen:
1. Betriebsystem-Container wählen
2. Perl mit Module installieren
3. FHEM easy Way installieren
4. Cleaning
Dann ist zwar der "Tolle Watchdog" nicht drin, aber es ist eben ein einfacher Container .... nur muß ich mich mal aufraffen, mir die zeit zur Erstinstallation zu nehmen ... da das alte System aber läuft, fehlt der Druck ....
Zitat von: Wernieman am 10 November 2020, 16:28:57
LOL .... Du kennst mich hier im Forum zu wenig ... ;o)
Nur Linux ...
Ich vermisse mein Solaris, da hatte ich auch schon Fhem in der Zone am Laufen, aber das macht einsam ;-)
Solaris ... da hatte ich nur kurz mit zu tuen ...
Offtopic: der Vorteil des Containers ist es m. E., dass alles out of the box läuft, das spart Zeit und Fehlersuche.
Ansonsten ist es nämlich keineswegs so easy wie geschildert: mal fehlt hier ein Perl Modul, mal muss jenes noch gemacht werden. Das entfällt alles.
Ich habe mal das Betreff geändert, dann kann jetzt auch generell über Docker Netzwerke geschrieben werden.
Viele Grüße
Christian