Eine App im Container
Eine App im Container soll dein Netz erreichen, der Host, auf dem sie läuft, und seine anderen Container aber draußen bleiben. Ein juist-Container daneben, der sich ihren Netz-Namespace teilt, macht die App zu einem eigenen Gerät.
Was du bekommst #
juistd läuft in einem zweiten Container, der sich den Netz-Namespace der App
teilt, und legt dort juist0 an. Was die App zu einer Adresse eines
Mitglieds öffnet, geht durch den Tunnel, von den eigenen Adressen des
Geräts. Die Zugriffsregeln behandeln die App
wie jedes andere Gerät, du kannst ihr also genau das geben, was sie braucht,
und nichts sonst. Der Host und seine anderen Container bleiben außerhalb des
Netzes.
Was du brauchst #
- Einen Linux-Host mit Docker oder Podman.
- Das Image von juist:
make imageim Quellbaum, danndocker load.
Einrichten #
Lade das Gerät ein:
juist invite appIn einer compose.yaml hält ein eigener Dienst, netns, den Namespace,
damit juist und die App ihn behalten, wenn einer von beiden neu startet. Den
Einladungslink bekommt juist in JUIST_JOIN:
services:
netns:
image: registry.k8s.io/pause:3.10
restart: unless-stopped
juist:
image: juist:VERSION
network_mode: service:netns
user: "0:0"
cap_drop: [ALL]
cap_add: [NET_ADMIN]
devices: [/dev/net/tun]
environment:
JUIST_JOIN: "juist:…"
volumes:
- type: volume
source: juist
target: /var/lib/juist
volume:
nocopy: true
restart: unless-stopped
app:
image: … # die App
network_mode: service:netns
depends_on: [juist]
restart: unless-stopped
volumes:
juist: {}docker compose up -dWie der Beitritt lief, zeigt docker compose logs juist, die Adressen des
Geräts docker compose exec juist juist status. Unter Podman kommt die
compose.podman.yaml des Beispiels dazu.
Gib der App nur, was sie braucht, etwa Ollama auf mac:
pass from app to mac proto tcp port 11434Wie du das festlegst, steht unter Zugriffsregeln.
Darauf achten #
- Namen werden in den Containern nicht aufgelöst, da dort kein
systemd-resolved läuft, und
juist healthsagt das. Nimm die Adressen, diejuist devicesauflistet, oder trag Namen mitextra_hostsannetnsin die/etc/hostsdes Namespace ein, mit der IPv6-Adresse, die beim Umnummerieren gleich bleibt. - Gemeinsam neu starten. Startet
netnsneu, startetdocker compose restart netnsjuist und die App mit ihm neu; sonst bleiben sie in seinem alten Namespace. - Kein privilegierter Modus. juistd braucht nur
CAP_NET_ADMINund/dev/net/tun. Docker gibt eine Capability nur root, also läuft juistd dort als root, ohne jede andere Capability. - Ports, die die App veröffentlicht, gehören an
netns, denn es ist dessen Namespace. - Ohne Zugriffsregeln erreicht die App jeden Port jedes Mitglieds, wie jedes andere Gerät.
Weiterlesen #
- Im Container, in der Installationsanleitung
- examples/sidecar,
dasselbe mit Kommentaren, einer
.envund Podmans Ergänzung