Lo strumento Docker Compose è stato prezioso per molte persone che hanno lavorato con i container. Secondo la documentazione, Docker Compose si descrive come:
... uno strumento per la definizione e l'esecuzione di applicazioni multi-container. Con Compose, utilizzi un file YAML per configurare i servizi della tua applicazione. Quindi, con un solo comando, crei e avvii tutti i servizi dalla tua configurazione.
Una sfida con Docker Compose è che il formato di file YAML funziona solo con il motore Docker. Sebbene tu possa fornirlo ad altri utenti Docker per la replica locale, non possono usarlo con altri runtime del contenitore. Cioè, fino ad ora.
[ Tutorial correlato:Utilizzo di Podman e Docker Compose ]
Con Podman 3.0, Docker Compose funziona con un backend Podman
Il vero potere di Podman traspare facilmente convertendo i contenitori basati su Docker Compose in un file YAML Kubernetes. Come Docker Compose, Podman può utilizzare il file YAML di Kubernetes per replicare i contenitori in locale. Ancora più importante, ciò consente a Podman di avere un pod e un servizio orchestrati che possono essere eseguiti su molte piattaforme, inclusi Kubernetes/OpenShift o minikube.
Questo articolo spiega il processo di avvio con un semplice file Compose che esegue WordPress utilizzando due contenitori. L'origine di questo file Compose è pubblicata su GitHub nel repository Awesome-Compose di Docker. L'uso corretto di questo file con Podman fa sì che la schermata di configurazione iniziale di WordPress venga visualizzata in un browser.
Nota :Al momento della stesura di questo documento, supportiamo solo docker-compose
comando eseguito alla radice.
Avvia il servizio di sistema di Podman
Per utilizzare Compose, il primo passaggio è assicurarsi che tutti i pacchetti richiesti siano installati e quindi configurare il servizio di sistema Podman (3.0 o successivo) utilizzando systemd
. Dopo aver installato i pacchetti, abilita e avvia Podman systemd
servizio socket-activated utilizzando il seguente comando:
$ sudo systemctl enable --now podman.socket
Verifica che il servizio sia in esecuzione colpendo l'endpoint ping. Questo passaggio deve avere esito positivo prima di procedere ulteriormente.
$ sudo curl -H "Content-Type: application/json" --unix-socket /var/run/docker.sock http://localhost/_ping
OK
Ora puoi eseguire Compose con sicurezza sapendo che l'API RESTful funziona.
Esegui Componi
Come accennato in precedenza, l'esempio eseguirà un file Compose composto da due contenitori per visualizzare una sessione di WordPress. Un container esegue un servizio Web Apache e l'altro archivia i dati in un database MySQL. I due contenitori comunicano tramite TCP/IP su una rete dedicata a questa istanza di Compose. Per visualizzare i contenitori, esegui docker-compose up
.
$ 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
Usa il podman ps
comando per verificare che due contenitori siano stati creati e siano ora in esecuzione. Non era necessario alcun demone Docker.
$ 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
$
Verifica che WordPress sia in esecuzione in locale
Le istruzioni per l'esecuzione di WordPress indicano che funziona correttamente ed è possibile accedervi utilizzando localhost e la porta 80.
Crea il Kubernetes YAML
Con un'istanza funzionante di WordPress sul computer locale, inizia il processo di replica di questi contenitori su una piattaforma Kubernetes. Podman può generare YAML basato su Kubernetes dai contenitori in esecuzione.
[ Potresti anche leggere: Inizia ad imparare Kubernetes dalla tua macchina locale ]
Un pod o più pod?
Esistono due approcci per la creazione di YAML che utilizzerai nell'ambiente Kubernetes:inserire due contenitori in un unico pod con un servizio o creare due pod, con un contenitore ciascuno, e un servizio per esporre il front-end Apache. La determinazione dell'approccio migliore potrebbe richiedere alcuni tentativi ed errori.
Una considerazione che può determinare quale approccio utilizzare è il modo in cui i contenitori o i pod comunicheranno. Quando Compose ha creato questi contenitori, ha eseguito una serie di passaggi per garantire che i due contenitori potessero comunicare tra loro utilizzando nomi DNS. In effetti, Compose imposta alias sui contenitori che vengono riconosciuti come nomi DNS durante la risoluzione dei contenitori in base al nome. Inserendo i contenitori all'interno dello stesso pod, non è necessaria la risoluzione dei nomi tra di loro perché condividono uno spazio dei nomi di rete. Pertanto, possono semplicemente utilizzare localhost per comunicare tra loro.
Posizionare i contenitori in diversi pod Kubernetes offre una maggiore flessibilità, ma i contenitori dovranno comunicare tra loro utilizzando un altro meccanismo.
Genera lo YAML
Devi conoscere i nomi o gli ID dei contenitori per iniziare a creare il Kubernetes YAML. Decidi se Podman deve generare una descrizione del servizio per Kubernetes. In questo caso, esponi il front-end di Apache in modo che possa interagire con WordPress utilizzando il browser. Usa il podman generate kube
comando per creare file YAML.
$ sudo podman generate kube -s -f wordpress.yaml a089a40bb9ae 510c028c273f
Il -s
nel comando precedente significa che Podman genererà il servizio per questo pod. Il -f
l'opzione ci consente di salvare lo YAML generato in un file. In caso contrario, l'output viene inviato a stdout , dove può essere reindirizzato a un file.
$ 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: {}
Affinché il container Apache comunichi con il container MySQL, l'autore del file Compose ha scelto di utilizzare una variabile di ambiente denominata WORDPRESS_DB_HOST per indicare il nome host del contenitore MySQL. Prima di eseguirlo in un ambiente Kubernetes, modifica il valore di WORDPRESS_DB_HOST al nome del contenitore MySQL (kindhermann in questo esempio) o 127.0.0.1 (i contenitori all'interno dello stesso pod possono comunicare tra loro tramite localhost).
...
- name: WORDPRESS_DB_HOST
value: kindhermann OR 127.0.0.1
---
Barra laterale:
Quando Compose esegue una build
In molti esempi di Compose, l'autore sceglie di costruire la propria immagine contenitore. Questo di solito è perché richiedono pacchetti aggiuntivi o vogliono eseguire un certo livello di personalizzazione nell'immagine. Quando ciò si verifica, ci sarà una nuova immagine aggiuntiva nell'archivio immagini di Podman. La scelta di eseguire il Kubernetes YAML generato potrebbe non riuscire perché fa riferimento a un'immagine del contenitore che è presente solo nell'archivio locale.
Per rimediare, usa podman push
per spostare queste nuove immagini in un registro globale come quay.io o in un registro specifico di Kubernetes in modo che Kubernetes possa estrarre queste immagini. Assicurati che il nome dell'immagine nel file YAML risultante sia lo stesso dell'immagine di cui è stato eseguito il push.
Kubernetes
Il passaggio successivo per portare avanti questo esempio e applicarlo a un ambiente Kubernetes mostrerà come eseguire questo esempio sia su minikube che su OpenShift. Non c'è nulla di specifico in YAML che impedisca ai pod di funzionare in un altro ambiente Kubernetes, quindi teoricamente dovrebbe funzionare con altre versioni di Kubernetes.
Questo articolo presuppone l'esistenza di un ambiente minikube e/o OpenShift. Non rientra nell'ambito di questo articolo documentare la configurazione di un ambiente minikube o OpenShift Kubernetes.
minikube
Il primo passaggio per l'implementazione su minikube è semplicemente creare il pod.
$ minikube kubectl -- create -f wordpress.yaml
pod/kindhermann created
service/kindhermann created
Dopo aver atteso qualche secondo, controlla lo stato del pod e dei container. A seconda della velocità e della larghezza di banda della rete, il pod potrebbe essere già disponibile. Controlla lo stato del pod usando kubectl get pods
.
$ minikube kubectl -- get pods
NAME READY STATUS RESTARTS AGE
kindhermann 2/2 Running 0 28
Ora che entrambi i container sono pronti, verifica la disponibilità della sessione di WordPress. Innanzitutto, ottieni l'indirizzo IP del pod in Kubernetes utilizzando kubectl
.
$ minikube kubectl -- describe pods | grep Node:
Node: minikube/192.168.39.7
Punta il tuo browser preferito all'indirizzo IP del pod e guarda la schermata di configurazione di WordPress.
OpenShift
Per questo articolo, un cluster OpenShift è in esecuzione su GCP.
Usa il wordpress.yaml
generato per creare il pod e il servizio. Se utilizzi un ambiente Kubernetes vanilla, sostituisci oc
con kubectl
nei seguenti comandi.
$ oc create -f wordpress.yaml
pod/kindhermann created
service/kindhermann created
Attendi qualche secondo per l'avvio del pod e del servizio. Il gentiluomo pod è in In esecuzione stato con entrambi i contenitori attivi e in esecuzione. Il gentiluomo il servizio è disponibile anche con un IP del cluster assegnato.
$ 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
Visualizza il pod e il servizio nella console.
Per accedere al servizio dall'esterno del cluster, esporlo, che creerà un percorso.
$ 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
L'esposizione del servizio ha creato la route host/porta mostrata sopra e l'accesso a tale endpoint. Visualizza la pagina di configurazione dell'applicazione WordPress in esecuzione nel cluster OpenShift o Kubernetes.
Esamina il percorso nella console e accedi direttamente all'endpoint anche da lì.
[ Ottieni questo ebook gratuito:Gestione dei cluster Kubernetes per i manichini. ]
Concludi
Come puoi vedere, lo spostamento delle configurazioni del carico di lavoro dagli ambienti Docker Compose a Kubernetes è semplice con Podman 3.0. Podman non solo offre la flessibilità di Docker Compose durante lo sviluppo di applicazioni, ma semplifica anche il passaggio a Kubernetes quando le applicazioni sono pronte per i grandi campionati. Fa tutto questo usando il podman generate kube
comando. Provalo tu stesso in tre semplici passaggi.