👁️
pierreinside
  • Introduction
  • Workbench
    • VirtualBox
    • Linux
      • Linux-Paketverwaltung
      • Linux Initialisierung
      • Ubuntu 14.10 LTS
      • Ubuntu 16.04 LTS
      • Ubuntu 18.04 LTS
      • Ubuntu 20.04 LTS
      • Ubuntu - Netzwerk
    • Konsole
      • ssh
      • zsh
      • cygwin
      • Babun
      • terminator
      • Terminal Multiplexer
      • Linux Tools
    • awesome
    • Entwicklungsumgebungen
      • Texteditors
      • Visual Studio Code
      • IntelliJ - IDEA
  • Softwareentwicklungsprozess
    • Schätzungen
    • Eventstorming
    • OKR
  • Architektur
    • Uncle Bob
    • Microservices
    • NoSQL
      • ElasticSearch
    • Hystrix
    • Reactive Programming
    • AngularJS
    • Service Mesh
  • Networking
    • Dependency Injection
  • Programming
    • Java Core/EE
      • Java 8
      • Java Annotationen
      • Bean Validation
      • Enterprise Java Beans Specification
      • Dependency Injection
    • JRebel
    • Webservices
      • HTTP
      • REST
      • Spring MVC REST
      • Swagger
      • Postman
    • Spring Ecosystem
      • Spring Core
      • Spring Boot
        • Programming
        • Production Ready
        • Testing
      • Spring Cloud
      • Spring Cloud Config
      • Spring MVC
      • Spring Data
      • Spring Petclinic
    • NodeJS
    • UI-Technologie
      • Thymeleaf
      • ionic
      • Web Fonts
      • Jinja Templates
      • Twitter Bootstrap
    • Python Ecosystem
      • Python Libraries
      • Python Testing
      • Python Best-Practices
      • Python Snippets
      • Python Selenium
      • Kivy UI
      • FastAPI
      • Typer CLI
      • Django
    • Groovy
    • Persistenz
      • Transactions
        • Java TX
        • JPA TX
      • TX Handling
      • JPA
        • Eclipse Link
      • MySQL
        • MySQL Performance
        • Docker MySQL
      • Hazelcast
    • Glassfish
    • YAML
    • Angular
    • Camel
    • Zeichenkodierung
    • Kinder lernen Programmieren
  • Testen
    • Easymock
    • Mockito
  • Performance & Scalability
    • Java Performance
      • Heapdump Analysis
    • Java Concurrency
    • Instana
  • Sicherheit
    • Authentifizierung
      • OpenID Connect
      • Web-Authentication API
    • Authorisierung
      • OAuth
      • SAML
    • Spring Security
    • Zertifikate
    • Kali Linux
    • VPN
    • Zero-Trust-Networks
  • Build und Deployment
    • Maven
    • Bamboo
    • Jenkins
      • Jenkins Pipelines
      • Jenkins Pipelines Tips und Tricks
      • Jenkins-configuration-as-Code
      • Jenkins IDE
    • Travis CI
    • Shellprogrammierung
      • jq - JSON Parsing
    • Konfiguration Management
    • Vagrant
      • Vagrant-Ansible-Integration
      • Vagrant Box bauen
    • Ansible
      • Getting Started
      • Ansible Details
    • Saltstack
    • LinuxKit
    • Container
      • Docker
        • Docker Getting Started
        • Debugging Docker
        • Docker Build
        • Docker Registry
        • Docker run
          • docker run
          • docker network
        • Docker Compose
        • docker machine
        • Docker@Windows
        • Docker Host
        • Docker Scaling
        • Docker Ressources
        • Docker Logging
        • windowsContainer
      • Cloud Deployment Provider
        • AWS
          • Anwendungsdeployment
          • Workload
          • Permissions
          • Netzwerke
          • AWS CLI
            • aws-vault
          • RDS
          • Static Website Hosting
          • EKS - Elastic Kubernetes Service
          • S3
        • Google Cloud Platform
      • Docker Orchestrierung
        • CoreOS
        • Kubernetes
          • microK8s
          • minikube
          • autoscaler
          • Docker
          • k9s
        • Nomad
    • PHP
  • Operations
    • Proxy
      • NGINX
    • DNS
    • Logging
      • Graylog
      • Fluentd
    • Monitoring
      • Grafana
    • Infrastructure-as-Code
      • Terraform
        • AWS-Provider
        • GitHub-Provider
      • Packer
    • Deployment
      • Vault
      • Consul
        • Consul Template
      • Fabio
  • Rechtliches
    • Software-Lizenzen
  • Git Ecosystem
    • Git
      • Git Lifecycle Hooks
    • GitHub
      • GitHub Organizations
    • GitHub Actions
    • GitHub Pages
    • GitHub CLI
    • GitHub Copilot
    • GitHub-AWS OIDC
    • GitBook
    • GitLab
    • Bitbucket/Stash
  • Publishing
    • WordPress
    • Markdown
    • Static Site Generators
      • Hugo
      • Jekyll
    • Tiddly Wiki
    • Leanpub
    • Animationsfilme
  • Storage
    • Synology 2012
    • Synology 2021
  • Collaboration
    • Übersicht
    • Microsoft Teams
  • Konferenzen
    • Velocity Berlin 2019
  • IT mit Kindern
    • Projekt Sportstracker
    • Scratch
    • Pico Spielekonsole
  • Schule
    • Mathematik
  • Misc
    • Foto/Video
      • Foto/Video Sammlung bis 2023
        • Handbrake
        • Onedrive
      • Foto/Video Sammlung ab 2024
      • Gopro
      • Panasonic FZ1000 ii
        • als Webcam
      • AV Receiver
      • Videos erstellen
        • OBS Studio
        • Touch Portal
        • Game-Streaming
      • Kameratasche
      • Kamera 2020
    • Handy
      • 2016
      • 2018
      • 2019
      • 2021
      • 2022
    • Computer
      • Laptop
        • 2018
        • Chromebook
      • Monitor
        • 4k
      • Software
        • Command Line Interface
        • Google API
        • Plant UML
        • Chromium
        • Passwort-Manager
        • GPG
      • Dell CNF 2665 Farbdrucker
      • Dockingstation
      • Gaming PC 2021
      • Mobiles Büro
      • Mobiles Internet
      • Mobiler Router
    • Beamer Benq W1000+
    • Spielekonsole
      • 2017
        • Playstation 4
      • Pico Spielekonsole
    • Gadgets
      • iPad Pro 2015 und 2016
      • iPad Air 2024
      • Macbook Pro
      • Smartwatch
      • Slate
      • Mudi
    • Fahrrad
      • Jonas 2018
      • SQLab
    • Auto
      • Auto 2022
      • Camping
        • Camping Touren Ideen
          • Camping Tour - Gardasee 2021
        • Camper
          • Camper klein - keine Stehhöhe
            • VW Bus Erfahrungen
          • Camper gross - Stehhöhe
    • Haus
      • Klimaanlage
      • Swimming Pool
      • Quick Mill Orione 3000
      • Spülmaschine 2021
      • Hebe-Schiebetür
      • Gasgrill
      • Minibar / Mini-Kühlschrank
      • Glasfaseranschluss (Fiber-to-the-Home)
      • Smart-Home
        • Raspberry Pi
        • Heimnetzwerk
      • Homeoffice
      • Energie
        • Solar
        • Wärmepumpe
    • Freizeit
      • Musik Streaming
      • Sky
      • Online Lernplattformen
      • eScooter - ePowerFun
    • Fußball
      • Meine Arbeit als Fußball-Trainer
      • Fußball Tools
      • DFB Talentförderung
    • Google Impact Challenge
  • Englisch
Powered by GitBook
On this page
  • Installation
  • Upgrade
  • Nutzung
  • Services
  • Befehle
  • Reihenfolge

Was this helpful?

  1. Build und Deployment
  2. Container
  3. Docker

Docker Compose

Hiermit lassen sich komplexe Softwaresystem aus einzelnen Docker-Containern (repräsentieren i. a. Services, die aus einem einzigen Prozess bestehen) aufbauen und miteinander vernetzen. Im Hinblick auf Microservices ist das natürlich sehr interessant.

Ein Docker-Compose ist eine Beschreibung (docker-compose.yml) einer Vernetzung von Docker-Images. Per docker-compose up wird diese Beschreibung interpretiert, Container gestartet (aus den Images werden nun Container) und miteinander vernetzt ... bei docker-compose wird automatisch ein eigenes Bridge-Netzwerk aufgebaut, in dem die Hosts/Services über ihren Servicenamen aufgelöst werden können (es müssen keine IP-Adressen verwendet werden).

Aber selbst wenn man keine komplexen Landschaften aufbauen muß, ist docker-compose in jedem Fall hilfreich, um komplexe docker run Kommandos (beispielsweise mit vielen Volume-Mounts) abzubilden, die sich dadurch persistieren und versionieren lassen.


Installation

Unter Ubuntu 16.04 LTS konnte ich mit apt-get zwar docker-compose installieren, bekam aber nur eine sehr alte Version (1.5.2). Neuere Packages habe ich nicht gefunden. Die meisten aktuellen Tutorials (auch die von Docker selber) verwenden mittlerweile allerdings die Version 2 im der Docker-Copmpose-DSL ... docker-compose.yml:

version: '2'

services:
  web:
    build:

Unter https://docs.docker.com/compose/install/ habe ich rausgefunden, daß Docker-Compose tatsächlich nur aus einem einzigen Script besteht, das man irgendwo im $PATH ablegt (z. B. /usr/local/bin/docker-compose) und ausführbar macht (alle verfügbaren Versionen befinden sich hier: https://github.com/docker/compose/releases)

curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

Das hat leider den Nachteil, daß man bei einem Systemupgrade (sudo apt-get upgrade) nicht automatisch Docker aktualisiert bekommt. Das muß man dann bei Bedarf nachholen ... oder die Disziplin haben regelmäßige Updates aller Tar-Balls zu machen.

Upgrade

Da Docker-Compose nur aus einem einzigen Binary besteht, ist das Upgrade genauso durchzuführen wie die Installation.

Nutzung

Das docker-composse.yml ist die Spezifikation des Compose. Hier werden

  • Services

  • Links

  • volumes

  • Netwerke

  • Umgebungsvariablen

  • Port-Forwarding

  • ...

spezifiziert und die Anwendnung dadurch aufgebaut.

Die Ausführung kann lokal aber auch remote erfolgen, so daß man dadurch ganz leicht die Anwendung nicht lokal, sondern bei einem Docker-Cloud-Provider wie DigitalOcean fahren kann.

Services

Docker Compose abstrahiert von den Containern und hat Services als zentrales Konzept. Die Servicenamen dienen auch der Adressierung (statt IP-Adressen oder Containernamen) und werden dementsprechend in Service-URLs verwendet. Das zeigt sich beispielsweise daran, daß

  • die Services sind unter ihrem Servicenamen als Hostname erreichbar sind

  • man Services über den Servicenamen referenziert und nicht den evtl. auch vergebenene Containernamen

  • man bei docker-compose up mysql den Servicenamen angibt, auch wenn der Container, der im Hintergrund gestartet wird den Namen pfh_mysql. Deshalb sind folgende Befehle identisch:

    • docker logs pfh_mysql

    • docker-compose logs mysql

Die docker-compose.yml liefert hier den entsprechenden Kontext und muß sich deshalb auch im aktuellen Verzeichnis befinden.


Befehle

  • docker-compose up

    • gesamte Anwendung hochfahren

    • -d daemonized hochfahren

  • docker-compose up my-service

    • nur den my-service starten

  • docker-compose down

    • gesamte Anwendung runterfahren und die Container löschen - im Gegensatz zu docker-compose stop

  • docker-compose start

    • gesamte Anwendung aus den existierenden (gestoppten) Containern starten. Sollten bereits einige Container der Anwendung schon laufen, dann stört das nicht

  • docker-compose start mysql

    • Container mysql starten

  • docker-compose logs

    • aggregierte Log-Ansicht von allen Services (bzw. Machines)

  • docker-compose logs -f

    • forwarding Log-Ansicht von allen Services (bzw. Machines)

  • docker-compose build web

    • Image des Service web neu bauen

  • docker-compose run --rm myService ping localhost

    • Service in einem neuen Container starten und ein einziges Kommand absetzen - danach wird der Container gestoppt und gelöscht

Reihenfolge

  • Docker-Compose - Getting Started

  • Docker-Compose - Control Startup Order

Links sind ein Mittel, um Abhängigkeiten zwischen Containern zu beschreiben. Das ist sehr praktisch, wenn man die Abhängigkeiten vor dem Benutzer verbergen will (statt docker-compose up service1 dep-service-a dep-service-b nur docker-compose up service1). Allerdings werden die Container nur gestartet, es ist zu keinem Zeitpunkt klar, ob der darin befindliche Service auch tatsächlich benutzbar ist oder sich noch in der Startphase befindet.

ABER ACHTUNG: Docker Compose sorgt nur dafür, daß die linked Containers gestartet werden ... es KANN NICHT garantiert werden, daß der Service dann tatsächlich auch schon nutzbar ist. In diesem Fall könnte man mit Tools wie wait-for-it/dockerize/wait-for arbeiten. Diese stellen aber nur einen Workaround dar, denn eigentlich muß man in Microservice-Produktivszenarien immer damit rechnen, daß Services nicht mehr verfügbar sind und Resilience Patterns implementieren.

Es gibt allerdings Lösungen durch andere OSS-Projekte:

  • https://github.com/vishnubob/wait-for-it

    • wird in Spring Petclinic benutzt ... in der entrypoint Konfiguration

  • https://github.com/jwilder/dockerize

Diese Tools packt man am besten in das Docker-Image und kann sie dann im Provisioningscript verwenden.

Previousdocker networkNextdocker machine

Last updated 3 years ago

Was this helpful?