Skip to content

SS2019: Technologierecherche – Docker

Florian Bräunsbach edited this page Apr 16, 2019 · 2 revisions

Docker

Docker ist eine inzwischen weit verbreitete Software für Containervirtualisierung. Dabei werden einzelne Anwendungen mit allen Abhängigkeiten als Container gepackt und isoliert voneinander ausgeführt. So lassen sich Anwendungen in der selben Umgebung lokal, in einer Testumgebung und auf dem Produktiv-Server ausführen. Eine wichtige Eigenschaft von Docker Containern ist, dass diese bei jedem (Neu-)Start eine identische Umgebung bereitstellen, d.h. es werden keine Daten persitent in den Containern gespeichert.

Dockerfile

Eine Dockerfile beschreibt die Schritte, die ausgeführt werden, um ein Docker-Image zu erstellen, das dann zum Starten von Containern verwendet werden kann.

Beispiel: Dockerfile

FROM ubuntu

RUN apt-get install -y software-properties-common python
RUN add-apt-repository ppa:chris-lea/node.js
RUN echo "deb http://us.archive.ubuntu.com/ubuntu/ precise universe" >> /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y nodejs
RUN mkdir /var/www

ADD app.js /var/www/app.js

CMD ["/usr/bin/node", "/var/www/app.js"] 

Docker Compose

Mit Docker Compose lassen sich Multi-Container Docker Applikationen definieren und ausführen. Beispielsweise Anwendungen, die neben einem Webserver noch eine zugehörige Datenbank benötigen, wie WordPress.

Beispiel: docker-compose.yml

version: '3.3'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
       WORDPRESS_DB_NAME: wordpress
volumes:
    db_data: {}

CI/CD

Continuous Integration (CI) und Continuous Deployment (CD) beschreiben Konzepte, die genutzt werden, um Software zu entwickeln, zu testen, auszuliefern und zu überwachen. In diesem Bereich wird auch häufig der Begriff DevOps verwendet, um den veränderten Software-Entwicklungszyklus von Entwicklung (Development, kurz: Dev) zur Ausführung (Operations, kurz: Ops) zu beschreiben.

Eingesetzt wird CI/CD in der Regel zusammen mit dem Versionskontrollsystem Git, wobei ein Commit in einem entsprechenden Repository automatisch das Builden, Testen und ggf. Deployment der Anwendung startet. Beliebte Tools für das Umsetzen sind beispielsweise GitLab CI, Travis CI und Azure Pipelines (Teil von Azure DevOps). Nachfolgend wird auf GitLab CI weiter eingegangen.

GitLab CI

GitLab CI ist ein Teil von GitLab und ermöglicht die Nutzung von Pipelines zum Builden, Testen und Deployen von Anwendungen. Diese Pipelines werden in der Regel als Docker Container auf eigenen Servern mit der Software GitLab Runner ausgeführt. In einer gitlab-ci.yml-Datei werden die verschiedenen Stufen einer Pipeline definiert.

Beispiel: gitlab-ci.yml

image: node

stages:
  - test
  - build
  - deploy

test:
  stage: test
  cache:
    paths:
      - node_modules/
  before_script:
    - npm install
  script:
    - npm test

build:
  stage: build
  script:
    - npm build
  artifacts:
    paths:
      - public
  only:
    - master

deploy:
  stage: deploy
  script:
    - npm deploy
  only:
    - master

Fragen

  1. Wie lassen sich Docker Container im Projekt nutzen und ausführen?
  2. Wie funktioniert das Networking mit Docker?
  3. Wie funktioniert die persistente Speicherung von Daten mit Docker?
  4. Wie lässt sich CI/CD in Kombination mit Docker einsetzen?
  5. Welche Tools eigenen sich für die Nutzung von CI und Docker (im Projekt)?