LF7 Docker

Bildquelle: Von dotCloud, Inc. - https://github.com/docker/docker/blob/master/docs/static_files/docker-logo-compressed.png, Apache License 2.0, https://commons.wikimedia.org/w/index.php?curid=28456942
Installation Webserver für Entwicklung
Installation
docker pull ubuntu
Wir überprüfen das herunterladen des Images:
root@proxmox:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest dd6f76d9cc90 2 days ago 122MB
Wir erstellen aus dem Image einen Container, auf dem wir angemeldet sind, um die benötigte Software manuell zu installieren:
docker run -i -t ubuntu /bin/bash
Wir spielen die aktuellen Updates ein:
apt update
apt -y dist-upgrade
Installation der benötigten Programme:
apt install -y sudo apache2 apache2-utils php php-common openssh-server vim-nox git
Die beiden Server openssh und apache2 sollen beim start des Systems automatisch starten. Der einfachste Weg ist der Eintrag in die Datei .bashrc. Dazu müsen wir zuerst den Installationspfad von service herausfinden:
root@63fb5dc1ac6b:/# which service
/usr/sbin/service
Wir merken uns den Pfad und wechseln in das Home-Verzeichnis und öffnen dort die Datei .bashrc:
cd ~
vim .bashrc
Am Ende der Datei (hinter dem #fi) tragen wir ein:
# Dienste die gestartet werden sollen
/usr/sbin/service apache2 start
/usr/sbin/service ssh start
Wir kopieren uns die Container-ID aus der Konsole und verlassen dn Container mit exit.
Als nächstes legen wir ein neues Image an:
docker commit 63fb5dc1ac6b ubuntu:web
Wir schauen uns das neue Image an, dass die installierten Programme enthält:
root@proxmox:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu web 571c92391ecf 47 seconds ago 405MB
ubuntu latest dd6f76d9cc90 2 days ago 122MB
Wir stellen nun sicher, dass die Dinste beim start eines Containers starten:
docker run -i -t ubuntu:web /bin/bash
* Starting Apache httpd web server apache2
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.4. Set the 'ServerName' directive globally to suppress this message
*
* Starting OpenBSD Secure Shell server sshd
Mit einem exit verlassen wir den Container. Wir brauchen jetzt noch einen Inhalt für unsere Seite. Wir gehen dazu auf http://www.oswd.org/ und suchen uns ein Design aus.
Wir laden das Design herunter und gehen im Browser auf die Downloads um die URL zum Download zu bekommen. Wir legen auf unserem Server ein Verzeichnis an und laden das Design in das Verzeichnis.
cd ~
mkdir web
wget -O RedTie.zip http://www.oswd.org/design/download/id/3699/
In dem Verzeichnis web legen wir den statschen Anteil unserer Webseite ab. Also entpacken wir unser Template:
unzip RedTie.zip
Wir kopieren die entpackten Dateien eine Ebene höher und löschen das Verzeichnis:
mv RedTie/* .
rmdir RedTie
Test des Images mit statischem Webinhalt
Wir starten jetzt einen neuen Container:
docker run --name=webtest -p 80:80 -v /home/core/web:/var/www/html -i -t ubuntu:web /bin/bash
Mit dem Befehl binden wir das lokale Verzeichnis /root/web in den Container unter /var/www/html ein und öffnen den Port 80. Der Server sollte jetzt unter http://IP-Adresse die entsprechende Seite ausliefern.
Git-Repository
Wir können jetzt ein Git-Repository erzeugen. Dazu verlassen wir den Container. Im Verzeichnis /root/web geben wir ein:
git init .
und überprüfen den Erfolg:
git status
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
RedTie.zip
images/
index.html
nothing added to commit but untracked files present (use "git add" to track)
Wir bekommen den Hinweis, dass wir ein git add ausführen sollten:
git add *
und überprüfen den Erfolg wieder mit einem git status:
root@proxmox:~/web# git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: RedTie.zip
new file: images/bg_menu.gif
new file: images/bg_submenu.gif
new file: images/style.css
new file: images/tie_logo.gif
new file: index.html
Wir führen ein git commit durch:
root@proxmox:~/web# git commit -m "Erste Seite"
[master (root-commit) 7e7e763] Erste Seite
Committer: root <root@proxmox.fritz.box>
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly. Run the
following command and follow the instructions in your editor to edit
your configuration file:
git config --global --edit
After doing this, you may fix the identity used for this commit with:
git commit --amend --reset-author
6 files changed, 166 insertions(+)
create mode 100644 RedTie.zip
create mode 100644 images/bg_menu.gif
create mode 100644 images/bg_submenu.gif
create mode 100644 images/style.css
create mode 100644 images/tie_logo.gif
create mode 100644 index.html
und überprüfen den Erfolg:
root@proxmox:~/web# git status
On branch master
nothing to commit, working tree clean
Jetzt wäre der Zeitpunkt für einen Account bei github und der Angabe von Name und E-Mail. Wir überspringen den Schritt.
Wir könnten jetzt auch über den oben installierten git-Client das Repository direkt in das Filesystem des Container laden ohne das wir das lokale Filesystem brauchen!
Wir starten unseren Container:
docker start webtest
Wir melden uns auf den Container an:
docker attach webtest
Wir können über das Git-Repository die Website in jedem Container oder auf dem Muttertsystem ändern und diese durch das Toolkit von git nachvollziehbar ändern und auch evntuelle Änderungen rückgängig machen. Aussrdem haben wir ein externes Backup der Inhalte.
Wir wechseln in das Verzeichnis /var/www/html:
cd /var/www/html
git status
Und sehen mit dem zweiten Befehl, dass das Repository “sauber” ist.
git clone
Wir bereiten unser System auf einen zweiten Container vor. Dafür kopieren wir das Repository um die Websites der Produktion von der Entwicklung zu trennen.
mkdir /home/core/dockergit
git clone /home/core/web/ /home/core/dockergit
Wir haben jetzt eine Kopie des Verzeichnisses web in dockergit. Beides sind getrennte Git-Repositories.
Wir starten einen neuen Container:
docker run -d -i -t --name=webdev -p 8081:80 -v /home/core/dockergit:/var/www/html ubuntu:web /bin/bash
Wir überprüfen, dass der Container läuft:
root@proxmox:~/dockergit# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5f3964eaabf6 ubuntu:web "/bin/bash" About a minute ago Up About a minute 0.0.0.0:8081->80/tcp webdev
Wir starten noch einen weiteren Container auf Port 8083 und dem Namen webdev2:
docker run -d -i -t --name=webdev2 -p 8082:80 -v /home/core/dockergit:/var/www/html ubuntu:web /bin/bash
Und überprüfen, dass beide Container laufen:
root@proxmox:~/dockergit# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e93677ab35a8 ubuntu:web "/bin/bash" 2 minutes ago Up 2 minutes 0.0.0.0:8082->80/tcp webdev2
5f3964eaabf6 ubuntu:web "/bin/bash" 6 minutes ago Up 6 minutes 0.0.0.0:8081->80/tcp webdev
Überprüfe auch über den Browser, dass beide Maschinn erreichbar sind (http://192.168.1.50:8082 und http://192.168.1.50:8081).
Nginx
Wir möchten jetzt gerne beide Container unter Port 80 zur Verfügung stellen. Dafür starten wir einen weitern Container mit nginx:
docker run -i -t --name nginx -p 80:80 nginx /bin/bash
Wir starten Nginx:
service nginx start
und überprüfen im Browser, ob Nginx auf Port 80 erreichbar ist.
Wir wechseln in das Konfigurationsverzeichnis:
cd /etc/nginx/conf.d
Wir spielen die Updates ein und installieren unseren Lieblings-Editor:
apt update
apt dist-upgrade
apt install vim-nox
Und öffnen die Datei “default.conf”:
vim default.conf
Wir richten nun einen sogenannten Round Robin Proxy ein (siehe: https://de.wikipedia.org/wiki/Round_Robin_(Informatik)).
Wir ändern die Konfiguration wie folgt ab:
upstream container{
server 192.168.1.50:8081;
server 192.168.1.50:8082;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
proxy_pass http://container;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
Hinzugefügt wurden die ersten 4 Zeilen. Sie sagen aus, das die angegenen Ports des Servers über Port 80 ausgeliefert werden sollen. Und der Abschnitt location wurd angepasst, um die Vorbereitungen zu aktivieren.
Dann starten wir nginx neu:
service nginx restart
Wenn wir jetzt im Browser http://192.168.1.50 eingeben, dann sollte einer der beidn Container die Anfrage beantworten und unsere vertraute Webseite erscheinen.
Git
Erklärung für was das Versionierungssystem git benötigt wird: https://de.wikipedia.org/wiki/Git
Installation und erste Einrichtung
Die Installation von git verläuft wie erwartet:
apt install git
Wir legen bei https://github.com/ ein kostenlosen Account an, wenn nicht vorhanden.
Mit folgendem Befehl können wir eine erste Übersicht über den Befehl git bekommen:
git --help
Wir können uns auch, wie bei fast allen Linux-Befehlen, die Version anschauen:
root@proxmox:~# git --version
git version 2.11.0
Globale Parameter setzen
In der globalen Konfiguration legen wir unsere E-Mail und Benutzernamen fest, damit nachvollzogen werden kann wer welchen Code geschrieben hat:
git config --global user.name "Jörg Reuter"
git config --global user.email "joerg@reuter.sc"
Als nächstes legen wir den Standardeditor fest um mit git zu interagieren. Dies kann vim, emacs, nano oder ein anderer Editor sein. Als ersten Schritt stellen wir den Installationspfad fest:
root@proxmox:~# which vim
/usr/bin/vim
Und konfigurieren ihn für git:
git config --system core.editor "/usr/bin/vim"
Der letzte Befehl ist nur als Root oder mit sudo möglich, da eine Datei im Verzeichnis /etc verändert wird. Wir schauen uns die Datei an:
root@proxmox:~# cat /etc/gitconfig
[core]
editor = /usr/bin/vim
Und der Eintrag mit unserem Standard-Editor ist zu sehen. Selbstverständlich kann jeder User eine lokale Konfiguration anlegen, dazu kommen wir im nächsten Abschnitt.
Repository anlegen und Inhalte hinzufügen
Wir legen ein Verzeichnis an, das unser neues Repository ist:
mkdir test-repo
cd test-repo
Wir müssen jetzt die Datenbank und Dateien erstellen, damit Git mit diesem Verzeichnis arbeiten kann:
root@proxmox:~/test-repo# git init .
Initialized empty Git repository in /root/test-repo/.git/
Statt dem ‘.’ könnten wir auch den Pfad zu unserem Verzeichnis angeben.
git init /path'/to/dir
Schauen wir uns das Verzeichnis mit ls an, werden wir keine Veränderung sehen. Die ganzen Dateien liegen im Verzeichnis ‘.git’ und Verzeichnisse oder Dateien die mit einem ‘.’ beginnen sind sogenannte versteckte Dateien. Die sehen wir erst mit dem Parameter ‘-a’:
root@proxmox:~/test-repo# ls -a
. .. .git
Wir wechseln in das Verzeichnis und sehen ganz viele Dateien und Ordner, die für die Verwaltung von git nötig sind:
root@proxmox:~/test-repo/.git# ls -a
. .. branches config description HEAD hooks info objects refs
Das Verzeichnis ‘.git’ wird nicht übertragen bei einer synchronisation mit einem Server. Wenn wir das Verzeichnis aus der Kontrolle von git lösen möchten, können wir einfach das Verzeicchnis löschen:
cd ..
rm -r .git
Aber wir wollen ja mit dem Verzeichnis arbeiten:
git init .
Die einzelnen Dateien von .git werden wir uns nicht anschauen, auch wenn der Aufbau sehr interessant ist. Für das praktische Arbeiten werden wir die Kenntniss kaum gebrauchen können.
Wir legen eine leere Datei an und überprüfen die Erstellung der Datei:
root@proxmox:~/test-repo# touch datei.txt
root@proxmox:~/test-repo# ls
datei.txt
Empfohlen wir für jedes Repository eine Datei mit der Bezeichnung README.MD. Die Endung MD steht für Markdown, dass ist eine Auszeichnungssprache ind er auch diese Seitemgeschrieben worden ist. Wir legen ein README an mit dem Inhalt: “Dies ist ein Test Repository und es wird keine sinnvollen Dateien enthalten.”
Wir schauen uns jetzt den Zustand unseres Repository an:
root@proxmox:~/test-repo# git status
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
README.MD
datei.txt
nothing added to commit but untracked files present (use "git add" to track)
Wir sehen, dass unsere zwei Dateien noch nicht getrackt wurden, also noch nicht von git verwaltet werden.
Mit
git add [Datreiname]
können wir die Dateien für git vorbereiten. Aber zuerst möchten wir die globale Konfiguration überschreiben, indem wir für dieses Repository den Namen ändern:
git config user.name "FBS"
Der Befehl zum ändern der E-Mail-Adresse ist dann entsprechend aufgebaut.
Mit einem Wildcard könne wir alle Dateien für git vorbereiten:
git add *
Ein Status des Repository sieht jetzt wesentlich freundlicher aus:
root@proxmox:~/test-repo# git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: README.MD
new file: datei.txt
Als nächstes fügen wir die Dateien git hinnzu. Die geschieht mit einem kurzen Erklärungstext (Message):
root@proxmox:~/test-repo# git commit -m "Dies ist der erste commit"
[master (root-commit) cd30aa4] Dies ist der erste commit
2 files changed, 1 insertion(+)
create mode 100644 README.MD
create mode 100644 datei.txt
Ein git-Status zeigt uns die Veränderung:
root@proxmox:~/test-repo# git status
On branch master
nothing to commit, working tree clean
Wir verändern jetzt die Datei README.MD und fügen die Zeile ein: “Dies ist ein Kommentar.”
Wir schauen uns den Status an:
root@proxmox:~/test-repo# git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: README.MD
Untracked files:
(use "git add <file>..." to include in what will be committed)
+
no changes added to commit (use "git add" and/or "git commit -a")
Und sehen, dass das Versions-Kontrollsystem seine arbeit macht. Die Änderung an der Datei wurde detektiert.
Wir legen eine weitere leere Datei an:
touch datei2.c
Der Status sagt nun:
root@proxmox:~/test-repo# git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: README.MD
Untracked files:
(use "git add <file>..." to include in what will be committed)
+
datei2.c
no changes added to commit (use "git add" and/or "git commit -a")
Wir führen jetzt ein Commit durch:
root@proxmox:~/test-repo# git commit -a
[master 6323adb] fg
1 file changed, 2 insertions(+)
Und geben in dem Texteditor eine kurze Info über unsere Veränderungen ein. Commit -a fügt den aktuellen Stand git hinzu für alle Dateien die unter Beobachtung stehen. Die Datei ‘datei2.c’ gehört noch nicht dazu:
root@proxmox:~/test-repo# git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
+
datei2.c
nothing added to commit but untracked files present (use "git add" to track)
Um die Datei ‘datei2.c’ git hinzuzufügen sind zwei Befehle notwendig:
git add .
git commit -m "Neue Datei datei2.c"
Und der Status zeigt uns den Erfolg:
root@proxmox:~/test-repo# git status
On branch master
nothing to commit, working tree clean
Wir können auch Verzeichnisse in unserem Repository anlegen:
mkdir Verzeichnis
mkdir Verzeichnis2
touch Verzeichnis/test.txt
Git status zeigt uns die Datei test.txt an:
root@proxmox:~/test-repo# git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
Verzeichnis/
nothing added to commit but untracked files present (use "git add" to track
Wir fügen die neue Datei git hinzu:
git add .
und sehen uns den Status an:
root@proxmox:~/test-repo# git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
Verzeichnis/
nothing added to commit but untracked files present (use "git add" to track
Wir führen ein commit aus:
root@proxmox:~/test-repo# git commit -m "Neues Verzeichnis mit Datei"
[master 7a7b138] Neues Verzeichnis mit Datei
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 Verzeichnis/test.txt
Und ‘git status’ gibt aus:
root@proxmox:~/test-repo# git status
On branch master
nothing to commit, working tree clean
Wir löschen jetzt eine Datei:
rm datei2.c
Wir müssen die Datei jetzt aus den zu beobachteten Dateien herausnehmen. Dies funktioniert entweder über ein ‘git rm’ oder aber über ‘git add’:
git add .
Und schauen uns den Status an:
root@proxmox:~/test-repo# git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: datei2.c
Git hat den Löschvorgang als registriert.
Wir bestätigen die Änderung:
root@proxmox:~/test-repo# git commit -m "Datei datei2c gelöscht"
[master 859f3c7] Datei datei2c gelöscht
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 datei2.c
Ein ‘git status’ bestätigt, dass alle Veränderungen übernommen wurden:
root@proxmox:~/test-repo# git status
On branch master
nothing to commit, working tree clean
Wir müssen git also sowohl das Hinzufügen wie das Entfernen von Dateien mitteilen.
Log
Eine Möglichkeit, die Übersicht über ein Repository zu behalten, insbesondere wenn mehrer Leute bzw. Computer in ein Repository schreiben ist es,sich die Log-Dateien anzuschauen:
git log
Wir sehen eine Auflistung aller comits dieses Repository und können sehen, wer was wann geändert hat und die entsprechende Beschreibung der Veränderung lesen. Ebenso werden die Dateien angezeigt, die durch das commit verändert wurden.
Oft ist die Ausgabe von ‘git log’ ein wenig unübersichtlich. Daher gibt es den Parameter oneline
, der jeden commit in einer Zeile darstellt:
tim@Tim-Laptop:~/test-1$ git log --oneline
cc7a960 (HEAD -> master, origin/master, origin/HEAD) meineDatei.txt hinzugefügt
dc5e87c Initial commit
Einen Blick auf die genauen Veränderungen an dem Repository bekommen wir durch:
git log -p
Daraufhin geht unser Texteditor auf und zeigt jede Veränderung innerhalb unseren Repository an. Mit q verlassen wir den Editor.
Hier eine Beispielausgabe:
tim@Tim-Laptop:~/test-1$ git log -p
commit 41baf4be5f8bb60afe639c7194f406174fd3a542 (HEAD -> master)
Author: Joerg Reuter <joerg@reuter.sc>
Date: Tue Dec 5 06:00:47 2017 +0100
Drei Zeilen hinzugefügt
diff --git a/meineDatei.txt b/meineDatei.txt
index e69de29..d70f6df 100644
--- a/meineDatei.txt
+++ b/meineDatei.txt
@@ -0,0 +1,4 @@
+1
+2
+3
+
Wir sehen den Branch,was das genau ist, klären wir gleich. Betroffen ist hier der Branch ‘master’. Wir sehen den Autor und das Dastum der letzten Änderung. Dann die Beschreibung des commit “Drei Zeilen hinzugefügt” und eine Auflistung der betroffenden Dateien: meineDatei.txt. Durch das + wird angezeigt, dass 3 Zeichen hinzugefügt wurden: 1,2 und 3. Ein - würde entsprechend eine Löschung anzeigen.
Wenn wir nur die Veränderung an einer speziellen Datei anschauen möchten, ist dies einfach möglich:
git log -- meineDatei.log
Natürlich können wir mehrere Parameter kombinieren. Wenn wir z.B. die Änderungen an einer Datei sehen möchten und für jede Änderung soll nur eine Zeile verwendet werden:
git log --oneline -- meineDatei.txt
Wir können die Ausgabe auch nach Zeichenketten durchsuchen. Wir möchten z.B. alle Änderungen sehen, die durch einen bestimmten Benutzer vorgenommen worden sind:
git log --author="Joerg Reuter"
Oder wir möchten alle Zeilen angezeigt bekommen, in dessen Beschreibung das Wort Drei vorkommt:
git log --grep="Drei"
Es gibt gerade bei dem Befehl ‘git log’ sehr viele unterschiedliche Parameter wie z.B. eine graphische Darstellung der Veränderungen etc. Mit folgendem Befehl kann man sich alle Optionen anschauen:
man git log
Repository klonen
Oft arbeitet man zum entwickeln nicht im Master-Verzeichnis weil der CDode in diesem Verzeichnis die letzte funktionierende version darstellt. Der einfachste Weg ist es, von ndiesem Verzeichnis eine Kopie anzufertigen. Dafür legen wir oberhalb unseren Git-Repopsitory-Ordners einen neuen Ordner an und wehcseln in diesen:
mkdir arbeitsverzeichnis
cd arbeitsverzeichnis/
Es gibt jetzt viele Möglichkeiten, eine Kopie des Repository anzulegen. Eine, die nicht gut fuinktioniert ist mit dem Befehl ‘cp’ zuarbeiten. Stattsessen verwednen wir:
git clone ../test-1/ .
Bitte den Punkt hinten nicht vergessen.
Erstellen von Images
Wir überprüfen die vorhandenen Images:
docker images
Wir möchten mit CentOS Version 6 arbeiten:
docker pull centos:6
Wie bereits bekannt starten wir den Container im interaktiven Modus:
docker run -it centos:6 /bin/bash
Wir führen ein Update durch:
yum -y update
Wir installieren jetzt den Webserver Apache und git:
yum -y install httpd git
Wir laden jetzt Kontent für unsere Website:
git clone https://github.com/Ferdinand-Braun-Schule/content-dockerquest-spacebones.git
Und kopieren den Inhalt in das öffentliche Verzeichnis des Webservers:
cp content-dockerquest-spacebones/doge/* /var/www/html/
Um die Seite zu sehen, müssen wir die Startseite des Apache ausschalten:
mv /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.bak
Der Webserver soll beim booten des Systems automatisch gestartet werden:
chkconfig httpd on
Wir verlassen den Container mit
exit
und beenden damit auch den Container. Wir schauen das ganze an:
docker ps -a
In der ersten Spalte sehen wir die ID. Diese benötigen wir jetzt:
docker commit [ID] jreuter:website
Wir überprüfen den Erfolg:
docker images