Docker richtig benutzen

AnitaH

Cadet 2nd Year
Registriert
Feb. 2016
Beiträge
23
Hi liebe Nerds
Mein Sohn (10) hat nun sein erstes Ubuntu auf einem Computer installiert und würde gern mit Docker weiter machen. Da ich ihm helfen will beschäftige ich mich nun auch damit. Habe mit ihm zusammen Ubuntu 15.10 Server installiert. Das hat auch gut geklappt. Die erste Schwierigkeit war das Wlan (anstatt wlan0 heißt es bei uns wlp1s0) zu aktivieren aber auch das haben wir nach knapp 2 Stunden, über die Konsole, geschafft.
Dann haben wir Docker installiert und haben versucht 3 Container anzulegen. 1. Container MariaDB, 2. Container PHP 7 und 3. Container nginx.
Nach fast 2 Tagen rumprobieren und vielen Containern später haben wir den nginx Container am laufen allerdings gibt er nur die nginx Startseite aus er zeigt nicht auf das eingerichtete Verzeichniss wo die index.html liegt :(.

Vielleicht ist ja hier ein netter Nerd der uns bei unseren Problemen bei Seite stehen kann und uns einiges erklären kann. Gern nehmen wir auch Internetseiten oder aber Vorschläge zu Büchern (kaufen wir gern auch).

Mit besten Grüßen AnitaH
 
Hallo,

Respekt für die bisherige Leistung!

Ihr habt bei nginx mehrere Möglichkeiten eure Seite einzubeziehen. Entweder ihr schreibt alles direkt in die /etc/nginx/nginx.conf oder ihr legt (empfohlenerweise) eine unterseite an, indem ihr in der nginx.conf einen unterordner einbindet in dem ihr eure Seiten konfiguriert.

Sehr erklärt wird das hier: https://wiki.ubuntuusers.de/nginx/#Konfiguration



Sehr gute ist auch das hier, aber auf Englisch: https://www.digitalocean.com/commun...-nginx-web-server-on-a-virtual-private-server



Das Hilfreichste wäre eure /etc/nginx/nginx.conf zu posten und wo eure index.html liegt.
 
Dann haben wir Docker installiert und haben versucht 3 Container anzulegen. 1. Container MariaDB, 2. Container PHP 7 und 3. Container nginx.

1. OK
2. Nein
3. OK

Etwas ausführlicher. 1) ist ok weil MySQL-Zugriff über Netzwerk nichts ungewöhnliches ist. Kann man zum probieren ruhig mal machen.

2) ist kein realitätsnahes Szenario. Ihr werdet bei nginx die FPM Sapi von PHP nutzen, das ist zwar auch netzwerkfähig, von Prinzip her ist das aber ähnlich wie bei MySQL, ein zusätzlicher Lerneffekt entsteht da nicht. Davon ab ist es performanter die Anbindung über einen Socket zu realisieren statt per TCP-Connect. Ich würde dazu raten 2) und 3) zusammen zu legen.

Nach fast 2 Tagen rumprobieren und vielen Containern später haben wir den nginx Container am laufen allerdings
gibt er nur die nginx Startseite aus er zeigt nicht auf das eingerichtete Verzeichniss wo die index.html liegt .

Wie schaut die nginx.conf aus? Speziell der Teil in dem die "server {} " konfiguriert sind? Poste das doch mal.

Grundsätzlich arbeitet der nginx wie bspw. der apache auch mit virtuellen hosts. Das heißt der Server kann mehrere Domains verwalten, das wird in den server {} Abschnitten der Konfiguration konfiguriert.

Das heißt auch, wenn dort kein passender server_name konfiguriert ist wird nicht das angezeigt was Ihr ausgeben wollt. server_name und das, was Ihr im Browser eintippt, muss identisch sein.

Gebt Ihr computerbase.de ein, muss computerbase.de auch zu der IP des Docker-Containers auflösen und der nginx einen Part server {} haben in dem der server_name computerbase.de lautet.

Wenn der Container nun die IP-Adresse 172.10.10.10 hat und Ihr den nginx darüber ansprecht ( also die IP in der Browserleiste eingebt ) muss eben dieser Wert als server_name hinterlegt sein.

Darüber hinaus könnt Ihr Einträge in der /etc/hosts vornehmen und damit eine Domain auf eine IP-Adresse statisch verweisen:
Code:
172.10.10.10   meinetestdomain.de

Das tragt Ihr im Dockercontainer und auf dem Ubunutu-Server ein, dann könnt Ihr das im Browser angeben und es zeigt auf den Nginx-Container. Dort das ganze als server_name eintragen.

Die nginx-Dokumentation ist im übrigen eine der besseren, wenn es in dem Kontext Probleme gibt einfach dort ins Wiki schauen.

Vieles dessen was ich anspreche wird dir / euch jetzt vermutlich ( noch ) nichts sagen, das wird sicher aber im Laufe des testen / basteln klarer werden.
 
Einen schönen guten Tag @Stype
Entweder ihr schreibt alles direkt in die /etc/nginx/nginx.conf
Du meinst die nginx.conf die im Container liegt? also nicht wirklich in /etc/nginx/nginx.conf sondern /var/lib/docker/aufs/diff/hashwert/ect/nginx/nginx.conf

Danke für den Link wir sind dran. Englisch geht auch .. noch nicht ganz so flüssig wie deutsch und ab und zu fehlen Wörter aber wir arbeiten uns da durch.

Auch dir einen guten Tag @patrick888
2) ist kein realitätsnahes Szenario.
Hatten wir so aus einem Beispiel aber wenn die Experten sagen das macht so wenig Sinn bauen wir es natürlich anders. Ich glaube das Beispiel wollte auch nur zeigen das man so etwas mit Docker kann.

user www-data;
worker_processes auto;
pid /run/nginx.pid

events{
worker_connections 768;
}

http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;

include /etc/nginx&mime.types;
default_type application/octet-stream;

ssl_protocols TLSv1 TLSv1.1 TLSV1.2;
ssl_prefer_server_ciphers on;

access_log /var/log/nginx/access.log
error_log /var/log/nginx/error.log

gzip on;
gzip_disable "msie6";

include /etc/nginx/conf.d/*.conf
include /etc/nginx/sites-enabled/*

}

Das ist in der nginx.conf drin (wie kopiere ich denn wenn ich mit einem Terminal auf dem Linux per Kitty (SSH) drauf bin und im MC den Editor habe. Habs jetzt abgeschrieben da ich auf die schnelle keine Möglichkeit gefunden habe es zu kopieren.
Die Pfadangaben in der nginx.conf beziehen sich doch bestimmt auf den DockerContainer oder? Kann ich die auch nach "außerhalb" des DockerContainers reichen?

Lieben Gruß AnitaH + Sohnemann
 
AnitaH schrieb:
Die Pfadangaben in der nginx.conf beziehen sich doch bestimmt auf den DockerContainer oder? Kann ich die auch nach "außerhalb" des DockerContainers reichen?
Ja, die Pfade beziehen sich auf innerhalb des Containers, denn da läuft der Prozess. Du kannst, wie hier unter "hosting some simple static content" beschrieben, das Image erweitern, aus dem du den Container baust. Dann ist dein Content gleich mit "reingebacken". Da das aber nicht sonderlich dynamisch ist (du willst ja nicht bei jeder Änderung den Container neu bauen), arbeitet man normalerweise mit volumes. Die werden da auch unter "complex configuration" genutzt.

P.S.: finde ich beeindruckend, dass du mit deinem Sohn sowas (vor allem in dem Alter schon) machst.
 
Zuletzt bearbeitet:
Hi @Tumbleweed
Die erste Seite die du nennst hatten wir schon .. danach haben wir den nginx zum laufen bekommen :). Den zweiten Link kannten wir noch nicht. werden wir uns mal durcharbeiten. Aber sieht auf den ersten Blick kompliziert aus :). Na wir schauen mal ..

Sonst noch jemand andere Vor-, Rat- und andere schläge?

Gruß AnitaH
Ergänzung ()

Ok @Tumbleweed
wir haben uns jetzt das mit den Volumen durchgelesen und fast nichts verstanden. Das ist dann wohl doch noch etwas zu hoch für unser Verständnis.

Eigentlich wollen wir erstmal nur 3 Container bzw nach der Aussage von Patrick888 2 Container mit nginx und PHP 7 und MariaDB machen und die miteinander so verbinden das wir von außen (heißt von einem Laptop in unserem Netzwerk über die IP) auf nginx zugreifen können und der, wenn er sieht das es *.php ist was aufgerufen wird auf PHP weiterleitet. PHP selber soll natürlich mit mysql sprechen können.

Noch eine andere Frage, da entstehen ja mit der Zeit viele Container (docker images) gibt es eine Software mit der man das verwalten kann? Ich glaube so etwas gelesen zu haben.

Gruß AnitaH
Ergänzung ()

Warum muss ich eigentlich wenn ich "docker run --name webserver -d -p 80:80 nginx" aufrufe den Webserver 3 mal stoppen
einmal mit "docker rm webserver"
dann mit "docker stop webserver"
und dann noch mal mit "docker stop /webserver" erst dann kann man die standard nginx Seite nicht mehr aufrufen.

Und muss ich irgendetwas neu starten bei dem nginx Container wenn ich die nginx.conf umgeschrieben habe. Denn irgendwie hab ich das Gefühl er nimmt die Änderungen nicht an :).
 
Vorweg: Ich habe mich auch nur zu Hause etwas eingelesen und bin noch am probieren, also keine Garantie auf Richtigkeit.

Dein Problem, dass der die Änderungen nicht annimmt, hat mit den oben erwähnten Volumes zu tun. Mit "docker rm webserver" löscht du den gesamten Container, den du zuvor mit dem Dockerfile erstellt hast. In dem Dockerfile ist jedoch nirgendwo die geänderte nginx.conf enthalten, dass heißt beim erneuten build ist wieder die Originaldatei vorhanden. Um Daten nach Löschen des Containers zu behalten und weiterzuwenden, können vom Dateisystem des Hosts Ordner in den Container gemountet werden (das sollten dann die oben erwähnten Volumes sein). Diese werden dann nicht gelöscht. Eine Alternative ist der Einsatz von data only containern.

Wenn du das "docker rm webserver" weglässt und nur "docker stop" benutzt und zum starten "docker start" sollten die Daten aber noch da sein (zum Beispiel, wenn der Rechner neu gestartet wird).

Allerdings widerspricht es etwas dem Konzept von Docker im Anwendungscontainer Daten zu speichern, weil ja gerade die sehr klein sein sollen und damit flexibel bleiben.

Das ist hier ganz gut erklärt: https://docs.docker.com/engine/userguide/containers/dockervolumes/
Zu dem Thema findet man auch einige Artikel und Videos, wobei dabei auf das Alter zu achten ist. Docker entwickelt sich ja noch recht schnell und es werden neue Funktionen hinzugefügt.

Ich hoffe, ich konnte helfen und habe nicht zu viel Mist erzählt.
 
Zuletzt bearbeitet:
@Checkerpig .. ja das hat geholfen .. so hab ich das mit den Volumen noch gar nicht gesehen .. also docker stellt die Container für die Applikation bereit und mit den Volumen mounte ich sogesehen ein Verzeichnis mit Daten dort hinein (so mal ganz laienhaft ausgesprochen)

ok .. da mit kann ich schon mehr anfangen .. :)
 
AnitaH schrieb:
user www-data;
worker_processes auto;
pid /run/nginx.pid

events{
worker_connections 768;
}

http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;

include /etc/nginx&mime.types;
default_type application/octet-stream;

ssl_protocols TLSv1 TLSv1.1 TLSV1.2;
ssl_prefer_server_ciphers on;

access_log /var/log/nginx/access.log
error_log /var/log/nginx/error.log

gzip on;
gzip_disable "msie6";

include /etc/nginx/conf.d/*.conf
include /etc/nginx/sites-enabled/*

}

Das ist in der nginx.conf drin (wie kopiere ich denn wenn ich mit einem Terminal auf dem Linux per Kitty (SSH) drauf bin und im MC den Editor habe. Habs jetzt abgeschrieben da ich auf die schnelle keine Möglichkeit gefunden habe es zu kopieren.
Die Pfadangaben in der nginx.conf beziehen sich doch bestimmt auf den DockerContainer oder? Kann ich die auch nach "außerhalb" des DockerContainers reichen?

Lieben Gruß AnitaH + Sohnemann

Das sind soweit die Grundzüge der Konfiguration, soweit unspektakulär.

Interessant was die virtuellen Hosts angeht wirds bei der Zeile hier:

Code:
 include /etc/nginx/sites-enabled/*

Dort findet die VHost-Konfiguration statt, das ist wirklich interessant und der von dir erfragte relevante Teil.


In Kitty einfach markieren, landet automatisch in der Zwischenablage, z.B. nachdem du ein

Code:
cat /et/nginx/nginx.conf

gemacht hast. cat gibt dir den Inhalt einer Datei auf dein Terminal aus.

Mit "grep" kannst du eine Datei durchsuchen.

Code:
grep gzip/et/nginx/nginx.conf

würde dir bspw. die folgende Ausgabe liefern:

Code:
    gzip on;
    gzip_disable "msie6";

Ich persönlich verachte den mc aufs allerschärfste, lern am besten frühzeitig den Umgang mit der Shell, dem Wechseln von Verzeichnissen, etc. Wenn du dir das im mc angewöhnst wird dich jeder gestande Systemadministrator verfluchen. Gegenüber gängigen Kommandos in der Shell bist du auch schlicht langsamer und damit ineffektiver.

Im mc bekommst du Text in die Zwischenablage wenn du Shift gedrückt hälst und dann mit der Maus markierst.

nano ist ein toller Editor, Syntaxhiglighting macht der auch, einfach mal nach "nanorc" googeln.
 
Hi patrick888

ja mit nano hab ich schon erste Erfahrungen gemacht. Auch grep hab ich schon benutzt (stolz sei). Den MC benutze ich weil es mich an früher erinnert (hatte so etwas auch auf dem Windows PC, weiß aber nicht mehr wie es da hieß, irgendwas mit Commander?).

Habe heute noch mal das Ubuntu vom Wochenende platt gemacht und hab nun knapp eine Stunde gebraucht um es wieder einzurichten und abzusichern (ssh Port verlegen, root nicht mehr rein lassen, eigenen root User erstellen und so). Hab mir das ganze mal aufgeschrieben und werde das dann heute Nachmittag noch mal mit meinem Sohn machen. Danach gucken wir mal ob wir mit Docker weiter machen oder erstmal anderen Sachen den Vorzug geben. Das entscheide ich dann aber nicht selber. Geht ja immer noch darum das mein Sohn das möchte. Allerdings hat mich wohl das Lernfieber gepackt und ich möchte das jetzt auch, zumindest etwas können.

Gruß Anita
 
Zurück
Oben