Das Docker Compose-Tool war für viele Menschen, die mit Containern gearbeitet haben, wertvoll. Laut Dokumentation beschreibt sich Docker Compose selbst als:
... ein Tool zum Definieren und Ausführen von Multi-Container-Anwendungen. Mit Compose verwenden Sie eine YAML-Datei, um die Dienste Ihrer Anwendung zu konfigurieren. Dann erstellen und starten Sie mit einem einzigen Befehl alle Dienste aus Ihrer Konfiguration.
Eine Herausforderung bei Docker Compose besteht darin, dass das YAML-Dateiformat nur mit der Docker-Engine funktioniert. Während Sie es anderen Docker-Benutzern für die lokale Replikation geben können, können sie es nicht mit anderen Container-Laufzeiten verwenden. Das heißt, bis jetzt.
[ Zugehöriges Tutorial:Podman und Docker Compose verwenden ]
Bei Podman 3.0 arbeitet Docker Compose mit einem Podman-Backend
Die wahre Stärke von Podman zeigt sich durch die einfache Konvertierung der Container auf Basis von Docker Compose in eine Kubernetes-YAML-Datei. Wie Docker Compose kann Podman die Kubernetes-YAML-Datei verwenden, um die Container lokal zu replizieren. Noch wichtiger ist, dass Podman dadurch einen orchestrierten Pod und Dienst hat, der auf vielen Plattformen ausgeführt werden kann, einschließlich Kubernetes/OpenShift oder Minikube.
Dieser Artikel erklärt, wie man mit einer einfachen Compose-Datei beginnt, die WordPress mit zwei Containern ausführt. Die Quelle für diese Compose-Datei wird auf GitHub im awesome-compose-Repository von Docker veröffentlicht. Die erfolgreiche Verwendung dieser Datei mit Podman führt dazu, dass der WordPress-Ersteinrichtungsbildschirm in einem Browser erscheint.
Hinweis :Zum Zeitpunkt der Erstellung dieses Artikels unterstützen wir nur docker-compose
Befehl wird als Root ausgeführt.
Systemdienst von Podman starten
Um Compose zu verwenden, müssen Sie zunächst sicherstellen, dass alle erforderlichen Pakete installiert sind, und dann den Systemdienst Podman (3.0 oder höher) mit systemd
einrichten . Aktivieren und starten Sie nach der Installation der Pakete den Podman systemd
Socket-aktivierter Dienst mit dem folgenden Befehl:
$ sudo systemctl enable --now podman.socket
Überprüfen Sie, ob der Dienst ausgeführt wird, indem Sie auf den Ping-Endpunkt klicken. Dieser Schritt muss erfolgreich sein, bevor Sie fortfahren.
$ sudo curl -H "Content-Type: application/json" --unix-socket /var/run/docker.sock http://localhost/_ping
OK
Sie können Compose jetzt sicher ausführen, da Sie wissen, dass die RESTful-API funktioniert.
Verfassen ausführen
Wie bereits erwähnt, führt das Beispiel eine Compose-Datei aus, die aus zwei Containern besteht, um eine WordPress-Sitzung aufzurufen. Ein Container führt einen Apache-Webdienst aus, der andere speichert die Daten in einer MySQL-Datenbank. Die beiden Container kommunizieren über TCP/IP über ein Netzwerk, das dieser Compose-Instanz zugeordnet ist. Führen Sie zum Aufrufen der Container docker-compose up
aus .
$ sudo docker-compose up -d
Creating network "wordpress-mysql_default" with the default driver
Creating volume "wordpress-mysql_db_data" with default driver
Pulling db (mysql:8.0.19)...
0c27e8e5fcfab7805cfed996b55e5e98f43fd7ee76e1516f20cba139c6a299c5: pulling image () from docker.io/library/mysql:8.0.19
Pulling wordpress (wordpress:latest)...
0d35c2300ec845fda141ba012f7c6dccde8f0ae106b8f4bb0fcfced69380f851: pulling image () from docker.io/library/wordpress:latest
Creating wordpress-mysql_db_1 ... done
Creating wordpress-mysql_wordpress_1 ... done
Verwenden Sie das podman ps
Befehl, um zu überprüfen, ob zwei Container erstellt wurden und jetzt ausgeführt werden. Es war kein Docker-Daemon erforderlich.
$ sudo podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a089a40bb9ae docker.io/library/mysql:8.0.19 --default-authent... 15 seconds ago Up 15 seconds ago kind_hermann
510c028c273f docker.io/library/wordpress:latest apache2-foregroun... 15 seconds ago Up 15 seconds ago 0.0.0.0:80->80/tcp competent_kilby
$
Stellen Sie sicher, dass WordPress lokal ausgeführt wird
Die Anweisungen zum Ausführen von WordPress weisen darauf hin, dass es ordnungsgemäß funktioniert und über localhost und Port 80 darauf zugegriffen werden kann.

Erstellen Sie die Kubernetes-YAML
Beginnen Sie mit einer funktionierenden WordPress-Instanz auf dem lokalen Computer mit dem Replizieren dieser Container auf einer Kubernetes-Plattform. Podman kann Kubernetes-basiertes YAML aus laufenden Containern generieren.
[Vielleicht möchten Sie auch lesen: Lernen Sie Kubernetes von Ihrem lokalen Computer aus]
Ein Pod oder mehrere Pods?
Es gibt zwei Ansätze zum Erstellen der YAML, die Sie in der Kubernetes-Umgebung verwenden werden:Entweder zwei Container in einem einzelnen Pod mit einem Dienst platzieren oder zwei Pods mit jeweils einem Container und einem Dienst erstellen, um das Apache-Front-End verfügbar zu machen. Um festzustellen, welcher Ansatz der beste ist, kann einiges an Versuch und Irrtum erforderlich sein.
Eine Überlegung, die den zu verwendenden Ansatz bestimmen kann, ist die Art und Weise, wie die Container oder Pods kommunizieren. Als Compose diese Container erstellte, durchlief es eine Reihe von Schritten, um sicherzustellen, dass die beiden Container über DNS-Namen miteinander kommunizieren konnten. Tatsächlich richtet Compose Aliase für die Container ein, die beim Auflösen von Containern nach Namen als DNS-Namen erkannt werden. Indem die Container in denselben Pod gestellt werden, ist keine Namensauflösung zwischen ihnen erforderlich, da sie sich einen Netzwerk-Namespace teilen. Daher können sie einfach localhost verwenden miteinander zu kommunizieren.
Das Platzieren der Container in verschiedenen Kubernetes-Pods bietet mehr Flexibilität, aber die Container müssen über einen anderen Mechanismus miteinander kommunizieren.
Generieren Sie die YAML-Datei
Sie müssen die Containernamen oder -IDs kennen, um mit der Erstellung der Kubernetes-YAML zu beginnen. Entscheiden Sie, ob Podman eine Dienstbeschreibung für Kubernetes generieren soll. Stellen Sie in diesem Fall das Apache-Frontend bereit, damit es über den Browser mit WordPress interagieren kann. Verwenden Sie den podman generate kube
Befehl zum Erstellen von YAML-Dateien.
$ sudo podman generate kube -s -f wordpress.yaml a089a40bb9ae 510c028c273f
Das -s
im vorherigen Befehl bedeutet, dass Podman einen Dienst für diesen Pod generiert. Das -f
Option ermöglicht es uns, die generierte YAML in einer Datei zu speichern. Andernfalls wird die Ausgabe an stdout gesendet , wo es in eine Datei umgeleitet werden kann.
$ cat wordpress.yaml
# Save the output of this file and use kubectl create -f to import
# it into Kubernetes.
#
# Created with podman-3.0.0-dev
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2020-12-03T22:30:07Z"
labels:
app: kindhermann
name: kindhermann
spec:
containers:
- command:
- docker-entrypoint.sh
- --default-authentication-plugin=mysql_native_password
env:
- name: PATH
value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
...
workingDir: /
- command:
- docker-entrypoint.sh
- apache2-foreground
env:
- name: PATH
value: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
...
- name: WORDPRESS_DB_HOST
value: kindhermann
- name: WORDPRESS_DB_PASSWORD
value: db
- name: APACHE_ENVVARS
value: /etc/apache2/envvars
...
image: docker.io/library/wordpress:latest
name: competentkilby
ports:
- containerPort: 80
hostPort: 80
protocol: TCP
resources: {}
securityContext:
allowPrivilegeEscalation: true
capabilities:
drop:
- CAP_MKNOD
- CAP_NET_RAW
privileged: false
readOnlyRootFilesystem: false
seLinuxOptions: {}
workingDir: /var/www/html
status: {}
---
apiVersion: v1
kind: Service
metadata:
creationTimestamp: "2020-12-03T22:30:07Z"
labels:
app: kindhermann
name: kindhermann
spec:
ports:
- name: "80"
nodePort: 30579
port: 80
protocol: TCP
targetPort: 0
selector:
app: kindhermann
type: NodePort
status:
loadBalancer: {}
Damit der Apache-Container mit dem MySQL-Container kommunizieren kann, hat sich der Autor der Compose-Datei dafür entschieden, eine Umgebungsvariable namens WORDPRESS_DB_HOST zu verwenden um den Hostnamen des MySQL-Containers anzugeben. Bevor Sie dies in einer Kubernetes-Umgebung ausführen, ändern Sie den Wert von WORDPRESS_DB_HOST zum MySQL-Containernamen (kindhermann in diesem Beispiel) oder 127.0.0.1 (Container innerhalb desselben Pods können über localhost miteinander kommunizieren).
...
- name: WORDPRESS_DB_HOST
value: kindhermann OR 127.0.0.1
---
Seitenleiste:
Wenn Compose einen Build durchführt
In vielen Compose-Beispielen entscheidet sich der Autor dafür, sein Container-Image zu erstellen. Dies liegt normalerweise daran, dass sie zusätzliche Pakete benötigen oder ein gewisses Maß an Anpassungen im Image vornehmen möchten. In diesem Fall wird ein zusätzliches neues Bild im Bildspeicher von Podman vorhanden sein. Die Entscheidung, die ausgegebene Kubernetes-YAML auszuführen, schlägt möglicherweise fehl, da sie auf ein Container-Image verweist, das nur im lokalen Speicher vorhanden ist.
Um dies zu beheben, verwenden Sie podman push
um diese neuen Images entweder in eine globale Registry wie quay.io oder eine Kubernetes-spezifische Registry zu verschieben, damit Kubernetes diese Images abrufen kann. Stellen Sie sicher, dass der Bildname in der resultierenden YAML-Datei mit dem übertragenen Bild übereinstimmt.
Kubernetes
Der nächste Schritt bei der Weiterführung dieses Beispiels und seiner Anwendung auf eine Kubernetes-Umgebung zeigt, wie dieses Beispiel sowohl auf Minikube als auch auf OpenShift ausgeführt wird. Es gibt nichts Spezifisches in YAML, das verhindert, dass die Pods in einer anderen Kubernetes-Umgebung ausgeführt werden, daher sollte es theoretisch mit anderen Kubernetes-Varianten funktionieren.
Dieser Artikel geht davon aus, dass eine Minikube- und/oder OpenShift-Umgebung vorhanden ist. In diesem Artikel wird die Einrichtung einer Minikube- oder OpenShift-Kubernetes-Umgebung nicht dokumentiert.
Minikube
Der erste Schritt zur Bereitstellung auf Minikube besteht einfach darin, den Pod zu erstellen.
$ minikube kubectl -- create -f wordpress.yaml
pod/kindhermann created
service/kindhermann created
Nachdem Sie einige Sekunden gewartet haben, überprüfen Sie den Status des Pods und der Container. Je nach Geschwindigkeit und Netzwerkbandbreite ist der Pod möglicherweise bereits verfügbar. Überprüfen Sie den Status des Pods mit kubectl get pods
.
$ minikube kubectl -- get pods
NAME READY STATUS RESTARTS AGE
kindhermann 2/2 Running 0 28
Nachdem beide Container bereit sind, testen Sie die Verfügbarkeit der WordPress-Sitzung. Rufen Sie zuerst die IP-Adresse des Pods in Kubernetes mit kubectl
ab .
$ minikube kubectl -- describe pods | grep Node:
Node: minikube/192.168.39.7
Richten Sie Ihren bevorzugten Browser auf die IP-Adresse des Pods und sehen Sie sich den WordPress-Einrichtungsbildschirm an.

OpenShift
Für diesen Artikel wird ein OpenShift-Cluster auf der GCP ausgeführt.
Verwenden Sie die generierte wordpress.yaml
um den Pod und den Dienst zu erstellen. Wenn Sie eine Vanilla-Kubernetes-Umgebung verwenden, ersetzen Sie oc
mit kubectl
in den folgenden Befehlen.
$ oc create -f wordpress.yaml
pod/kindhermann created
service/kindhermann created
Warten Sie einige Sekunden, bis der Pod und der Dienst angezeigt werden. Der kindhermann Pod befindet sich in Running Status mit beiden Containern und läuft. Der kindhermann Der Dienst ist auch mit einer ihm zugewiesenen Cluster-IP verfügbar.
$ oc get pods
NAME READY STATUS RESTARTS AGE
kindhermann 2/2 Running 0 39s
$ oc get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kindhermann NodePort 172.30.103.100 <none> 80:30579/TCP 45s
Kubernetes ClusterIP 172.30.0.1 <none> 443/TCP 44m
openshift ExternalName <none> Kubernetes.default.svc.cluster.local <none> 36m
Zeigen Sie den Pod und den Dienst in der Konsole an.


Um von außerhalb des Clusters auf den Dienst zuzugreifen, stellen Sie ihn bereit, wodurch eine Route erstellt wird.
$ oc expose svc/kindhermann
route.route.openshift.io/kindhermann exposed
$ oc/kubectl get routes
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
kindhermann kindhermann-default.apps.ci-ln-d3gw292-f76d1.origin-ci-int-gce.dev.openshift.com kindhermann 80 None
Durch das Verfügbarmachen des Dienstes wurde die oben gezeigte Host-/Port-Route erstellt und auf diesen Endpunkt zugegriffen. Zeigen Sie die Einrichtungsseite der WordPress-Anwendung an, die im OpenShift- oder Kubernetes-Cluster ausgeführt wird.

Untersuchen Sie die Route in der Konsole und greifen Sie von dort auch direkt auf den Endpunkt zu.

[ Holen Sie sich dieses kostenlose E-Book:Verwalten Ihrer Kubernetes-Cluster für Dummies. ]
Abschluss
Wie Sie sehen können, ist das Verschieben von Workload-Konfigurationen von Docker Compose-Umgebungen nach Kubernetes mit Podman 3.0 unkompliziert. Podman bietet nicht nur die Flexibilität von Docker Compose bei der Entwicklung von Anwendungen, sondern erleichtert auch den Wechsel zu Kubernetes, wenn Anwendungen für die großen Ligen bereit sind. All dies geschieht mithilfe des podman generate kube
Befehl. Probieren Sie es in drei einfachen Schritten selbst aus.