Docker-Image auf Ubuntu-Server zum Laufen bekommen

B3l3s3n3r-3H

Cadet 2nd Year
Registriert
Okt. 2018
Beiträge
23
Hallo,

beschäftige mich seit gerarumer Zeit mit Docker und habe mir hierzu in VirtualBox einen Ubunt-Server 18.04 eingerichtet.
Darin habe ich bereits Docker installiert.
Das "Hello World" Image läuft!
Nun möchte ich das Docker-Image rukzuk nutzen, komme aber nicht wirklich klar damit.:(

Den rukzuk-Support kann man vergessen! Am Anfang bekommt man noch Hilfe, fragt man dann mehr, dann bekommt man erstmal eine Weile lang keine Antwort oder eben man sei im Urlaub (als wenn nur 1 Mitarbeiter den Support machen würde:rolleyes:) und dann, wenn überhaupt, kommen nur noch sporadisch Antworten und Hilfe.
Ich warte schon wieder eine ganze Weile auf Rückmeldung.
Naja, egal!

Besagtes Docker-Image konnte ich starten und eine interaktive bash-Shell ausführen (somit ist man ja direkt im Image auf der Shell).:)

Was jetzt zum einen nicht funktioniert ist der Build-Befehl:
Code:
docker build --tag="rukzuk_image" --force-rm=true --no-cache=false .
Logisch, es ist ja kein Dockerfile vorhanden.

Von einer anderen VM, die im selben Netzwerk ist, kann ich den Ubuntu-Server pingen und bekomme Antworten zurück.
Per Browser kann ich aber das Docker-Image von der anderen VM, über welche ich den Ping abgesetzt habe, aus nicht aufrufen.
Denke mal das liegt daran, dass ich noch einen Webserver (Apache), PHP und MySQL benötige?
Steht zumindest so in der github-Anleitung (Link unten).

Da kommt schon die nächste Frage auf:
Muss Apache, PHP und MySQL in dem Docker-Image installiert werden oder direkt auf dem Ubuntu-Server?

Wie muss ich vorgehen, damit ich das Image bzw. den Container zum Laufen bekomme damit ich mich per Browser dann verbinden bzw. das Backend von rukzuk aufrufen kann?

Hier alles zum besagten Docker-Image:
https://github.com/rukzuk/rukzuk
https://hub.docker.com/r/rukzuk/rukzuk

Wäre nett, wenn mir da jemand helfen könnte.

Vielen Dank!
 
Kennst Du Dich mit Docker eigentlich aus? Der folgende Befehl startet nämlich nicht (!) den Conatiner mit dem Image.

B3l3s3n3r-3H schrieb:
Was jetzt zum einen nicht funktioniert ist der Build-Befehl

Und was funktioniert nicht genau?

Nach dem Bauen des Images musst Du den Container kurz einrichten (docker run) und dann starten (docker start). Sollte eigentlich nicht sooo schwer sein ;)
 
Wie gesagt beschäftige ich mich erst seit geraumer Zeit mit Docker.
Das "Hello World" Image läuft, also läuft auch Docker.

Der Build-Befehl bringt nur eine Fehlermeldung (irgendwas mit Pfad existiert nicht); es existiert ja kein Dockerfile.

docker run habe ich ja gemacht, weil ich komme ja auf die bash des Images!
docker start muss ich schauen, bin ich mir jetzt nicht sicher (schon ein paar Tage her).

Edit:
Auf Play with Docker läuft's, wenn ich es einrichte.
 
Zuletzt bearbeitet:
Schau doch ruhig mal hier rein: https://github.com/rukzuk/rukzuk/blob/master/docker/Dockerfile
Dies hätte deine Frage:
B3l3s3n3r-3H schrieb:
Muss Apache, PHP und MySQL in dem Docker-Image installiert werden oder direkt auf dem Ubuntu-Server?
bereits beantwortet.

Wir könnten dir besser helfen wenn du uns den genauen Wortlaut der Fehlermeldung geben würdest. Was sollen wir bitte erraten, was für ein Pfad nicht gefunden werden kann. In dem Image gibt es ein Dockerfile. Durch pull ziehst du dir das Image auf die Festplatte, danach build (dort werden alle Abhängigkeiten gezogen, installiert und Co.) und im Anschluss run - danach sollte es laufen. Vielleicht musst du den image-tag im build-Befehl ändern, mit docker images -a müsstest du alle Images sehen.
 
Wie geschrieben läuft es auf Play with Docker indem ich es herunterlade (pull), dann ausführe (run) und dann starte (start).

Ich kann danach sofort über die Url von Play with Docker das Backend aufrufen und mich anmelden.

Führe ich in meinem Ubuntu-Server (VM) den Build-Befehl aus, dann kommt:
unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /home/benutzername/Dockerfile: no such file or directory
 
So, ich muss mich entschuldigen für meine Fehlinformation. Ich benutze docker pull nie, sondern ziehe mir immer das git-Repo und baue dann selber das Image. Mit docker pull ist docker build nicht notwendig.

Als Hinweis: docker build führt man in dem Verzeichnis aus, in dem das Dockerfile liegt (brauchst du aber nicht, da du ein fertiges Image hast und es nicht mehr bauen musst).
 
  • Gefällt mir
Reaktionen: B3l3s3n3r-3H
Kein Thema!;)
Wäre allerdings nett, wenn mir jemand helfen könnte und mir sagen kann wie ich denn nun auf das Backend, über eine andere VM, zugreifen kann.

Wie gesagt kann ich von einer anderen (lokalen) VM den Ubuntu-Server, welcher auch in einer (lokalen) VM läuft, anpingen.
Nur wenn ich per Browser - in der anderen VM - die lokale IP vom Ubuntu-Server aufrufe kommt einfach nichts.:(

Ports des Images (beim run) sind mit 80:80 angegeben.
 
Wie sieht denn jetzt Deine "Systemlandschaft" aus? Du hast einen Host (Windows 10?) und dann ein Ubuntu in einer VM und eine weitere VM (ebenfalls mit Ubuntu und dort läuft Docker), korrekt?

Welche IPs haben die jeweiligen Systeme? Wie hast Du die VMs bzgl. Netzwerkkonfiguration eingestellt (briged, nat, ...)?

Vermutlich musst Du in der VM-Konfiguration des Unbuntu (dort, wo auch Docker läuft) noch in den Netzwerkeinstellungen ein Netzwerk-Portmapping für Port 80 durchführen, damit letztlich Dein Host (Win 10) über die VM an den "Docker-Server" kommt.
 
Host ist Win7, VM Win7 und VM mit Ubuntu-Server (Docker).
Die VM's sind per Netzwerkbrücke (bridged) eingerichtet.
Die IP's sind im 192.168.178'er Netz.
 
Also, zunächst möchte ich erwähnen, dass ein Großteil der Docker-Container von der Community erstellt wurden. Das heißt konkret, dass sich eine Privatperson in ihrer Freizeit hingesetzt hat, um Container xy zu erstellen. Den fertigen Container stellt diese Person dann freundlicherweise der Öffentlichkeit zur Verfügung - kostenlos. Zwar sind einige Container durchaus von Firmen erstellt worden, aber man sollte bei kostenlosen Angeboten doch sehr vorsichtig sein mit den Erwartungen oder gar Forderungen an den Support. Wo genau nu das rukzuk Image herkommt weiß ich nicht, weil ich es gar nicht kenne.

Zum konkreten Fall : Ich selbst habe Docker nur kurzzeitig getestet - pihole nativ vs pihole-docker - aber dabei ist mir aufgefallen, dass sich Docker anders in die Firewall einnistet als man es erwartet. Obwohl der Docker-Service selbst nativ auf dem Host läuft, werden Verbindungen von außen zu einem Container weitergeleitet. Das führt dazu, dass etwaige Firewall-Regeln unter Linux in der FORWARD-Chain landen und nicht in der INPUT-Chain wie es bei einer nativen Installation der Anwendung wäre. Prüfe daher bitte auch mittels iptables -L ob diesbezüglich alles korrekt ist. Das ist nämlich nicht mehr Aufgabe des Docker-Containers oder Docker selbst, sondern eine Frage der Implementierung des Anwenders.
 
Ausgabe von iptables -L:

Code:
Chain INPUT (policy DROP)
target     prot opt source               destination         
ufw-before-logging-input  all  --  anywhere             anywhere           
ufw-before-input  all  --  anywhere             anywhere           
ufw-after-input  all  --  anywhere             anywhere           
ufw-after-logging-input  all  --  anywhere             anywhere           
ufw-reject-input  all  --  anywhere             anywhere           
ufw-track-input  all  --  anywhere             anywhere           

Chain FORWARD (policy DROP)
target     prot opt source               destination         
DOCKER-USER  all  --  anywhere             anywhere           
DOCKER-ISOLATION-STAGE-1  all  --  anywhere             anywhere           
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere           
ACCEPT     all  --  anywhere             anywhere           
ACCEPT     all  --  anywhere             anywhere           
ufw-before-logging-forward  all  --  anywhere             anywhere           
ufw-before-forward  all  --  anywhere             anywhere           
ufw-after-forward  all  --  anywhere             anywhere           
ufw-after-logging-forward  all  --  anywhere             anywhere           
ufw-reject-forward  all  --  anywhere             anywhere           
ufw-track-forward  all  --  anywhere             anywhere           

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ufw-before-logging-output  all  --  anywhere             anywhere           
ufw-before-output  all  --  anywhere             anywhere           
ufw-after-output  all  --  anywhere             anywhere           
ufw-after-logging-output  all  --  anywhere             anywhere           
ufw-reject-output  all  --  anywhere             anywhere           
ufw-track-output  all  --  anywhere             anywhere           

Chain DOCKER (1 references)
target     prot opt source               destination         

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target     prot opt source               destination         
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere           
RETURN     all  --  anywhere             anywhere           

Chain DOCKER-ISOLATION-STAGE-2 (1 references)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere           
RETURN     all  --  anywhere             anywhere           

Chain DOCKER-USER (1 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere           

Chain ufw-after-forward (1 references)
target     prot opt source               destination         

Chain ufw-after-input (1 references)
target     prot opt source               destination         
ufw-skip-to-policy-input  udp  --  anywhere             anywhere             udp dpt:netbios-ns
ufw-skip-to-policy-input  udp  --  anywhere             anywhere             udp dpt:netbios-dgm
ufw-skip-to-policy-input  tcp  --  anywhere             anywhere             tcp dpt:netbios-ssn
ufw-skip-to-policy-input  tcp  --  anywhere             anywhere             tcp dpt:microsoft-ds
ufw-skip-to-policy-input  udp  --  anywhere             anywhere             udp dpt:bootps
ufw-skip-to-policy-input  udp  --  anywhere             anywhere             udp dpt:bootpc
ufw-skip-to-policy-input  all  --  anywhere             anywhere             ADDRTYPE match dst-type BROADCAST

Chain ufw-after-logging-forward (1 references)
target     prot opt source               destination         
LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 10 LOG level warning prefix "[UFW BLOCK] "

Chain ufw-after-logging-input (1 references)
target     prot opt source               destination         
LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 10 LOG level warning prefix "[UFW BLOCK] "

Chain ufw-after-logging-output (1 references)
target     prot opt source               destination         

Chain ufw-after-output (1 references)
target     prot opt source               destination         

Chain ufw-before-forward (1 references)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ACCEPT     icmp --  anywhere             anywhere             icmp destination-unreachable
ACCEPT     icmp --  anywhere             anywhere             icmp source-quench
ACCEPT     icmp --  anywhere             anywhere             icmp time-exceeded
ACCEPT     icmp --  anywhere             anywhere             icmp parameter-problem
ACCEPT     icmp --  anywhere             anywhere             icmp echo-request
ufw-user-forward  all  --  anywhere             anywhere           

Chain ufw-before-input (1 references)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere           
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ufw-logging-deny  all  --  anywhere             anywhere             ctstate INVALID
DROP       all  --  anywhere             anywhere             ctstate INVALID
ACCEPT     icmp --  anywhere             anywhere             icmp destination-unreachable
ACCEPT     icmp --  anywhere             anywhere             icmp source-quench
ACCEPT     icmp --  anywhere             anywhere             icmp time-exceeded
ACCEPT     icmp --  anywhere             anywhere             icmp parameter-problem
ACCEPT     icmp --  anywhere             anywhere             icmp echo-request
ACCEPT     udp  --  anywhere             anywhere             udp spt:bootps dpt:bootpc
ufw-not-local  all  --  anywhere             anywhere           
ACCEPT     udp  --  anywhere             224.0.0.251          udp dpt:mdns
ACCEPT     udp  --  anywhere             239.255.255.250      udp dpt:1900
ufw-user-input  all  --  anywhere             anywhere           

Chain ufw-before-logging-forward (1 references)
target     prot opt source               destination         

Chain ufw-before-logging-input (1 references)
target     prot opt source               destination         

Chain ufw-before-logging-output (1 references)
target     prot opt source               destination         

Chain ufw-before-output (1 references)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere           
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
ufw-user-output  all  --  anywhere             anywhere           

Chain ufw-logging-allow (0 references)
target     prot opt source               destination         
LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 10 LOG level warning prefix "[UFW ALLOW] "

Chain ufw-logging-deny (2 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere             ctstate INVALID limit: avg 3/min burst 10
LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 10 LOG level warning prefix "[UFW BLOCK] "

Chain ufw-not-local (1 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere             ADDRTYPE match dst-type LOCAL
RETURN     all  --  anywhere             anywhere             ADDRTYPE match dst-type MULTICAST
RETURN     all  --  anywhere             anywhere             ADDRTYPE match dst-type BROADCAST
ufw-logging-deny  all  --  anywhere             anywhere             limit: avg 3/min burst 10
DROP       all  --  anywhere             anywhere           

Chain ufw-reject-forward (1 references)
target     prot opt source               destination         

Chain ufw-reject-input (1 references)
target     prot opt source               destination         

Chain ufw-reject-output (1 references)
target     prot opt source               destination         

Chain ufw-skip-to-policy-forward (0 references)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere           

Chain ufw-skip-to-policy-input (7 references)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere           

Chain ufw-skip-to-policy-output (0 references)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere           

Chain ufw-track-forward (1 references)
target     prot opt source               destination         

Chain ufw-track-input (1 references)
target     prot opt source               destination         

Chain ufw-track-output (1 references)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             anywhere             ctstate NEW
ACCEPT     udp  --  anywhere             anywhere             ctstate NEW

Chain ufw-user-forward (1 references)
target     prot opt source               destination         

Chain ufw-user-input (1 references)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh

Chain ufw-user-limit (0 references)
target     prot opt source               destination         
LOG        all  --  anywhere             anywhere             limit: avg 3/min burst 5 LOG level warning prefix "[UFW LIMIT BLOCK] "
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

Chain ufw-user-limit-accept (0 references)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere           

Chain ufw-user-logging-forward (0 references)
target     prot opt source               destination         

Chain ufw-user-logging-input (0 references)
target     prot opt source               destination         

Chain ufw-user-logging-output (0 references)
target     prot opt source               destination         

Chain ufw-user-output (1 references)
target     prot opt source               destination
Kannst du damit etwas anfangen?:confused_alt:
 
Ogottogott sag uns bitte bitte bitte, dass du diesen Container nirgends aus dem Internet erreichbar betreibst noch dies vor hast.
  • Das Base-Image basiert auf einer 3 Jahre alten Version (phusion/baseimage:0.9.15)
  • Laut Dockerfile ist Ubunt 14.04 die Basis... Ein OS, dass in 4 Wochen end of life ist
  • Im Dockerfile wird php5 installiert. PHP5, egal welche Version davon, ist bereits längst EOL (https://www.php.net/supported-versions.php)

Danach hab ich aufgehört, mir das Elend weiter anzusehen.
Ein per "docker run" gestarteter Container läuft danach bereits und muss nicht extra per "docker start" gestartet werden.
Ein Ping sagt nix über die Erreichbarkeit aus einer Webseite sondern nur eine Erreichbarkeit per Ping. Ich kann per Firewall problemlos bei einem Webserver die Webseiten erreichbar haben und Ping-Pakete verbieten oder umgedreht, also Ping erlauben aber Zugriff auf Webseite nicht.
Reihenfolge der Chains passen mMn.

Willst du denn überhaupt das Image selbst bauen bzw. warum nicht das fertige Image verwenden? Du kommst auch nicht in die Bash des Images sondern basierend auf einem Image startest du einen oder mehrere Container. Achte bitte auf die genauen Begrifflichkeiten damit man dir helfen kann.
 
Der Container ist nur lokal erreichbar!;)
Ist auf meinem PC in einer VM mit Ubuntu-Server.

Ich möchte auch nicht unbedingt etwas neu bauen sondern das Image so verwenden.
Kann ich leider nichts dazu, wenn z.B. PHP veraltet ist.
Das ist auch nicht das eigentliche Thema!;)

snaxilian schrieb:
Du kommst auch nicht in die Bash des Images sondern basierend auf einem Image startest du einen oder mehrere Container. Achte bitte auf die genauen Begrifflichkeiten damit man dir helfen kann.
Sicher? Ich komme aber doch in das Image selbst auch rein und dort auf eine Bash-Shell?!
docker run -it imagename /bin/bash
 
Zuletzt bearbeitet:
Wenn der Container nur lokal erreichbar ist, dann ist klar warum du nicht von einem anderen PC drauf kommst. Er ist eben nur lokal auf dem Host erreichbar, wo der Docker Daemon läuft.

Wenn du nix bauen willst: Warum dann docker build und nicht docker pull?

Doch das wird ganz ganz schnell dein Thema. Du willst damit ja etwas "bauen" und mit dem erstellten Design/CMS eine Webseite hosten? Sobald du etwas betreibst bist du verantwortlich und je nach Situation auch ganz schnell haftbar und nein du kannst dich dann nicht rausreden mit "ja hupsi tut mir Leid aber da kann ich ja nix für, der Container ist nicht von mir, ich nutze den nur". Security ist leider unabdingbar wenn man IT-Systeme betreiben will und auch wenn du es vielleicht nicht glauben magst: Von vorn herein auf Security zu achten ist günstiger als "ach darum kümmere ich mich später, Hauptsache $Anwendung läuft erstmal".

Nein, wie gesagt: Lies dich bitte in die Begrifflichkeiten und Grundlagen ein. https://docs.docker.com/get-started/
Ein Image ist dein Template aus dem du lauffähige Container erstellst. Das kann eins sein oder hunderte identische Container, z.B. für Lastverteilungen oder Redundanzen und jeder Container hat eine eindeutige ID.
docker ps -a
Erste Spalte ist die ID.
In deinem Fall ist leider unglücklicherweise Name des Images und Name des Containers identisch aber das ist nicht grundsätzlich so. Wenn du einen Container per docker run wie o.g. startest, wird aus dem Image ein Container erzeugt und du landest in der Shell.
Einfaches Beispiel: docker run -itd $imagename && docker run -itd $imagename && docker ps -aErgebnis: Du siehst zwei Container, die identisch sind. Gehen wir mal davon aus, der eine hat die ID 11111 und der andere die 22222. Jetzt kannst per docker exec -it 11111 /bin/bash in den ersten Container springen und hast eine Shell und mit exit den Container wieder verlassen. Aber du warst definitiv in keinem Image ;)
Aus einer Dockerfile wird ein Image und aus einem Image wird ein Container. Grundlagen. Doku lesen. Nicht jeder Dockercontainer hat btw eine Bash, gewöhne dich also besser nicht dran.
 
  • Gefällt mir
Reaktionen: B3l3s3n3r-3H
Danke für die Erklärung.;)
Wie gesagt ist das noch neu für mich, da tut man sich mit den Begriffen etc. leider noch etwas schwer.:(

Hmm, ok, sollte ich für das Bauen des Images wohl besser einen eigenen Thread eröffnen?!😊

snaxilian schrieb:
Wenn der Container nur lokal erreichbar ist, dann ist klar warum du nicht von einem anderen PC drauf kommst. Er ist eben nur lokal auf dem Host erreichbar, wo der Docker Daemon läuft.
Hmm, aber die sind doch im gleichen Netzwerk?!:confused_alt:

snaxilian schrieb:
Wenn du nix bauen willst: Warum dann docker build und nicht docker pull?
Habe ich auch per
Code:
pull
von hub.docker.com geladen.;)
 
Den Link für die Doku habe ich ja bereits gepostet, dort gibt es auch explizit mehrere Artikel zum Thema networking. Lies diese.
Tl;dr Nein Container sind nicht im gleichen Netzwerk/Subnet wie deine sonstigen Systeme, sondern nur aus dem erreichbar, da der Docker-Host Proxy spielt sofern der Container explizit einen oder mehrere Ports per Expose nach außen öffnet. Zusätzlich muss natürlich die Firewall auf dem Host mitspielen (iptables/ufw).

Warum willst du etwas bauen, wenn du ein fertiges Image bereits gezogen hast? Entweder du hast ein Dockerfile und willst selbst ein Image bauen oder du ziehst dir das fertige Image von Docker Hub oder einer anderen Registry. Aber nicht beides.
Du kaufst doch auch kein fertiges Auto (Image) und willst es dann unbedingt aus den Einzelteilen (Dockerfile) zusammen bauen. Geht ja auch nicht, weil schon fertig.
 
Zurück
Oben