Meine Docker-Umgebung mit Auto-Update und Mini-Überwachung

  • Maschinen mit Vagrant oder Kickstart installieren.

  • Dann noch mit Ansible konfigurieren (playbook: s.u.):

    ansible-playbook -i hosts -u root --extra-vars='{"dstk_hostname":{"name":"docker4","domain":"steinkopf.net"}}' ansible/baseserver.yml
    ansible-playbook -i hosts -u root ansible/docker.yml
    
  • NFS-Share mit den Volumes, gemountet im Docker-Host auf /opt/dockervolumes/. Wird von anderem Host aus ebenfalls gemountet und von dort aus gesichert (Backup).

  • docker-compose:

    • /opt/compose/ enthält je Anwendung ein Verzeichnis. Darin jeweils ein docker-compose.yml. z.B. Jira:
      atlassian-jira:
        image: 'cptactionhank/atlassian-jira:latest'
        environment:
          - JAVA_OPTS=-Datlassian.plugins.enable.wait=300
        ports:
          - '8091:8080'
        restart: always
        volumes:
          - '/opt/dockervolumes/atlassian_jira_home:/var/atlassian/jira'
          - /etc/localtime:/etc/localtime
          - /etc/timezone:/etc/timezone
      
  • Simple (!) Überwachung, ob alle noch laufen: In separater Maschine läuft ein Cronjob:
    */5 * * * *  ssh root@docker3 /root/bin/dockerstatus.sh | sort | maildiff.sh docker3_status
    

    dockerstatus.sh sieht so aus:

    docker inspect --format='{{.Name}}: {{.State.Status}}, started: {{.State.StartedAt}}, error: {{.State.Error}}.' $(docker ps --format "{{.Names}}")
    

    Dessen Output sieht dann z.B. so aus:

    /atlassianconfluence_atlassian-confluence_1: running, started: 2016-03-13T02:33:55.449812472Z, error: .
    /watchtower_watchtower_1: running, started: 2016-03-13T02:22:05.451858462Z, error: .
    /wordpress_wordpress_1: running, started: 2016-03-12T04:52:18.687126805Z, error: .
    /gitblit_gitblit_1: running, started: 2016-03-12T15:33:02.467254914Z, error: .
    /wordpress_mysql_1: running, started: 2016-03-12T04:52:17.894130738Z, error: .
    /atlassianjira_atlassian-jira_1: running, started: 2016-03-12T04:52:18.327794173Z, error: .
    /dockercomposeui_docker-compose-ui_1: running, started: 2016-03-12T04:52:18.329135739Z, error: .
    /haveged_haveged_1: running, started: 2016-03-12T04:52:17.657749912Z, error: .
    
  • havaged löst das Problem mit /dev/urandom (siehe hier).

  • watchtower schaut regelmäßig nach, ob es für eins der Images ein Update gibt. Hat sich als veraltet herausgestellt. Führt u.a. unverständlicher Fehlermeldung beim restart.

  • Da docker-compose pull ggf. neue Images herunterlädt habe ich mir folgendes Skript erstellt, welches alle 10 Minuten läuft und ggf. alles aktualisiert:

    #!/bin/bash
    
    # update all containers:
    composefiles=$(find /opt/compose/ -maxdepth 2 -name docker-compose.yml  | sort)
    for composefile in $composefiles ; do
        # see https://docs.docker.com/compose/reference/up/ :
        # docker-compose up picks up the changes by stopping and recreating the containers (preserving mounted volumes)
        echo "$composefile ..."
        docker-compose -f $composefile pull
        docker-compose -f $composefile up -d
        echo ""
    done \
    2>&1 | grep -v "Digest:\|Deleted:"
    echo ""
    
    # cleanup:
    docker ps -aqf status=exited | xargs --no-run-if-empty docker rm
    docker images -qf dangling=true | xargs --no-run-if-empty docker rmi
    

Anhang: ansible/docker.yml

- name: Install docker and docker-compose
  hosts: all

  become: true
  become_user: root

  # see https://galaxy.ansible.com/angstwad/docker_ubuntu/

  roles:
    - role: angstwad.docker_ubuntu
      docker_pkg_name: docker-engine
      update_docker_package: yes
      install_kernel_extras: yes
      kernel_update_and_reboot_permitted: yes
      docker_opts: "--storage-driver=aufs  --icc=false --iptables"


  tasks:
    - name: Fetch docker_compose_version
      shell: docker-compose --version | awk 'NR==1{print $NF}'
      register: docker_compose_version

    - name: Install Bash completion for Docker Compose
      get_url:
         url='https://raw.githubusercontent.com/docker/compose/{{ docker_compose_version['stdout'] }}/contrib/completion/bash/docker-compose'
        dest=/etc/bash_completion.d/docker-compose
        force=yes # always overwrite in case docker version changed
      when: docker_compose_version|success

7 thoughts on “Meine Docker-Umgebung mit Auto-Update und Mini-Überwachung

  1. Mein docker-compose-update-all.sh sieht seit heute so aus:

    #!/bin/bash
    #
    # Update all docker-composed images
    #
    # DSTK 2016-03
    
    lockfile=/var/lock/.$(basename $0).exclusivelock
    (
        # see http://stackoverflow.com/questions/169964/how-to-prevent-a-script-from-running-simultaneously
        # Wait for lock on $lockfile (fd 200) for 10 seconds
        if ! flock -x -w 10 200 ; then
            echo >&2 "$0 is already running. exit."
            exit 1
        fi
    
    
        # first update all local images:
        #docker images \
        #    | awk '(NR>1) && ($2!~/none/) {print $1":"$2}' \
        #    | sort \
        #    | xargs -L1 docker pull \
        #    | grep -v 'Already exists'
        #echo ""
    
        # then update all containers:
        composefiles=$(find /opt/compose/ -maxdepth 2 -name docker-compose.yml  | sort)
        for composefile in $composefiles ; do
            # see https://docs.docker.com/compose/reference/up/ :
            # docker-compose up picks up the changes by stopping and recreating the containers (preserving mounted volumes)
            echo "$composefile ..."
            docker-compose -f $composefile pull
            docker-compose -f $composefile up -d
            echo ""
        done \
        2>&1 | grep -v "Digest:\|Deleted:"
        echo ""
    
        # cleanup:
        docker ps -aqf status=exited | xargs --no-run-if-empty docker rm
        docker images -qf dangling=true | xargs --no-run-if-empty docker rmi
    ) \
    200>$lockfile
    
  2. Seit einiger Zeit habe ich immer wieder Probleme, dass sich Container nicht neu starten lassen (Unable to remove filesystem for 47b17e8eaa449143e7abaf6efbfd5c44ea82e6e3dc0e9820d905c8a1b505017b: remove /var/lib/docker/containers/47b17e8eaa449143e7abaf6efbfd5c44ea82e6e3dc0e9820d905c8a1b505017b/shm: device or resource busy).

    Googlen hat ergeben, dass wohl der Kern 3.13 aus Ubuntu 14.04 LTS ein Problem hat, welches in neueren Kerneln behoben ist.

    apt-get install linux-generic-lts-vivid
    

    (Info von hier.)

  3. Hi,

    vielen Dank für das Script zum Updaten der docker Images. Genau sowas habe ich gesucht 🙂

    Gibt es denn inzwischen eine aktualisierte Version vom Script? Oder ist es noch aktuell?

    Grüße

    ErAzOr

Schreibe einen Kommentar

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