La herramienta Docker Compose ha sido valiosa para muchas personas que han estado trabajando con contenedores. Según la documentación, Docker Compose se describe a sí mismo como:
... una herramienta para definir y ejecutar aplicaciones multicontenedor. Con Compose, utiliza un archivo YAML para configurar los servicios de su aplicación. Luego, con un solo comando, creas e inicias todos los servicios desde tu configuración.
Un desafío con Docker Compose es que el formato de archivo YAML solo funciona con el motor Docker. Si bien puede dárselo a otros usuarios de Docker para la replicación local, no pueden usarlo con otros entornos de ejecución de contenedores. Es decir, hasta ahora.
[ Tutorial relacionado:Uso de Podman y Docker Compose ]
Con Podman 3.0, Docker Compose funciona con un backend de Podman
El poder real de Podman brilla al convertir fácilmente los contenedores basados en Docker Compose en un archivo YAML de Kubernetes. Al igual que Docker Compose, Podman puede usar el archivo YAML de Kubernetes para replicar los contenedores localmente. Más importante aún, esto le permite a Podman tener un pod y un servicio orquestados que se pueden ejecutar en muchas plataformas, incluidas Kubernetes/OpenShift o minikube.
Este artículo explica el proceso de comenzar con un archivo Compose simple que ejecuta WordPress usando dos contenedores. La fuente de este archivo Compose está publicada en GitHub en el repositorio de composición impresionante de Docker. El uso exitoso de este archivo con Podman hace que la pantalla de configuración inicial de WordPress aparezca en un navegador.
Nota :en el momento de escribir este artículo, solo admitimos docker-compose
comando ejecutándose de forma root.
Iniciar el servicio del sistema de Podman
Para usar Compose, el primer paso es asegurarse de que todos los paquetes requeridos estén instalados y luego configurar el servicio del sistema Podman (3.0 o superior) usando systemd
. Después de instalar los paquetes, habilite e inicie Podman systemd
servicio activado por socket usando el siguiente comando:
$ sudo systemctl enable --now podman.socket
Verifique que el servicio se esté ejecutando presionando el punto final de ping. Este paso debe tener éxito antes de continuar.
$ sudo curl -H "Content-Type: application/json" --unix-socket /var/run/docker.sock http://localhost/_ping
OK
Ahora puede ejecutar Compose con confianza sabiendo que la API RESTful está funcionando.
Ejecutar Redactar
Como se mencionó anteriormente, el ejemplo ejecutará un archivo Compose que consta de dos contenedores para abrir una sesión de WordPress. Un contenedor ejecuta un servicio web Apache y el otro almacena los datos en una base de datos MySQL. Los dos contenedores se comunican a través de TCP/IP a través de una red dedicada a esta instancia de Compose. Para abrir los contenedores, ejecute 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 el podman ps
Comando para verificar que se hayan creado dos contenedores y que ahora se estén ejecutando. No fue necesario ningún demonio 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
$
Verificar que WordPress se esté ejecutando localmente
Las instrucciones para ejecutar WordPress indican que funciona correctamente y se puede acceder a él mediante el host local y el puerto 80.
Crear el YAML de Kubernetes
Con una instancia de trabajo de WordPress en la máquina local, comience el proceso de replicar estos contenedores en una plataforma Kubernetes. Podman puede generar YAML basado en Kubernetes a partir de contenedores en ejecución.
[ También le gustaría leer: Comience a aprender Kubernetes desde su máquina local]
¿Un pod o varios pods?
Existen dos enfoques para crear el YAML que usará en el entorno de Kubernetes:coloque dos contenedores en un solo pod con un servicio o cree dos pods, con un contenedor en cada uno y un servicio para exponer el front-end de Apache. Determinar cuál es el mejor enfoque puede requerir algo de ensayo y error.
Una consideración que puede dictar qué enfoque utilizar es cómo se comunicarán los contenedores o módulos. Cuando Compose creó estos contenedores, realizó una serie de pasos para garantizar que los dos contenedores pudieran comunicarse entre sí mediante nombres DNS. De hecho, Compose configura alias en los contenedores que se reconocen como nombres DNS al resolver los contenedores por nombre. Al colocar los contenedores dentro del mismo pod, no hay necesidad de resolución de nombres entre ellos porque comparten un espacio de nombres de red. Por lo tanto, simplemente pueden usar localhost para comunicarse entre sí.
Colocar los contenedores en diferentes pods de Kubernetes brinda una mayor flexibilidad, pero los contenedores deberán comunicarse entre sí mediante algún otro mecanismo.
Generar el YAML
Debe conocer los nombres o ID de los contenedores para comenzar a crear el YAML de Kubernetes. Decida si Podman debe generar una descripción de servicio para Kubernetes. En este caso, exponga la interfaz de Apache para que pueda interactuar con WordPress usando el navegador. Usa el podman generate kube
comando para crear archivos YAML.
$ sudo podman generate kube -s -f wordpress.yaml a089a40bb9ae 510c028c273f
El -s
en el comando anterior significa que Podman generará servicio para este pod. El -f
La opción nos permite guardar el YAML generado en un archivo. De lo contrario, la salida se envía a stdout , donde se puede redirigir a un archivo.
$ 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: {}
Para que el contenedor de Apache se comunique con el contenedor de MySQL, el autor del archivo Compose ha optado por utilizar una variable de entorno llamada WORDPRESS_DB_HOST para indicar el nombre de host del contenedor MySQL. Antes de ejecutar esto en un entorno de Kubernetes, cambie el valor de WORDPRESS_DB_HOST al nombre del contenedor MySQL (kindhermann en este ejemplo) o 127.0.0.1 (los contenedores dentro del mismo pod pueden comunicarse entre sí a través de localhost).
...
- name: WORDPRESS_DB_HOST
value: kindhermann OR 127.0.0.1
---
Barra lateral:
Cuando Compose realiza una compilación
En muchos ejemplos de Compose, el autor elige construir su imagen de contenedor. Esto generalmente se debe a que requieren paquetes adicionales o desean realizar algún nivel de personalización en la imagen. Cuando esto ocurra, habrá una nueva imagen adicional en el almacén de imágenes de Podman. La elección de ejecutar el YAML de Kubernetes generado podría fallar porque hace referencia a una imagen de contenedor que solo está presente en la tienda local.
Para remediar esto, use podman push
para mover estas nuevas imágenes a un registro global como quay.io o a un registro específico de Kubernetes para que Kubernetes pueda extraer estas imágenes. Asegúrese de que el nombre de la imagen en el archivo YAML resultante sea el mismo que el de la imagen enviada.
Kubernetes
El siguiente paso para continuar con este ejemplo y aplicarlo a un entorno de Kubernetes mostrará cómo ejecutar este ejemplo tanto en minikube como en OpenShift. No hay nada específico en YAML que impida que los pods se ejecuten en otro entorno de Kubernetes, por lo que, en teoría, debería funcionar con otras versiones de Kubernetes.
Este artículo asume la existencia de un entorno minikube y/o OpenShift. Está fuera del alcance de este artículo documentar la configuración de un entorno minikube u OpenShift Kubernetes.
minicubo
El primer paso para implementar en minikube es simplemente crear el pod.
$ minikube kubectl -- create -f wordpress.yaml
pod/kindhermann created
service/kindhermann created
Después de esperar unos segundos, verifique el estado de la cápsula y los contenedores. Según la velocidad y el ancho de banda de la red, es posible que el pod ya esté disponible. Verifique el estado del pod usando kubectl get pods
.
$ minikube kubectl -- get pods
NAME READY STATUS RESTARTS AGE
kindhermann 2/2 Running 0 28
Ahora que ambos contenedores están listos, pruebe la disponibilidad de la sesión de WordPress. Primero, obtenga la dirección IP del pod en Kubernetes usando kubectl
.
$ minikube kubectl -- describe pods | grep Node:
Node: minikube/192.168.39.7
Dirija el navegador de su elección a la dirección IP del pod y vea la pantalla de configuración de WordPress.
Desplazamiento abierto
Para este artículo, un clúster de OpenShift se ejecuta en GCP.
Usa el wordpress.yaml
generado para crear el pod y el servicio. Si usa un entorno Kubernetes estándar, reemplace oc
con kubectl
en los siguientes comandos.
$ oc create -f wordpress.yaml
pod/kindhermann created
service/kindhermann created
Espere unos segundos hasta que aparezcan el pod y el servicio. El kindhermann pod está en En ejecución estado con ambos contenedores en funcionamiento. El kindhermann El servicio también está disponible con una IP de clúster asignada.
$ 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
Ver el pod y el servicio en la consola.
Para acceder al servicio desde fuera del clúster, expóngalo, lo que creará una ruta.
$ 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
Exponer el servicio creó la ruta de host/puerto que se muestra arriba y accedió a ese punto final. Vea la página de configuración de la aplicación de WordPress que se ejecuta en el clúster de OpenShift o Kubernetes.
Examine la ruta en la consola y acceda directamente al punto final desde allí también.
[ Obtenga este libro electrónico gratuito:Administrar sus clústeres de Kubernetes para principiantes. ]
Resumir
Como puede ver, mover las configuraciones de la carga de trabajo de los entornos de Docker Compose a Kubernetes es sencillo con Podman 3.0. Podman no solo brinda la flexibilidad de Docker Compose al desarrollar aplicaciones, sino que también facilita el cambio a Kubernetes cuando las aplicaciones están listas para las grandes ligas. Hace todo esto usando el podman generate kube
dominio. Pruébelo usted mismo en tres sencillos pasos.