Docker.io: Grundlagen zum interaktiven Arbeiten

Docker.io Logo

Docker.io bietet Benutzern von Linux die Möglichkeit, auf einfache Art „Linux Container (LXC)“ zu verwenden und zu administrieren.
Ganze Images diverser Distributionen können aus dem Repository Dockers heruntergeladen- und verwendet werden. Ebenso stellen Benutzer der Community Images zur Verfügung, die bereits mit Installationen verschiedenster Software daher kommen.

Mit Ubuntu 14.04 LTS (Trusty Tahr) ist Docker in den Ubuntu Repositorys angekommen, der Versionsstand: 0.9.1.
Diese Neuerung möchte ich nutzen und in einem kleinen Artikel die Grundlagen zum interkativen Arbeiten mit Docker vorstellen.
Übrigens: Debian Jessie und Sid liefern mit Version 0.9.0 respektive 0.9.1 ebenso aktuelle Pakete der Software aus.

Die Installation

Die Installation benötigt weiterhin das Paket „lxc“:

sudo apt-get install docker.io lxc

Images herunterladen, Container starten, beenden und wieder starten

Images werden aus dem „docker index“ heruntergeladen. Außer den offiziellen Images der Entwickler, bietet die Community hier ihre Arbeit an.
Zu finden sind die Images und ihre Bezeichnungen auf https://index.docker.io, alternativ kann auch via Terminal gesucht werden:

sudo docker.io search suchbegriff-für-image

„search“ kann durch „search -t“ ersetzt werden, um nur vertrauenswürdige Images anzuzeigen.
Ich bevorzuge und empfehle trotzallem die Weboberfläche zur Suche.

Ich führe meine Beispiele mit dem offiziellen Ubuntu Image in System-Version 12.04 an.
„Ubuntu“ ist hierbei das Repository, die Version „12.04“ ein Tag:

REPOSITORYTag
ubuntu12.04
ubuntu12.10
ubuntu13.04
ubuntu13.10
[...][...]

Zum besseren Verständnis, lade ich das Image vorab herunter. Dieser Schritt ist eigentlich optional, da das Image bei Bedarf heruntergeladen würde.
Der Befehl „pull“ benötigt das Repository, ein Tag ist optional. Das Format lautet in meinem Fall „repository:tag“:

sudo docker.io pull ubuntu:12.04

Ohne Angabe des Tags, würde ich alle verfügbaren Versionen Ubuntus als Image herunterladen.
Dass alles geklappt hat, überprüfe ich mit dem Befehl „images“:

sudo docker.io images 

Eine Beispielausgabe:

REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 12.04 1edb91fcb5b5 18 hours ago 209.2 MB

Nun starte ich eine Shell (Bash) in einem neuen Container des Ubuntu Images.
„-i“ bezeichnet das interaktive Arbeiten am Container. Ich werde somit im virtuellen System arbeiten.
„-t“ wiederum startet mit einer „Pseudo TTY“.

sudo docker.io run -i -t ubuntu:12.04 /bin/bash
Der Befehl „run“ ist leicht falsch zu verstehen. Mit „run“ wird ein neuer Container eines Images erstellt. Weiterhin gibt es „start“, um einen existierenden Container zu starten

Ich befinde mich nun im eben heruntergeladenen Image, welches als Container gestartet wurde:

root@8ee471ae9da4:/root# ls -l
total 0
root@8ee471ae9da4:/root# exit

Mit letztem Befehl „exit“, verlasse UND schließe ich den Container.

Mit STRG+P gefolgt von STRG+Q, löse ich den Container von der TTY („detach“).

Zum Verständnis: Das Image bleibt immer unangetastet! Der Container bleibt hingegen auch nach dem Verlassen gespeichert. Ein Container beinhaltet lediglich die Unterschiede zum Image.
So ist es möglich, einen Container erneut zu starten und in diesen hinein zu wechseln.
Zuerst lasse ich mir alle („-a“) Container anzeigen. Ohne Parameter zeigt „ps“ nur gestartete Container an:

sudo docker.io ps -a

Die Ausgabe (Status hervorgehoben):

andre@Laptop:~$ sudo docker.io ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8ee471ae9da4 ubuntu:12.04 /bin/bash 11 seconds ago Exit 0 furious_lumiere

Zu sehen ist hier die ID des Containers. Diese ID benutze ich zum erneuten Start des Containers:

sudo docker.io start 8ee471ae9da4

Dass der Container wieder läuft, prüft nochmals „ps -a“:

andre@Laptop:~$ sudo docker.io ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8ee471ae9da4 ubuntu:12.04 /bin/bash 4 minutes ago Up 1 seconds furious_lumiere

Anschließend kann ich den Container wieder betreten:

sudo docker.io attach 8ee471ae9da4

Einen neuen (interaktiven) Container erstelle ich mit dem Befehl „run“:

sudo docker.io run -i -t ubuntu:12.04 /bin/bash

Einen oder alle Container löschen

Gelöscht werden können Container nur im beendeten Zustand. Mit „ps“ kann der Status wie beschrieben überprüft werden.
Um obigen Container zu löschen, benutze ich den Befehl „rm“ und arbeite mit der Container ID:

sudo docker.io rm 8ee471ae9da4

Alle Container lösche ich mit folgendem Trick:

sudo docker.io rm `sudo docker.io ps --no-trunc -a -q`

Ein oder alle Images löschen

Ebenso können Images gelöscht werden. Welche habe ich heruntergeladen?

sudo docker.io images

Beispiel der Ausgabe:

andre@Laptop:~$ sudo docker.io images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 12.04 1edb91fcb5b5 32 hours ago 209.2 MB
andre@Laptop:~$

Gezielt löschen funktioniert mit der ID. Statt „rm“, benutze ich nun „rmi“:

sudo docker.io rmi 1edb91fcb5b5

Alle Images löschen:

sudo docker.io rmi `sudo docker.io images -q`

Nginx installieren, die interaktive Methode

Nachdem ich alle Images und Container gelöscht habe, möchte ich nun Nginx via Ubuntu 12.04 installieren. Wie bereits gesagt, ist das manuelle Herunterladen des Images nicht notwendig, ich kann sofort mit „run“ arbeiten. Das Image wird vorab geladen und dann gestartet. Wieder arbeite ich interaktiv.
Neu ist die Angabe zur Weiterleitung des Ports 80 via „-p“.
Die Syntax:

[...] -p HOST-PORT:CONTAINER-PORT [...]

Ebenso kann die Weiterleitung auf eine IP des Hosts gebunden werden:

[...] -p HOST-IP:HOST-PORT:CONTAINER-PORT

Nun der gesamte Befehl, um Port 80 des Containers auf Port 80 des Hosts weiterzuleiten:

sudo docker.io run -p 80:80 -i -t ubuntu:12.04 /bin/bash

Die Ausgabe bis zum Beitritt des Containers:

andre@Laptop:~$ sudo docker.io run -p 80:80 -i -t ubuntu:12.04 /bin/bash
Unable to find image ‚ubuntu:12.04‘ locally
Pulling repository ubuntu
1edb91fcb5b5: Download complete
511136ea3c5a: Download complete
c4a6bcd99cef: Download complete
331ad23d66e2: Download complete
d8d201f58bb5: Download complete
root@5cdb480f84a8:/#

Im Container verfahre ich wie auf einer echten Maschine:

root@5cdb480f84a8:/# apt-get install nginx -y
[…]
Setting up nginx-full (1.1.19-1ubuntu0.6) …
[…]
root@5cdb480f84a8:/# nginx
root@5cdb480f84a8:/# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 18060 1992 ? Ss 07:01 0:00 /bin/bash
root 10 0.0 0.0 62912 1336 ? Ss 07:01 0:00 nginx: master process nginx
www-data 11 0.0 0.0 63220 2148 ? S 07:01 0:00 nginx: worker process
www-data 12 0.0 0.0 63220 1648 ? S 07:01 0:00 nginx: worker process
www-data 13 0.0 0.0 63220 1648 ? S 07:01 0:00 nginx: worker process
www-data 14 0.0 0.0 63220 1648 ? S 07:01 0:00 nginx: worker process
root 15 0.0 0.0 15284 1148 ? R+ 07:01 0:00 ps aux
root@5cdb480f84a8:/# exit

Nginx ist jetzt im Container installiert, gestartet und der Container beendet.
Gestartet werden kann der Container im letzten Zustand wieder mit „start“:

sudo docker.io start 5cdb480f84a8

Dass der Container gestartet wurde, sehe ich – wieder – mit „ps“.
Beispielausgabe:

andre@Laptop:~$ sudo docker.io ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5cdb480f84a8 ubuntu:12.04 /bin/bash 12 minutes ago Up 3 seconds 0.0.0.0:80->80/tcp cocky_babbage

Im Browser kann nun „http://localhost“ aufgerufen werden.
Um den Container wieder zu betreten:

sudo docker.io attach 5cdb480f84a8
Wie angeführt, muss ich die Shell nicht via „exit“ verlassen und den Container somit stoppen, sondern kann sie loslösen via STRG+P gefolgt von STRG-Q, womit der Container weiterläuft.

Schlusswort

Docker.io ist ein mächtiges Tool, um Linux Container zu handlen.
In meinem Artikel gehe ich -nur- auf die absoluten Grundlagen ein, um interaktiv mit diesen zu arbeiten.
Bei Zeit werde ich die schönere Art vorstellen, die sich auch für den Server-Einsatz eignet. So ist es etwa möglich, mit einem „Docker-File“ einen Container unbeaufsichtigt zu erstellen und vieles, vieles mehr…

5 Antworten auf “Docker.io: Grundlagen zum interaktiven Arbeiten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.