webentwicklung-frage-antwort-db.com.de

Starten Sie den Dienst mit systemctl im Docker-Container

In meiner Docker-Datei versuche ich, mehrere Dienste zu installieren, und ich möchte, dass alle beim Start des Containers automatisch gestartet werden. Einer der Dienste ist mysql. Wenn ich den Container starte, sehe ich den mysql-Dienst nicht. Wenn ich versuche, manuell zu starten, erhalte ich die Fehlermeldung: Failed to get D-Bus connection: Operation not permitted

Dockerfile:

FROM centos:7

RUN yum -y install mariadb mariadb-server

COPY start.sh start.sh

CMD ["/bin/bash", "start.sh"]

Meine start.sh-Datei: 

service mariadb start

Docker bauen:

docker build --tag="pbellamk/mariadb" .

Docker Run:

docker run -it -d --privileged=true pbellamk/mariadb bash

Ich habe das centos:systemd-Bild überprüft und das hilft auch nicht. Wie starte ich den Container, wenn die Dienste mit den Befehlen systemctl/service gestartet wurden?.

3
Premchand

Wenn Sie docker run mit bash als Befehl ausführen, wird das init-System (z. B. SystemD) nicht gestartet (auch Ihr Startskript ist nicht vorhanden, da der Befehl, den Sie übergeben, die CMD in der Docker-Datei überschreibt). Versuchen Sie, den Befehl, den Sie verwenden, in /sbin/init zu ändern, den Container im Daemon-Modus mit -d zu starten und sich dann in der Shell mit docker exec -it <container id> sh umzusehen. 

7
Dima Spivak

Docker basiert auf der Idee eines einzelnen Services/Prozesses pro Container. Zwar wird die Ausführung mehrerer Prozesse in einem Container definitiv unterstützt, und Sie werden in keiner Weise daran gehindert, dies zu tun. In einigen Fällen werden jedoch mehrere Dienste in einem Container nicht genau dem entsprechen, was Docker oder externe Tools erwarten. Dinge wie die Skalierung von Services oder die Verwendung von Docker-Schwarm zwischen Hosts unterstützen nur das Konzept eines Services pro Container. 

Mit Docker Compose können Sie mehrere Container zu einer einzigen Definition zusammenstellen. Dies bedeutet, dass Sie mehr als die vorgefertigten Standardcontainer ( httpd , mariadb ) anstelle von verwenden können Bauen Sie Ihre eigenen. Definieren Sie die Definitionskarte für Docker Swarm Dienste relativ einfach. Siehe auch Kubernetes und Marathon / Mesos , um Gruppen von Containern als Dienst zu verwalten. 

Prozessmanagement in Docker

Es ist möglich, systemd in einem Container auszuführen, erfordert jedoch --privileged Zugriff auf den Host und den /sys/fs/cgroup-Datenträger, der gemountet ist. 

Das Projekt s6-overlay bietet ein Docker-freundliches Prozessmanagementsystem mit s6

Es ist ziemlich selten, dass Sie tatsächlich SSH-Zugriff in einen Container benötigen, aber wenn dies eine harte Anforderung ist, werden Sie steckenbleiben, wenn Sie Ihre eigenen Container bauen und einen Prozessmanager verwenden.

3
Matt

Sie können es vermeiden, einen systemd-Dämon in einem Docker-Container vollständig auszuführen. Sie können sogar vermeiden, ein spezielles start.sh-Skript zu schreiben. Dies ist ein weiterer Vorteil, wenn Sie das Skript docker-systemctl-replacement verwenden.

Das Docker systemctl.py kann die normalen * .service-Dateien analysieren, um zu erfahren, wie Dienste gestartet und gestoppt werden. Sie können es als CMD eines Images registrieren. In diesem Fall werden alle systemctl-fähigen Dienste gesucht. Diese werden in der richtigen Reihenfolge gestartet und gestoppt.

Die aktuelle Testsuite enthält Testfälle für den LAMP-Stack einschließlich Centos. Daher sollte er in Ihrem Setup einwandfrei funktionieren.

1

Ich habe dieses Projekt gefunden:

https://github.com/defn/docker-systemd

dies kann verwendet werden, um ein Image basierend auf dem aktuellen Ubuntu-Image zu erstellen, jedoch mit dem Systemd- und Multiuser-Modus.

Mein Anwendungsfall ist der erste, der in der Readme-Datei erwähnt wird. Ich verwende es, um das Installationsskript meiner Anwendung zu testen, die als systemd-Dienst installiert ist. Das Installationsprogramm erstellt einen systemd-Dienst, aktiviert und startet ihn. Ich brauche CI-Tests für das Installationsprogramm. Der Test sollte das Installationsprogramm erstellen, die Anwendung auf einem Ubuntu installieren und von außen eine Verbindung zum Dienst herstellen.

Ohne systemd würde der Installer ausfallen und es wäre viel schwieriger, den Test mit Vagrant zu schreiben. Es gibt also gültige Anwendungsfälle für systemd im Docker.

0
espakm