👁️
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
  • cgroups
  • Remote Docker Host
  • Linux Containers
  • Permissions - User
  • Dockerfile USER
  • Filesystem

Was this helpful?

  1. Build und Deployment
  2. Container
  3. Docker

Docker Host

Dieses Kapital betrachtet eher die Docker Internas.


cgroups

Mit cgroups lassen sich Ressourcen (CPU, Memory) einschränken, die ein Container nutzen darf.

Remote Docker Host

Die Standard-Konfiguration ist, daß der Docker Host (der führt die Docker-Kommandos wie docker ps aus) die lokale Maschine ist. Über export DOCKER_HOST=tcp://<IP_ADDRESS>:<PORT> können die Kommandos an einen entfernten Docker-Host umgeleitet werden (sog. Remote Docker API).

Diese Konzept verwenden vermutlich auch die Docker-Wrapper, die auf nicht-nativen Docker-Umgebungen wie Windows und MacOS eingesetzt werden.

Standardmäßig ist die Remote Docker API aus Sicherheitsgründen abgteschaltet. Über export DOCKER_OPTS="-H tcp://0.0.0.0:2375 auf dem Docker-Host-Server kann die Remote API auf Port 2375 für ALLE clients verfügbar gemacht werden (will man diese Einstellung dauerhaft machen: /etc/default/docker anpassen), so daß ein export DOCKER_HOST=tcp://<IP_ADDRESS>:2375 auf dem Client den Remote-Docker-Host konfiguriert.


Linux Containers


Permissions - User

Der Docker Daemon läuft als root User und erzeugt somit auch Log-Files, die root zugeordnet sind:

root@workbench:/var/lib/docker/containers/bfaca06879908db6b54e0cc06bbc6ecc67923aff85b70fb911f1461ec8ca5f81>ls -al *.log
-rw-r----- 1 root root 1,2K Dez 16 14:23 bfaca06879908db6b54e0cc06bbc6ecc67923aff85b70fb911f1461ec8ca5f81-json.log

Das macht die Sache recht schwierig, wenn Logs beispielsweise von einem Fluentd gelesen werden sollen, um sie dann an Graylog oder ElasticSearch zur nodeübergreifenden Sammlung weitergeleitet werden sollen. Den Fluentd-Prozess läßt man natürlich nicht als root laufen (auch nicht in der root Gruppe).

Das Problem könnte umgangen werden, indem man Fluentd in einem Docker-Container laufen läßt und die Docker-Host-Log-Files per volume mounted.

BTW: Die Verwendung von USER myuser im Dockerfile ändert an den Berechtigungen des Log-Files nichts, da der Docker-Daemon noch immer für die Erstellung der Log-Files zuständig ist.

Mit

setfacl -Rdm g:loggroup:r /var/lib/docker/containers/

könnte man der Gruppe loggroup Leseberechtigungen auf alle unterhalb von /var/lib/docker/containers/ erstellten Dateien einräumen und wenn Fluentd in dieser Gruppe ist, dann Voila.

Dockerfile USER

Per Default läuft der Entrypoint-Prozess im Docker-Container mit dem User root. Somit kann der Docker-Container alles im Filesystem des Containers machen. Auch der Docker-Prozess auf dem Docker-Host (ps -ef) läuft als User root.

Es gibt unandliche Diskussionen, ob man das per USER Kommando im Dockerfile ändern sollte:

RUN adduser -D -u 1234 pfh
USER pfh

In diesem Beispiel läuft der Entrypoint-Prozess im Docker-Container mit dem User pfh. Das hat zur Folge, daß die Berechtigungen eingeschränkt sind und beispielsweise eine Änderung von /etc/hosts nicht möglich ist, weil nur der root User hier Berechtigungen hat.

Das hat also zumindest mal Nachteile. Ob es Vorteile hat ist strittig, denn eigentlich ist der root User in seinem Container eingesperrt. Aber gemäß dem Least-possible-Permissions-Ansatz sollte man das vermeiden - die Docker-Implementierung könnte Sicherheitslücken enthalten und dem root User im Container Zugriff als root auf dem Docker Host ermöglichen.


Filesystem

Das Filesystem des Docker Containers liegt unter /var/lib/docker/containers/. Wann man beispielsweise bei docker ps -a folgendes Ergebnis bekommt:

CONTAINER ID        IMAGE
87f9102cf87a        pierre

dann findet man das Filesystem des Docker-Containers unter /var/lib/docker/containers/87f9102cf87a571ea26e38994d57700e3a4e30b339d7347 (der Zugriff ist vermutlich auf root beschränkt). Darunter findet sich dann folgende Verzeichnisstruktur:

root@workbench:/var/lib/docker/containers/87f9102cf87a571ea26e38994d57700e3a4e30b339d734798d3017d2a1bd4377>tree
.
├── 87f9102cf87a571ea26e38994d57700e3a4e30b339d734798d3017d2a1bd4377-json.log
├── config.v2.json
├── hostconfig.json
├── hostname
├── hosts
├── resolv.conf
├── resolv.conf.hash
└── shm

Hier findet man also beispielsweise auch das Consolen-Log, die Docker-Engine bei docker logs 87f9102cf87a571ea26e38994d57700e3a4e30b339d734798d3017d2a1bd4377 liefert.

Das ist übrigens ein Ansatzpunkt, um containerübergreifendes Logging mit dem ELK Stack zu ermöglichen - siehe auch

PreviousDocker@WindowsNextDocker Scaling

Last updated 3 years ago

Was this helpful?