1. Installation
  2. Docker-Hilfe
  3. Mit Docker Hub verbinden
  4. Images besorgen
    1. suchen
    2. herunterladen
  5. Container
    1. erstellen
    2. verwalten
    3. beobachten
  6. Images
    1. erstellen
    2. hochladen
  7. Container verknüpfen
  8. Volumes

Installation

Docker-Hilfe

  • Kommandos auflisten, indem man einfach docker eingibt
  • Hilfe zu einem Kommando, indem man einfach docker <kommando> ohne Parameter eingibt
    • bei Kommandos ohne Parameter hängt man einfach --help an

Mit Docker Hub verbinden

sudo docker login

Images besorgen

suchen

sudo docker search <Suchbegriff>
  • liefert die Kombination von Nutzername/Imagename des Images zurück

herunterladen

  • Images werden automatisch bei ihrer ersten Verwendung heruntergeladen
  • Images können manuell vorab mit pull heruntergeladen werden
sudo docker pull my/image[:tag]

Container

erstellen

Einen Befehl auf einem Image in einem Container ausführen

sudo docker create <author/image:tag> [<befehl>]
  • bei Images von docker wird <author> weggelassen
  • wird kein speziefischer Tag angegeben, wird latest verwendet

Beispiele:

  • sudo docker create ubuntu:14.04 /bin/echo 'Hallo Welt'
  • sudo docker create myacc/apache

Container mit aktiver Shell erzeugen

sudo docker create -t -i ubuntu:14.04 /bin/bash
  • -t erstellt eine Pseudo-Konsole (tty)
  • -i überträgt STDIN interaktiv von der aktuellen Konsole in den Container

Deamon-Prozess in einem Container laufen lassen

sudo docker create -d ubuntu:14.04 /bin/sh -c "while true; do date; sleep 2; done"
  • im Beispiel wird im Container alle zwei Sekunden das aktuelle Datum ausgegeben
  • der Container läuft ohne Ausgabe im Hintergrund, lediglich die Container-ID wird zurückgegeben
  • per docker logs <id> können die Ausgaben des Container eingesehen werden

Container-Ports mit Host-Ports mappen

sudo docker create -d -P my/apache apachectl start
  • -P mappt alle vom Container offenen Ports auf einen Port des localhost
  • -p <hostPort>:<containerPort> mappt gezielt einen Port des Containers auf einen Port des localhosts

Namen für Container vergeben

  • mit dem run-Argument --name <name>
  • kann derzeit nur einmalig beim Erstellen vergeben und nicht geändert werden

verwalten

Container starten

sudo docker start <containerId>

Container erzeugen und starten

sudo docker run  <author/image:tag> [<befehl>]

Container stoppen

sudo docker stop <containerID>

Container entfernen

sudo docker rm <containerID>

alle Container entfernen

sudo docker rm $(docker ps -a -q)
  • das -q Flag gibt nur die IDs der Container zurück (quiet)

automatisches Entfernen direkt nach der Ausführung funktioniert mit dem run-Flag --rm

sudo docker run --rm my/image date

beobachten

Shell in einem Container starten
einen weiteren Prozess in einem Container starten

sudo docker exec mycontainer -it bash

Container anzeigen / ID ermitteln

sudo docker ps
  • gibt einen Überblick über die gerade aktiven Container inklusive deren ID, Image, ausgeführtes Kommando, Erstellungsdatum, Startzeit und offenen Ports
  • -a - listet auch alle gestoppten Container auf
  • -l - listet den jeweils zuletzt erstellten Container auf

Ein Portmapping gezielt aufsuchen

sudo docker port <containerId> 80
  • gibt Host-IP und Port für den Dienst zurück

Die Konsolenausgabe eines Containers aufrufen

sudo docker logs <containerId>
  • druckt die Ausgabe einmalig in die aktuelle Konsole
  • -f gibt die Ausgaben live aus

Alle Eigenschaften und Einstellungen eines Containers anzeigen

sudo docker inspect <containerId>
  • gibt alle Einstellungen und Eigenschaften im JSON-Format auf der Konsole aus
  • mit jshon kann die Ausgabe im Detail untersucht werden
  • Beispielsweise alle Volumes auf der Konsole ausgeben:
sudo docker inspect <containerID> | jshon -e 0 -e "Config" -e "Volumes" -k

Images

erstellen

...über den Commit eines Containers

  • ausgehend von einem Basis-Image über die Konsole die gewünschten Änderungen vornehmen
  • den Container mit den Änderungen als neues Image commiten
sudo docker commit -m="installed Apache" -a="Thomas Steinbach" <containerId> username/imagename:tag

...über ein Dockerfile

  • ein Dockerfile ist ein Script, welches Instruktionen enthält, was ausgehend von einem Basis-Image zu konfigurieren ist
  • Dokumentation für Dockerfiles im Wiki
  • ein minimales Beispiel für Dockerfile
# This is a comment
FROM ubuntu:14.04
MAINTAINER Thomas Steinbach <tstein@example.com>
RUN apt-get update && apt-get install -y apache2
RUN apachectl start

Image erstellen:

cd path/to/Dockerfile
sudo docker build -t="username/imagename:tag" .

hochladen

sudo docker push username/imagename

Container verknüpfen

  • Container werden über ihren Namen verknüpft und sollten daher immer mit --name <name> gestartet werden
  • angenommen eine Datenbank wird in einem Quellcontainer unter dem Namen db gestartet:
    sudo docker run -d --name db training/postgres
  • dann können Zielcontainer mittels --link sourcename:alias mit dem Quellcontainer verbunden werden und dessen Ports direkt nutzen
sudo docker -d -P --name web1 --link db:db training/webapp python app.py
  • der sourcename verweist dabei auf den Quellcontainer über dessen Namen
  • der alias wird für die Adressierung des Quellcontainers im Zielcontainer verwendet
  • der Quellcontainer kann dabei wie folgt adressiert und genutzt werden:
    • Docker legt einen Mapping-Eintrag in der hosts an, wobei der alias dann mit der IP des Quellconainers aufgelöst wird.
      • cat /etc/hosts würde Beispielsweise folgenden Eintrag beinhalten:
        172.17.0.5  db1
    • Docker legt Umgebungsvariablen an, welche mit ALIAS_ beginnen
      • env würde Beispielsweise folgende Einträge beinhalten
        DB1_NAME=/web1/db1
        DB1_PORT=tcp://172.17.0.5:5432
        DB1_PORT_5000_TCP=tcp://172.17.0.5:5432
        DB1_PORT_5000_TCP_PROTO=tcp
        DB1_PORT_5000_TCP_PORT=5432
        DB1_PORT_5000_TCP_ADDR=172.17.0.5

Volumes

  • eingehangenes Dateisystem losgelöst vom Containerdateisystem
  • kann zwischen Containern sowie dem Host geteilt werden
  • bestehen solange, bis kein Container sie mehr verwendet

Ein Volume für einen Container erstellen

sudo docker run -t -i -v /myvolume ubuntu /bin/bash
  • innerhalb des Containers wird das Volume unter /myvolume eingehangen

Ein Data Volume mit einem Host-Ordner verknüpfen

sudo docker run -t -i -v /path/to/hostfolder:/path/to/containervolume ubuntu /bin/bash
  • das eingehangene Volume spiegelt den Ordner unter /path/to/hostfolder wieder
  • dies ist auch auf Dateien anwendbar
  • nicht der übliche Weg, um Dateien zwischen Containern auszutauschen (dazu nächster Punkt)

Data Volumes über Container hinweg wiederverwenden

  • Data Volumes eines Containers können in einem anderen Container wiederverwendet werden
  • als Quelle sollte zunächst ein Named Data Volume Container erstellt werden
sudo docker create -v /shared_files --name common_data ubuntu
  • anschließend können mit --volumes-from beliebig viele weitere Container die Volumes von common_data nutzen
  • der Container common_data muss dabei nicht laufen
sudo docker run -t -i --volumes_from common_data --name ubuntu1 ubuntu /bin/bash
  • weitere Container könnten sogar die Volumes über den Container ubuntu1 nutzen
  • das Volume bleibt so lange bestehen, bis der letzte Container, der das Volume nutzt, gelöscht wurde

In einem Container nachträglich ein Volume einhängen

  • nicht direkt möglich; normalerweise wird der Container verworfen, da er ja keine persistenten Daten beinhalten sollte, und ein neuer Container mit Volume erstellt
  • als Developer wird man jedoch im Container Änderungen machen, welche verloren gehen
  • der Weg ist dabei, aus dem Container ein Image zu machen oder anders gesagt, die Änderungen aus dem Container in ein Image zu committen (siehe oben)
  • anschließend kann der alte Container verworfen werden und ein neuer Container aus dem neuen Image mit Volume erzeugt werden
Tags:
Erstellt von Thomas Steinbach am 2014/09/04 19:59
    
Copyright 2004-2019 XWiki
7.4.5