# Docker und Sie :)

**URL:** <https://community.gladysassistant.com/t/docker-et-vous/6395>\
**Category:** Random\
**Created:** [15. Juni 2021 um 08:29 UTC](https://community.gladysassistant.com/t/docker-et-vous/6395 "2021-06-15T08:29:48Z")\
**Posts on this page:** 13\
**Page:** 1

<div class="post-metadata">

**Author:** ![Totof](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/totof/32/3640_2.png) [@Totof](https://community.gladysassistant.com/u/Totof)\
**Post date:** [15. Juni 2021 um 08:29 UTC](https://community.gladysassistant.com/t/docker-et-vous/6395/1 "2021-06-15T08:29:49Z")

</div>

Hallo zusammen 🥳

Ich weiß, dass viele von euch Docker privat und/oder beruflich nutzen.  
Ich muss bald eine Testinfrastruktur auf Docker aufsetzen und habe daher einige Fragen zu eurer Nutzung. 🙂

Beim Lesen der Empfehlungen der ANSSI bin ich auf ein paar Dinge im Bereich Sicherheit gestoßen:

- UID-Neuzuordnung
- Unprivileged

## UID-Neuzuordnung

Bei der UID-Neuzuordnung: Wenn man LXC unprivileged einrichtet,

- Benutzer LXC = 1000, Benutzer Host = 101000

Dann gibt es im Falle eines Ausbruchs kein Problem. Macht ihr das häufig? Immer?

## Unprivileged

Nutzt ihr das häufig? In meiner Vorstellung sollte es nie mit vollen Privilegien laufen. Wenn z. B. 4 USB-Ports benötigt werden, würde ich diese lieber explizit einrichten.

## Speicherung

Soweit ich mich erinnere, ist ein Docker-Container volatil, die Anwendungsdaten müssen also gebunden werden. Sie müssen also woanders gespeichert werden. Wie handhabt ihr diesen Teil? Exportiert ihr z. B. eure Logs?

## Cloud

Nutzt ihr öffentlichen Cloud- oder privaten Cloud-Speicher?

Ich werde auf eine selbstgehostete Infrastruktur / Bilder etc. setzen und die externen Abhängigkeiten auf ein Minimum beschränken. Dabei bin ich auf OKD gestoßen, das scheint nicht schlecht zu sein

> **[Kubernetes at Scale on any Infrastructure | OKD Kubernetes Platform](https://okd.io/)**
>
> Bringing together 100+ components to provide comprehensive tooling for administrators and developers, we've made choices so you don't have to. Deploy in-cloud or on-prem and join a community embracing the latest in cloud emerging technologies.

Falls jemand Empfehlungen hat, bin ich dankbar 🙂

Das Endziel ist es, eine Plattform für einige Entwickler anzubieten, damit sie mit dem Deployment von Bildern autonom sein können.

Kurz gesagt… wenn ihr eure Docker-Erfahrungen, eure Nutzung, eure Anforderungen / Einschränkungen teilen könnt, hilft mir das, einen Überblick zu bekommen.

Die Personen, für die ich das mache, wollen Docker nutzen, aber ich glaube nicht, dass sie Funktionen wie HA im Kopf haben etc. 🙂

Danke euch!

---

<div class="post-metadata">

**Author:** ![VonOx](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/vonox/32/10128_2.png) [@VonOx](https://community.gladysassistant.com/u/VonOx)\
**Post date:** [15. Juni 2021 um 08:49 UTC](https://community.gladysassistant.com/t/docker-et-vous/6395/2 "2021-06-15T08:49:15Z")

</div>

Im privaten oder beruflichen Kontext?

---

<div class="post-metadata">

**Author:** ![Totof](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/totof/32/3640_2.png) [@Totof](https://community.gladysassistant.com/u/Totof)\
**Post date:** [15. Juni 2021 um 21:26 UTC](https://community.gladysassistant.com/t/docker-et-vous/6395/3 "2021-06-15T21:26:26Z")

</div>

Beide sind interessant.

Meine Lösung wird im professionellen Rahmen eingesetzt, daher steht die Sicherheit an erster Stelle 🙂

---

<div class="post-metadata">

**Author:** ![lmilcent](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/lmilcent/32/7023_2.png) [@lmilcent](https://community.gladysassistant.com/u/lmilcent)\
**Post date:** [9. Oktober 2021 um 18:09 UTC](https://community.gladysassistant.com/t/docker-et-vous/6395/4 "2021-10-09T18:09:54Z")

</div>

Hallo

Entschuldige, ich habe deinen Post noch nie gesehen!

Persönlich verwende ich Docker mit mehreren Optionen, um die Root-Rechte standardmäßig zu entfernen.

Dafür:

1. Option Benutzerbereich (UID- und GID-Remapping)  
Das ist super, denn ein Prozess mit Root-Rechten im Container ist dann nicht mehr Root auf deinem OS. Das verwenden übrigens auch öffentliche CI/CD-Plattformen, glaube ich.  
Einziger Nachteil: Einige Anwendungen müssen angepasst werden, um keine privilegierten Ports wie Port 80 oder 443 zu verwenden oder bestimmte Systemaktionen funktionieren nicht (wie das Erstellen einer Netzwerkkarte).

2. Alle CAPABILITIES standardmäßig mit `drop_cap=all` entfernen und dann nur die hinzufügen, die notwendig sind.

3. Die maximale Leistung des Containers in CPU, RAM und Anzahl der gestarteten Prozesse begrenzen.  
Das verhindert, dass ein fehlerhafter oder kompromittierter Container alle Ressourcen des Hosts verbraucht.

4. Docker in der `userland`-Version installieren, ohne den Daemon, der mit `root`-Rechten läuft. Das ist radikal, aber sicherer.

Das ist, was mir im Moment einfällt 😅

Ein Beispiel für eine Docker-compose-Datei mit diesen Elementen, aber ohne die PID-Begrenzung:

> <https://github.com/LM1LC3N7/Dockerfiles/blob/master/nodebb/docker-compose.yml>

---

<div class="post-metadata">

**Author:** ![Totof](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/totof/32/3640_2.png) [@Totof](https://community.gladysassistant.com/u/Totof)\
**Post date:** [10. Oktober 2021 um 08:19 UTC](https://community.gladysassistant.com/t/docker-et-vous/6395/5 "2021-10-10T08:19:21Z")

</div>

> [@lmilcent](#):
>
> Ich hatte deinen Beitrag nie gesehen, entschuldige!

Kein Problem 🙂

> [@lmilcent](#):
>
> Option Benutzernamespace (UID- und GID-Remapping)

Das verwende ich auch mit LXC

> [@lmilcent](#):
>
> Ein Beispiel für Docker-compose mit diesen Elementen, ohne den Teil zur PID-Beschränkung:

Danke, das wird mir wahrscheinlich nützlich sein

Ich werde wahrscheinlich noch vor Jahresende ein Lab zu OKD machen, um zu sehen, wie sich das entwickelt.

Da wir den Entwicklern benutzerdefinierte Docker-Images bereitstellen, mit benutzerdefiniertem Apache, PHP, PHP-FPM usw., sehe ich ein Problem, das auftreten könnte.

Zum Beispiel, wenn es ein Image apache2/php7.4 mit bestimmten PHP-Modulen gibt. Wenn ein Entwickler für ein bestimmtes Projekt eine Erweiterung benötigt, die nicht enthalten ist, ein anderer Entwickler eine andere Erweiterung benötigt… das könnte unübersichtlich werden. Das würde bedeuten, ein Image pro Projekt zu erstellen. Ich habe etwas Schwierigkeiten, diesen Teil zu visualisieren.

---

<div class="post-metadata">

**Author:** ![pierre-gilles](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/pierre-gilles/32/5886_2.png) [@pierre-gilles](https://community.gladysassistant.com/u/pierre-gilles)\
**Post date:** [10. Oktober 2021 um 08:24 UTC](https://community.gladysassistant.com/t/docker-et-vous/6395/6 "2021-10-10T08:24:50Z")

</div>

> [@Totof](#):
>
> Das würde bedeuten, ein Bild pro Projekt zu erstellen.

Genau, normalerweise wird dieses Paradigma verwendet.

Ein Projekt = ein Docker-Image.

Der Entwickler des Projekts erstellt sein Docker-Image und entwickelt sein Dockerfile weiter, während das Projekt wächst.

Die Dockerfile wird wie jede andere Code-Datei behandelt, genau wie du Abhängigkeiten zu deiner package.json (oder dem Äquivalent für PHP-Projekte) hinzufügst, fügst du Systemabhängigkeiten zu deiner Dockerfile hinzu, während das Projekt wächst.

---

<div class="post-metadata">

**Author:** ![Totof](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/totof/32/3640_2.png) [@Totof](https://community.gladysassistant.com/u/Totof)\
**Post date:** [10. Oktober 2021 um 08:40 UTC](https://community.gladysassistant.com/t/docker-et-vous/6395/7 "2021-10-10T08:40:23Z")

</div>

> [@pierre-gilles](#):
>
> Der Entwickler des Projekts erstellt sein Docker-Image und entwickelt seine Dockerfile weiter, während das Projekt wächst.

In unserem Fall ist das nicht so, wir sind eher in der Rolle des Hosting-Anbieters und daher ist die Konfiguration des Webservers, Mailservers oder anderer Dienste unsere Verantwortung, falls dort eine Schwachstelle besteht. Es geht mehr um den Umfang und die Verantwortung.

Heute stellen wir VMs bereit, um den Code gemäß ihren Anforderungen zu hosten. Ich beginne, mit Ansible zu arbeiten, um den VM-Erstellungsprozess zu automatisieren. Morgen wollen sie mit Docker auf einer Lab-Plattform beginnen, um zu sehen, was sie damit machen können. Daher wird dieser Ansatz, bei dem das Image vom Hosting-Anbieter bereitgestellt wird, natürlich bestehen bleiben. Das könnte kompliziert werden 🙂

---

<div class="post-metadata">

**Author:** ![pierre-gilles](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/pierre-gilles/32/5886_2.png) [@pierre-gilles](https://community.gladysassistant.com/u/pierre-gilles)\
**Post date:** [10. Oktober 2021 um 08:50 UTC](https://community.gladysassistant.com/t/docker-et-vous/6395/8 "2021-10-10T08:50:13Z")

</div>

> [@Totof](#):
>
> In unserem Fall nein, wir sind eher in der Rolle des Hosting-Anbieters und daher die Konfiguration von Webserver, Mailserver oder anderen, wenn es hier eine Schwachstelle gibt, dann liegt das an uns. Es geht eher um den Umfang und die Verantwortung.
> 
> Heute liefern wir VMs, um den Code entsprechend den Anforderungen der Kunden zu hosten

Ach, ich verstehe, okay! 🙂 Ich dachte, du sprichst über die interne Entwicklung. In diesem Fall liegt es an dir, ein möglichst umfassendes Bild zu erstellen, das für alle passt, oder verschiedene Versionen mit unterschiedlichen Umfängen je nach Projekt anzubieten.

---

<div class="post-metadata">

**Author:** ![Totof](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/totof/32/3640_2.png) [@Totof](https://community.gladysassistant.com/u/Totof)\
**Post date:** [10. Oktober 2021 um 09:31 UTC](https://community.gladysassistant.com/t/docker-et-vous/6395/9 "2021-10-10T09:31:12Z")

</div>

> [@pierre-gilles](#):
>
> Ein möglichst umfassendes Bild, das für alle passt, oder aber mehrere Versionen mit unterschiedlichen Umfänglichkeiten je nach Projekt vorschlagen

Es wäre eher der zweite Fall. Es wird sehr viel Diskussion geben, um eine Organisation zu finden.

Sogar mit mehreren Bildern ist es kompliziert. Im Sinne, dass du ein Projekt haben kannst, das exec benötigt, was von Grund auf nicht empfohlen wird.  
Daher setzt du ein Bild mit exec und eines ohne und der Entwickler kann seine Wahl treffen.

Bei exec arbeiten wir standardmäßig gesperrt. Wenn es wirklich nötig ist, warnen wir vor dem Risiko und aktivieren es. Wenn der Entwickler die Wahl treffen kann, habe ich Angst, dass es zu einer Bildnutzung ohne Bewusstsein des Risikos dieser Bilder usw. usw. führt.

Ohne ins Klischee zu verfallen, habe ich bereits einen Entwickler gesehen, der ein chmod 777 gemacht hat, weil er blockiert war … Euhhhhhhhh 🤢 🤪

---

<div class="post-metadata">

**Author:** ![lmilcent](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/lmilcent/32/7023_2.png) [@lmilcent](https://community.gladysassistant.com/u/lmilcent)\
**Post date:** [10. Oktober 2021 um 12:53 UTC](https://community.gladysassistant.com/t/docker-et-vous/6395/10 "2021-10-10T12:53:48Z")

</div>

# Hardening

Dass du die Empfehlungen der ANSSI gelesen hast, war gut. Ich kann dir auch die des CIS BENCHMARK empfehlen (Docker, aber auch alle Arten von Systemen).

# Remap

Das geht direkt in der Docker-Konfiguration. Beispiel meiner Konfiguration:

`/etc/docker/daemon.json`

```auto
{
     "dns": ["9.9.9.9", "1.0.0.1"],
     "live-restore": true,
     "log-level": "debug",
     "max-concurrent-downloads": 30,
     "selinux-enabled": true,
     "no-new-privileges": true,
     "userland-proxy": false,
     "userns-remap" : "default"
}

```

# Unprivileged

> [@lmilcent](#):
>
> 1. Alle CAPABILITIES standardmäßig mit `drop_cap=all` entfernen und dann nur die hinzufügen, die benötigt werden.
> 2. Die maximale Leistung des Containers in CPU, RAM und Anzahl der gestarteten Prozesse begrenzen.  
> Dadurch wird verhindert, dass ein Container, der abstürzt oder kompromittiert ist, alle Ressourcen des Hosts verbraucht.
> 3. Docker in der `userland`-Version installieren, ohne den Daemon, der als `root` läuft. Das ist radikal, aber sicherer.

Ich möchte hinzufügen, dass es auch eine Suite von Mikro-Executables gibt, die sehr praktisch ist, um dieses Problem zu adressieren: [GitHub - just-containers/s6-overlay: s6 overlay for containers (includes execline, s6-linux-utils & a custom init) · GitHub](https://github.com/just-containers/s6-overlay)

Zusammengefasst ermöglicht dieses Projekt die Erstellung von Containern, die eine Reihe von Aktionen als `root` ausführen, wenn nötig (Ändern von Berechtigungen, Erstellen bestimmter spezifischer Dateien, Erstellen eines einfachen Benutzers im Container usw.), und dann das Programm mit den niedrigsten Privilegien ausführen, das im Container gestartet werden muss.  
Das ist sehr gut durchdacht und praktisch. Das ist, was ich in meinem Image hier verwende: [Dockerfiles/seedbox/flood at master · LM1LC3N7/Dockerfiles · GitHub](https://github.com/LM1LC3N7/Dockerfiles/tree/master/seedbox/flood)

# Speicherung

Ich bestätige, dass die Speicherung in einem Container standardmäßig nicht persistent ist. Das ist der Sinn von Docker-Volumes, um Speicher auch nach der Löschung eines Containers zu behalten.  
Der Vorteil ist, dass du `rm -rf /` ausführen kannst, ohne dass etwas auf dem Host-Server passiert (aber dein Container ist dann außer Betrieb).  
Die meisten meiner Anwendungen müssen persistenten Speicher verwenden, zum Beispiel für Datenbanken.  
Ich verwende Docker ein wenig im Sinne von: ein Container = ein Prozess.

Daher habe ich für einen Blog, der einen Webserver-Teil und einen Datenbank-Teil hat, zwei Container:

1. Webserver mit HTML-, JS-, Bilddateien usw.  
Nichts ist persistent (da es in das Image eingebettet ist), außer dem Ordner `logs`, `uploads` und `images`, die sich ändern können.
2. Die Datenbank.  
Gleiches Prinzip, nichts ist persistent außer dem Ordner, der die Datenbankdateien speichert (z. B. `/var/lib/mysql`.

Mein Server verwendet eine kostenlose Distribution auf Basis von RedHat (Oracle Linux), die standardmäßig `SELinux` integriert. Dadurch werden die Volumes geschützt, damit ein Container nicht entkommen oder auf eingeschränkte Dateien im System zugreifen kann. Das funktioniert übrigens sehr gut!

# Plattform

Da es sich um eine private Nutzung handelt, verwende ich einen dedizierten Server bei [Online.net](http://Online.net) (jetzt [Scaleway.fr](http://Scaleway.fr)). Es ist aber auch möglich, Kubernetes-Cloud-Instanzen zu verwenden oder direkt Container mit AWS, Azure, Google Cloud usw. zu erstellen.

---

<div class="post-metadata">

**Author:** ![Noj](https://gladys-assistant-community.b-cdn.net/letter_avatar_proxy/v4/letter/n/258eb7/32.png) [@Noj](https://community.gladysassistant.com/u/Noj)\
**Post date:** [20. Dezember 2022 um 12:47 UTC](https://community.gladysassistant.com/t/docker-et-vous/6395/11 "2022-12-20T12:47:52Z")

</div>

Ich hatte dieses Thema über Docker nicht gesehen.  
Es ist sehr interessant, danke. 🙂  
Ich arbeite ein bisschen damit bei der Arbeit.  
Habt ihr Tools zur Verwaltung der Instanzen und zur Erstellung von Hochverfügbarkeit, bitte?

---

<div class="post-metadata">

**Author:** ![lmilcent](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/lmilcent/32/7023_2.png) [@lmilcent](https://community.gladysassistant.com/u/lmilcent)\
**Post date:** [20. Dezember 2022 um 13:02 UTC](https://community.gladysassistant.com/t/docker-et-vous/6395/12 "2022-12-20T13:02:04Z")

</div>

Am bekanntesten ist das Projekt Kubernetes, wobei ich selbst keine Erfahrung damit habe. Wenn du eine Anwendung darauf anpasst, kannst du tatsächlich eine hohe Verfügbarkeit, automatische Lastverteilung und Ähnliches verwalten.  
Aber soweit ich verstanden habe, ist das alles andere als einfach.

Etwas einfacher sind Web-Interfaces wie [https://www.rancher.com/](https://www.rancher.com/) (davon gibt es auch eine Open-Source-Version), die dir helfen könnten.

---

<div class="post-metadata">

**Author:** ![Noj](https://gladys-assistant-community.b-cdn.net/letter_avatar_proxy/v4/letter/n/258eb7/32.png) [@Noj](https://community.gladysassistant.com/u/Noj)\
**Post date:** [22. Dezember 2022 um 21:10 UTC](https://community.gladysassistant.com/t/docker-et-vous/6395/13 "2022-12-22T21:10:48Z")

</div>

@lmilcent danke für dein Feedback. Ich werde es mir in den Ferien mal ansehen. 🙂
