Im Beitrage „Ubuntu Docker Container mit SSH-Zugriff manuell aufsetzen“ haben wir einen Docker Container aufgesetzt auf dem Ubuntu läuft und auf den wir mittels SSH zugreifen können. Hier wollen wir einen gleichen Container aufsetzen, aber nicht manuell, sondern automatisierbar. Dafür spezifizieren wir alle manuellen Befehle in einem Dockerfile mit welchem ein eigenes Image erstellt wird, wenn wir den Docker Container mittels Docker-Compose aufsetzen wollen. Das dauert zwar die ein oder andere Minute, aber nachdem das eigene Image erstellt ist, können wir diesen vorkonfigurierten Ubuntu Container in gewohnter Weise innerhalb von Sekunden aufsetzen. Auf geht’s!
Docker-Compose Datei erstellen
Um den gleichen Ubuntu Container nun nicht manuell aufzusetzen, benötigen wir zunächst eine Docker-Compose Datei im yml-Format. In der spezifizieren wir, dass wir ein Image selbst nach unseren Vorschriften aus dem Dockerfile aufbauen wollen. Um die Docker-Compose Datei zu erstellen, erstellen wir uns einen Projektordner und in diesem erzeugen wir die Datei mittels
touch docker-compose.ymlCode-Sprache: Bash (bash)
Dann öffnen wir sie mittels Nano
nano docker-compose.ymlCode-Sprache: Bash (bash)
Und fügen in sie
version: "3.7"
services:
ubuntu_ssh:
container_name: mycontainer_ubuntu
build:
context: .
dockerfile: Dockerfile
restart: unless-stopped
ports:
- "2021:2001"
volumes:
- /home/user/mycontainter_ubuntu/ssh_data:/etc/ssh
- /home/user/mycontainter_ubuntu/other_data:/homeCode-Sprache: YAML (yaml)
ein. Oben spezifizieren wir die Docker Version, mit der die Docker-Compose Datei ausgeführt werden soll. Dann definieren wir einen Dienst (ubuntu_ssh) und bestimmen bereits hier, wie der Docker Container am Ende heißen soll (mycontainer_ubuntu).
Mit „build“ spezifizieren wir, dass wir kein vorgefertigtes Image verwenden wollen, sondern eins nach dem Inhalt des Dockerfiles erstellen.
Der Docker Container soll immer wieder erneut gestartet werden (wenn er abstürzt o.ä.), bis wir ihn manuell stoppen.
Mit den Ports öffnen wir Port 2001 des Docker Containers auf Port 2021. Das heißt, wir können den Container dann mittels SSH über Port 2021 erreichen. Da der Default Port aber 22 ist, müssen wir im Dockerfile noch angeben, wie wir die Ports gerne geändert hätten.
Mit den Laufwerken (volumes) verbinden wir Speicherplatz außerhalb des Docker Containers mit den Inhalten, die im Docker Container erzeugt und verändert werden. Dadurch gehen Daten nicht verloren, wenn der Docker Container gestoppt und neu gestartet wird. Diese Spezifikation der Laufwerke haben wir bei der manuellen Installation z.B. nicht unternommen, sodass alle Daten immer dann verloren gehen, wenn der Container gestoppt wird.
Dockerfile erstellen
Wir erzeugen eine Dockerfile-Datei mit
touch DockerfileCode-Sprache: Bash (bash)
die wir dann mit Nano öffnen und bearbeiten können
nano DockerfileCode-Sprache: Bash (bash)
Hier fügen wir folgende Zeilen ein
FROM ubuntu
RUN apt-get update \
&& apt-get upgrade -y \
&& apt-get install -y nano \
&& apt-get install -y openssh-server \
&& mkdir /var/run/sshd \
&& echo 'root:password' | chpasswd \
&& sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config \
&& sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config \
&& echo "Port 2001" >> /etc/ssh/sshd_config
CMD ["/usr/sbin/sshd", "-D"]Code-Sprache: Dockerfile (dockerfile)
Mit „FROM“ spezifizieren wird das zu verwendende Image (ubuntu) auf welchem unser Image beruhen soll.
Mit „RUN“ geben wir dem Container dann Befehle mit, die automatisch ausgeführt werden sollen. Hier ist das ein update der apt-Paketverwaltung und ein Upgrade der Pakete, gefolgt von der Installation des SSH-Dienstes und den Anpassungen in der SSH-Konfigurationsdatei. Das Root-Passwort wird auf „password“ gesetzt und der Port wird von 22 auf 2001 gesetzt.
Der „CMD“ Befehl in einem Dockerfile spezifiziert welcher Befehl beim Starten des Docker Containers aufgeführt werden soll. Hier wird gesagt, dass der SSH-Dienst gestartet werden soll und dass der SSH-Dienst im Vordergrund steht, was bedeutet, dass der Docker Container nicht geschlossen wird, solange der SSH-Dienst läuft.
Docker Container starten
Nun können wir den Ubuntu Docker Container mit dem „docker-compose“ Befehl starten
docker-compose -p mycontainer_ubuntu up -dCode-Sprache: Bash (bash)
Wir sollten uns dabei allerdings in dem Verzeichnis befinden, in dem auch die docker-compose.yml befindet, da docker-compose automatisch nach dieser Datei suchen wird.
Der Zusatzbefehl „-p“ bedeutet, dass wir einen Projektnamen vergeben wollen (mycontainer_ubuntu). „Up“ bedeutet, dass wir den Docker Container nach docker-compose.yml starten wollen und „-d“ heißt, dass der Container im Hintergrund gestartet wird, sodass wir die Kommandozeile weiterverwenden können, ohne auf das Schließen des Containers warten zu müssen.
Wir dieser Befehl das erste mal ausgeführt, wird zuerst ein Image erstellt was ein paar Minuten dauert. Dabei werden die Befehle im Dockerfile ausgeführt bevor von dem Container ein Image erstellt wird. Das bedeutet, dass beim nächsten Mal, wenn dieser Ubuntu Docker Container erzeugt wird, das Aufsetzen nur noch Sekunden dauert und dass dann SSH und Nano direkt installiert sind.
