Continuous Delivery

+ andere TechDocs
+ Docker
+ Red Hat OpenShift
+ Google App Engine
+


DevOps propagiert einen Paradigmenwechsel: Softwareentwicklung und Betrieb arbeiten nicht gegeneinander, sondern miteinander. Dabei gewinnt Continuous Delivery zunehmend an Bedeutung.

Continuous Delivery (kontinuierliche Auslieferung/Übergabe) bezeichnet in der Softwareentwicklung eine Sammlung von Techniken, Prozessen und Werkzeugen, welche kurze Entwicklungszyklen mit häufigen Softwareupdates bis hin zum produktiven System ermöglicht. Dies wird ermöglicht durch eine weitgehend automatisierte "Delivery Pipeline" / "Deployment Pipeline" mit automatisierten Build-Prozessen, Auslieferungen, Installationen, Tests (Continuous Integration) und Deployments. Dabei werden häufig Virtualisierungslösungen eingesetzt, wie beispielsweise Docker.



Inhalt

  1. Begriffe, Konzepte und Hilfsmittel zu Continuous Delivery
    Scrum versus Kanban, DevOps (Development + Operations), Delivery Pipeline / Deployment Pipeline, Continuous Integration, Continuous Delivery, Continuous Deployment, Infrastructure as Code, Vagrant, Chef, Puppet, VM (virtuelle Maschine), Hypervisor (VMM), VirtualBox, Docker, AWS, EC2, ECS, Weitere Themen
  2. Hello-World-Webanwendung mit Vagrant, VirtualBox, Ubuntu und Tomcat
  3. Hello-World-Webanwendung mit Docker, Docker Toolbox und Tomcat
  4. Weitere Docker-Beispiele



Begriffe, Konzepte und Hilfsmittel zu Continuous Delivery

Die folgenden Erläuterungen sind nur kurze Erinnerungsstützen und keine exakten Definitionen.



Hello-World-Webanwendung mit Vagrant, VirtualBox, Ubuntu und Tomcat

Als minimales Demobeispiel wird im Folgenden gezeigt, wie mit sehr wenigen Skriptzeilen eine einfache "Hello World"-Java-Webanwendung ("WAR") in einer VM installiert und gestartet werden kann.

Das Beispiel geht davon aus, dass als Host-Betriebssystem Windows verwendet wird. Es ist aber mit geringfügigen Anpassungen ebenso unter Linux und Mac OS X verwendbar.

Verwendet werden:

Führen Sie folgende Schritte durch:

  1. Sehen Sie sich weiter oben die Erläuterungen an zu: Vagrant und VirtualBox.

  2. Ein aktuelles Java SE JDK und Maven müssen installiert sein. Am besten installieren Sie auch einen Git-Client, den Sie früher oder später ohnehin benötigen werden, denn dann ist sichergestellt, das ssh.exe zur Verfügung steht. Stellen Sie sicher, dass nicht nur der cmd-Pfad zu git.exe, sondern auch der bin-Pfad zu ssh.exe in der PATH-Environmentvariable eingetragen ist.
    Überprüfen Sie:

    java -version

    javac -version

    mvn -v

    git --version

    ssh

  3. Downloaden Sie VirtualBox 5.0.12 for Windows hosts (x86/amd64) und führen Sie VirtualBox-5.0.12-104815-Win.exe aus. Sehen Sie sich das VirtualBox User Manual an.
    Überprüfen Sie:

    "C:\Program Files\Oracle\VirtualBox\VBoxManage" -v

    "C:\Program Files\Oracle\VirtualBox\VirtualBox"

  4. Downloaden Sie Vagrant Windows Universal (32 and 64-bit) und führen Sie vagrant_1.7.4.msi aus. Als Installationszielverzeichnis können Sie z.B. D:\Tools\Vagrant oder ein anderes Verzeichnis angeben. Das Vagrant-bin-Verzeichnis wird in den PATH übernommen. Sehen Sie sich an: Vagrant Getting Started.
    Überprüfen Sie:

    vagrant -v

    vagrant

  5. Sie können eine beliebige Webanwendungs-WAR-Datei deployen. Für dieses simple Beispiel wechseln Sie in ein beliebiges Projekte-Workspace-Verzeichnis (z.B. \MeinWorkspace) und erzeugen folgendermaßen mit Maven eine "Hello World"-WAR:

    cd \MeinWorkspace

    mvn archetype:generate -DinteractiveMode=false -DarchetypeArtifactId=maven-archetype-webapp -DgroupId=de.meinefirma.meinprojekt -DartifactId=MeinVagrantTomcat

    cd MeinVagrantTomcat

    mvn package

    dir target\*.war

  6. Testen Sie, ob der gewünschte Port noch nicht anderweitig belegt ist:

    netstat -an | find ":18080"

  7. Erzeugen Sie im MeinVagrantTomcat-Projektverzeichnis die Skriptdatei: Vagrantfile

    Vagrant.configure("2") do |config|
      config.vm.box = "ubuntu/trusty64"
      config.vm.network "forwarded_port", guest: 8080, host: 18080
      config.vm.network "forwarded_port", guest: 8081, host: 18081
      config.vm.provision "shell", path: "install_webapp.sh"
    end
    

    Siehe hierzu die Vagrantfile-Doku. Statt "ubuntu/trusty64" können Sie auch eine andere Ubuntu-Box als Ausgangsbasis wählen, siehe Ubuntu-Boxen.

  8. Erzeugen Sie im MeinVagrantTomcat-Projektverzeichnis die Skriptdatei: install_webapp.sh

    #!/bin/sh
    apt-get update
    apt-get dist-upgrade -y
    apt-get install -y openjdk-7-jre-headless
    apt-get install -y tomcat7
    cp /vagrant/target/MeinVagrantTomcat.war /var/lib/tomcat7/webapps/
    

    Siehe hierzu die Ubuntu-apt-get-Doku und Debian-apt-get-Doku.

  9. Sehen Sie sich die Verzeichnisstruktur an:

    tree /F

    Sie erhalten:

    [\MeinWorkspace\MeinVagrantTomcat]
     |- [.vagrant]
     |   '- ...
     |- [src]
     |   '- [main]
     |       '- [webapp]
     |           |- [WEB-INF]
     |           |   '- web.xml
     |           '- index.jsp
     |- [target]
     |   |- MeinVagrantTomcat.war
     |   '- ...
     |- install_webapp.sh
     |- pom.xml
     '- Vagrantfile
    
  10. Führen Sie im MeinVagrantTomcat-Projektverzeichnis aus:

    vagrant up

    start http://localhost:18080

    start http://localhost:18080/MeinVagrantTomcat

    --> Sie erhalten die gewünschte "Hello World"-Webseite.

  11. Mit vagrant halt können Sie Tomcat und die VM herunterfahren.
    Mit vagrant destroy können Sie die VM komplett entfernen.
    Sehen Sie sich auf der Vagrant-Teardown-Dokuseite die drei Optionen suspend, halt und destroy an.

    Das "vagrant up"-Kommando dauert beim ersten Mal recht lange wegen der Downloads. Die folgenden Aufrufe gehen wesentlich schneller. Sehen Sie sich Ihre "VM-Boxen" an:

    dir "C:\Users\%USERNAME%\.vagrant.d\boxes"

    dir "C:\Users\%USERNAME%\VirtualBox VMs"

Kurzes Resümee:



Hello-World-Webanwendung mit Docker, Docker Toolbox und Tomcat

Als minimales Demobeispiel wird im Folgenden gezeigt, wie mit sehr wenigen Skriptzeilen eine einfache "Hello World"-Java-Webanwendung in einem Docker-Container installiert und gestartet werden kann.

Das Beispiel geht davon aus, dass als Host-Betriebssystem Windows verwendet wird. Es ist aber auch an Mac OS X und Linux anpassbar.

Verwendet werden:

Führen Sie folgende Schritte durch:

  1. Sehen Sie sich weiter oben die Erläuterungen an zu: Docker und Docker Toolbox.

  2. Ein aktuelles Java SE JDK, Maven und ein Git-Client müssen installiert sein, letzteres damit ssh.exe zur Verfügung steht. Stellen Sie sicher, dass nicht nur der cmd-Pfad zu git.exe, sondern auch der bin-Pfad zu ssh.exe in der PATH-Environmentvariable eingetragen ist.
    Überprüfen Sie:

    java -version

    javac -version

    mvn -v

    git --version

    ssh

  3. Sie können VirtualBox gemeinsam mit der Docker Toolbox installieren. Empfehlenswerter ist jedoch, VirtualBox separat vorher zu installieren. Downloaden Sie VirtualBox 5.0.12 for Windows hosts (x86/amd64) und führen Sie VirtualBox-5.0.12-104815-Win.exe aus. Sehen Sie sich das VirtualBox User Manual an.
    Überprüfen Sie:

    "C:\Program Files\Oracle\VirtualBox\VBoxManage" -v

    "C:\Program Files\Oracle\VirtualBox\VirtualBox"

  4. Downloaden Sie die Windows-Variante der Docker Toolbox, z.B. in Version 1.9.1f. Führen Sie DockerToolbox-1.9.1f.exe aus, und deaktivieren Sie während der Installation die beiden Installationsoptionen VirtualBox und Git. Sehen Sie sich an: Docker-Toolbox-Installation.
    Überprüfen Sie:

    docker-machine -v

    docker-machine

    docker -v

    docker

  5. Überprüfen Sie, ob die VM "docker-vm" bereits existiert:

    docker-machine ls

    Falls sie noch nicht existiert, erzeugen Sie für Docker die VM "docker-vm":

    docker-machine create --driver virtualbox docker-vm

    docker-machine ls

    docker-machine stop docker-vm

  6. Erzeugen Sie zum Starten der Docker Machine beispielsweise im Verzeichnis \MeinWorkspace\MeinDockerMachine folgende Batchdatei: docker-machine-start.bat

    docker-machine ls
    docker-machine start docker-vm
    docker-machine env --shell cmd docker-vm | find "DOCKER_" > docker-machine-env.bat
    call docker-machine-env.bat
    set DOCKER
    docker images
    docker ps -a
    
  7. Testen Sie, ob die benötigten Ports noch nicht anderweitig belegt sind:

    netstat -an | find ":2376"

    netstat -an | find ":18080"

  8. Damit vom Windows-Host aus auf die Webseite zugegriffen werden kann, wird per VBoxManage controlvm ein Port Forwarding vom VirtualBox-Linux-Layer zum Windows-Host konfiguriert. Rufen Sie auf:

    docker-machine start docker-vm

    "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" controlvm docker-vm natpf1 "Tmct-18080,tcp,127.0.0.1,18080,,18080"

    docker-machine stop docker-vm

    Kontrollieren Sie das Ergebnis im GUI:

    "C:\Program Files\Oracle\VirtualBox\VirtualBox.exe"

    Klicken Sie links auf "docker-vm", oben auf "Ändern", dann auf "Netzwerk", "Erweitert" und "Port-Weiterleitung".

  9. Sie können eine beliebige Webanwendungs-WAR-Datei deployen. Für dieses simple Beispiel wechseln Sie in ein beliebiges Projekte-Workspace-Verzeichnis (z.B. \MeinWorkspace) und erzeugen folgendermaßen mit Maven eine "Hello World"-WAR:

    cd \MeinWorkspace

    mvn archetype:generate -DinteractiveMode=false -DarchetypeArtifactId=maven-archetype-webapp -DgroupId=de.meinefirma.meinprojekt -DartifactId=MeinDockerTomcat

    cd MeinDockerTomcat

    mvn package

    md dockerDirectory

    copy /B target\MeinDockerTomcat.war dockerDirectory\MeinDockerTomcat.war

  10. Wenn Sie nach "tomcat" in der Docker Hub Registry und nach "docker tomcat" auf GitHub suchen, erhalten Sie sehr viele Treffer sowohl für Dockerfiles als auch für Docker-Images. Im Folgenden wird das tomcat-Docker-Image aus dem so genannten "official Repo" aus der Docker Hub Registry verwendet.
    Es könnte direkt verwendet werden, ohne zusätzliches Dockerfile. Aber hier soll ein eigenes Dockerfile erstellt werden, abgeleitet vom tomcat-Docker-Image. Erzeugen Sie im Unterverzeichnis dockerDirectory die Datei: Dockerfile

    FROM tomcat:8
    MAINTAINER Mein Name <meine@email.adresse>
    ADD MeinDockerTomcat.war /usr/local/tomcat/webapps/
    CMD ["catalina.sh", "run"]
    

    Sehen Sie sich hierzu die Dockerfile Reference sowie die Doku zum tomcat-Docker-Image und das dazugehörende Dockerfile an.

  11. Sehen Sie sich die Verzeichnisstruktur an:

    tree /F

    Sie erhalten:

    [\MeinWorkspace\MeinDockerMachine]
     '- docker-machine-start.bat
    [\MeinWorkspace\MeinDockerTomcat]
     |- [dockerDirectory]
     |   |- Dockerfile
     |   '- MeinDockerTomcat.war
     |- [src]
     |   '- [main]
     |       '- [webapp]
     |           |- [WEB-INF]
     |           |   '- web.xml
     |           '- index.jsp
     |- [target]
     |   |- MeinDockerTomcat.war
     |   '- ...
     '- pom.xml
    
  12. Wechseln Sie ins MeinDockerTomcat-Projektverzeichnis und starten Sie Docker Machine mit der oben erstellten Batchdatei:

    cd \MeinWorkspace\MeinDockerTomcat

    ..\MeinDockerMachine\docker-machine-start.bat

    Bauen und starten Sie den neuen Docker-Container:

    docker build -t meintomcatimage dockerDirectory

    docker run -it --rm -p 18080:8080 meintomcatimage

    Zu den docker-Kommandozeilenparametern siehe docker build Usage, docker build Options und docker run Options.

    Achten Sie darauf, dass zwischendurch
    "INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive /usr/local/tomcat/webapps/MeinDockerTomcat.war"
    angezeigt wird. Warten Sie bis
    "INFO [main] org.apache.catalina.startup.Catalina.start Server startup"
    gemeldet wird, und sehen Sie sich an:

    start http://localhost:18080

    start http://localhost:18080/MeinDockerTomcat

    --> Sie erhalten die gewünschte "Hello World"-Webseite.

  13. Öffnen Sie ein weiteres Kommandozeilenfenster, führen Sie darin die generierte docker-machine-env.bat aus, und testen Sie bei laufendem Container docker-Kommandos und docker-machine-Kommandos (siehe auch Migrate from Boot2Docker to Docker Machine), beispielsweise:
    docker   zur Anzeige der Docker-Kommandos.
    docker info   zur Anzeige von Docker-relevanten Systeminformationen.
    docker images   zur Anzeige der Docker-Images im lokalen Repository (inklusive der IMAGE-IDs).
    docker ps -a   zur Anzeige der Docker-Container (inklusive der CONTAINER-IDs).
    docker diff <CONTAINER-ID>   zur Anzeige von Unterschieden.
    docker logs <CONTAINER-ID>   zur Anzeige von Logs (z.B. von Daemons).
    docker stats <CONTAINER-ID>   zur Anzeige des CPU- und Memory-Verbrauchs.
    docker stop <CONTAINER-ID>   zum Beenden eines laufenden Docker-Containers.
    docker rm <CONTAINER-ID>   zum Löschen von nicht mehr benötigten Containern.
    docker rmi <IMAGE-ID>   zum Löschen von nicht mehr benötigten Images im lokalen Repository.
    docker run -v ...   zum Anbinden eines Volumes als "Shared Folder".
    docker run -d ...   zum Betreiben der Anwendung im Hintergrund als "Daemon".
    docker cp Quelldatei <CONTAINER-ID>:/Zielpfad/Zieldateiname   zum Kopieren einer Datei in den Container.
    docker exec <CONTAINER-ID> ...   zum Ausführen von Kommandos im Container.
    docker exec -it <CONTAINER-ID> bash   für ein Kommandozeilenfenster zum Container.
    docker-machine   zur Anzeige der docker-machine-Kommandos.
    docker-machine ls   zur Anzeige der Docker Machines und ihrer Stati.
    docker-machine ssh docker-vm   für SSH-Zugang zum VirtualBox-Linux-Layer.

  14. Sie können dem "docker run ..."-Kommando hinter dem Image-Namen auch ein Kommando übergeben. Dann wird das im Dockerfile in der letzten Zeile unter "CMD ..." angegebene Kommando nicht ausgeführt, sondern stattdessen das von Ihnen per Kommandozeile übergebene Kommando.
    So können Sie beispielsweise per "/bin/bash" zu einem bash-Terminal (Shell-Fenster / Kommandozeilenfenster) im Container gelangen:

    docker run -it --rm -p 18080:8080 meintomcatimage /bin/bash

    Jetzt können Sie beliebige Linux-Kommandos im Container ausführen. Z.B. können Sie so den Tomcat auch manuell starten:

    catalina.sh run

  15. Sie können beim "docker run ..."-Kommando mit der -v-Option auch einen "Shared Folder" einrichten, also ein Verzeichnis, welches sowohl innerhalb des Containers als auch im Linux-Host erreichbar ist. Damit der Shared Folder auch im Windows-Host erreichbar ist, müssen Sie entweder einen Shared Folder in VirtualBox einrichten (siehe VBoxManage sharedfolder) oder ein Unterverzeichnis zu C:\Users\%USERNAME% verwenden. Letzteres macht folgende Kommandozeile (achten Sie genau auf Groß-/Kleinschreibung):

    docker run -it --rm -v /c/Users/%USERNAME%/docker-shared:/home/docker/docker-shared -p 18080:8080 meintomcatimage /bin/bash

    Beispielsweise können Sie in dem so gestarteten Container-Shell-Terminal im Shared Folder Dateien erzeugen:

    cd /home/docker/docker-shared

    echo yy > y.txt

    ls -l

    Gleichzeitig können Sie von einem Windows-Kommandozeilenfenster aus in dem Shared Folder Dateien erzeugen:

    cd /D C:\Users\%USERNAME%\docker-shared

    echo xx > x.txt

    dir

  16. Sehen Sie sich Ihre "VirtualBox-VM-Boxen" an:

    dir "C:\Users\%USERNAME%\.docker\machine\machines"

    dir "C:\Users\%USERNAME%\VirtualBox VMs"

Kurzes Resümee:



Weitere Docker-Beispiele

Weitere Docker-Beispiele finden Sie in Docker.





Weitere Themen: andere TechDocs | Docker | Red Hat OpenShift Cloud | Google App Engine (GAE/J) | Maven
© 2015 Torsten Horn, Aachen