hier war ja schon ein paar mal die Diskussion, wie man "von außen" auf Docker Volumes zugreifen kann. Nach ein wenig Recherche im Netz bin ich jetzt zu einer Lösung gekommen, die ich hier kurz vorstellen will. Die Idee dahinter ist, einen zweiten Container zu starten, der einen ssh Server enthält und die gleichen Volumes mountet, wie der Container, dessen Volumes gemountet werden sollen. Ein zweiter Container deswegen, da es in Docker nicht ganz unproblematisch ist, einen zweiten Serverprozess im Hintergrund zu starten und es außerdem eher der Philosophie entspricht.
Vorweg ein Disclaimer: Das Ganze ist nicht fertig sondern eher als Konzeptstudie und "Work in Progress" zu verstehen, trotzdem könnte es ja schon für andere interessant sein. Außerdem ist es nicht ausgetestet, insbesondere habe ich es bislang auch nur mit meiner lokalen Docker Installation auf meinem Laptop getestet. Das werde ich noch nachholen, sobald ich wieder Zugriff auf den Timberwolf und etwas Zeit habe. Die Beschreibung ist an einigen Stellen Linux/Unix spezifisch, sollte sich analog aber auch mit Windows umsetzen lassen.
Der Docker Container basiert auf dieser Beschreibung: https://docs.docker.com/engine/examples ... h_service/
Zum Vorgehen:
1. Erstellen eines Schlüsselpaars
Es ist deutlich praktischer, wenn man nicht für jedes Login ein Passwort eingeben muss. Daher habe ich zunächst ein Schlüsselpaar für den Login am Container erstellt, Länge und Typ können dabei an das eigene Sicherheitsbedürfnis angepasst werden.
Code: Alles auswählen
ssh-keygen -t rsa -b 2048
Das erzeugt zwei Dateien, einmal SSHKey-docker (den privaten Schlüssel), zum anderen SSHKey-docker.pub (den öffentlichen Schlüssel). Der öffentliche Schlüssel muss später auf den Server wandern, um sich dann dort mit dem privaten Schlüssel authentifizieren zu können.
Alternativ kann man sich am Container auch per Password authentifizieren, das ist in der gepostetet Variante auch aktiviert, kann aber bei Bedarf deaktiviert werden.
WICHTIG: Das Passwort im Dockerfile ändern!!
2. Kopieren des öffentlichen Schlüssels in das Verzeichnis, in dem auch das Dockerfile liegt
3. Docker Image erstellen.
Dockerfile:
Code: Alles auswählen
# Based on https://docs.docker.com/engine/examples/running_ssh_service/
FROM debian:latest
RUN apt-get update && apt-get install -y openssh-server
RUN mkdir /var/run/sshd
# Please change password to a unique value
RUN echo 'root:Tu5ahK8w' | chpasswd
# Root login only with public key authentification (which should be the default):
# RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config
# Root login with password and public key authentication
RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
# SSH login fix. Otherwise user is kicked off after login
RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
# Add ssh public key to /root/.ssh/
ADD ./SSHKey-docker.pub /root/.ssh/authorized_keys
# Change access rights for /root/.ssh and /root/.authorized_keys
RUN chmod 0700 /root/.ssh && \
chmod 0600 /root/.ssh/authorized_keys
ENV NOTVISIBLE "in users profile"
RUN echo "export VISIBLE=now" >> /etc/profile
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
Kommando zum Erstellen:
Code: Alles auswählen
docker build -t ssh-server .
4. Konfiguration der Verbindung auf dem Client
Um sich das Leben etwas leichter zu machen, kann die Verbindung alternativ auf dem Client fest konfiguriert werden.
Dazu in .ssh/config einen Eintrag ähnlich wie dem folgenden anlegen:
Code: Alles auswählen
Host docker
HostName localhost
port 9022
User root
IdentityFile ~/.ssh/SSHKey-docker
5. Starten des Docker Containers auf dessen Volumes zugegriffen werden soll
Da der ssh Container im folgenden per --volumes-from auf die Volumes dieses Containers zugreift, muss er zwingend vor dem ssh Container gestartet werden.
6. Starten des ssh Containers
Code: Alles auswählen
docker run -d -p 9022:22 --volumes-from CONTAINER1 --name ssh-container1 ssh-server
7. Zugriff
Bei meinen Tests konnte ich damit sowohl auf der Kommandozeile per ssh, als auch mit einem SFTP Client auf den ssh Container zugreifen. Die Dateien des Containers CONTAINER1 finden sich darin am gleichen Ort, wie im Container1
8. Sonstiges
- Durch die Option --volume-from muss der SSH Container nach dem Container gestertet werden, dessen Volumes genutzt werden sollen. Alterbativ könnte man die Volumes im Container expliziert angeben, hätte dann aber einen etwas höheren Anpassungsbedarf beim Ändern der Container.
- Je nachdem, wozu man den ssh Zugang nutzen möchte, sind im ssh Container unter Umständen weitere Tools nützlich, z.B. ein Editor.
- Ein ähnliches Vorgehen könnte man z.B. auch für Backups von Daten im Container verwenden, z.B. wenn ein einfaches Kopieren nicht reicht.
Ausblick:
Bei meiner Suche habe ich auch noch eine Beschreibung gefunden, nach der die Volumes per Samba freigegeben werden. Finde ich sehr elegant, habe ich aber noch nicht zum Laufen bekommen:
https://www.guidodiepen.nl/2017/08/shar ... via-samba/
Nach einer kleinen Anpassung, weil der verwendete Samba Container inzwischen zu Alpine als Basis gewechselt ist, startet der in dem Blog vorgestellte Container zwar, aber ich kann die Freigaben nicht mounten.
Jockel