Cómo ejecutar un contenedor Docker multiproceso
Sin embargo, en muchos casos necesitamos ejecutar múltiples procesos en un contenedor Docker. Por ejemplo, en el proyecto "Ejecutar Kubernetes utilizando un único contenedor Docker", los distintos componentes de Kubernetes se ejecutan en el mismo contenedor y se ejecutan varios procesos en ese contenedor. Entonces, ¿cómo se ejecuta un contenedor Docker multiproceso?
Una forma es utilizar un script de shell, otra forma es utilizar la herramienta de gestión de procesos Supervisor. kiwenlau/kubernetes-shell y kiwenlau/kubernetes-supervisor utilizan respectivamente estos dos métodos para iniciar múltiples procesos para ejecutar componentes de Kubernetes, "ejecutando Kubernetes usando un único contenedor Docker". A continuación presentaré estos dos métodos diferentes.
Uso de un script de shell para ejecutar un contenedor Docker multiproceso
Este enfoque debería resultarle familiar porque utiliza un script de shell para iniciar cada componente de Kubernetes por turno. ¡Lo siguiente es start-kubernetes.sh
! /bin/bashstart docker daemondocker daemon > /var/log/docker.log 2>&1 & start etcdetcd --data-dir=/var/etcd/data > /var/log/ etcd.log 2>&1 & esperar ectd para configurar el sueño 5 iniciar apiserverkube-apiserver --service-cluster-ip-range=10.0.0.1/24 --insecure-bind-address=0.0.0.0 --etcd_servers=mand=etcd --data-dir=/var/etcd /data autoresart=true stdout_logfile=/var/log/etcd.stdout.log stderr_ logfile=/var/log/etcd.stderr.log [programa:kube-apiserver] comando=kube-apiserver --service-cluster-ip- range=10.0.0.1/24 --insecure-bind-address=0.0.0.0 --etcd_servers=mand=kube-controller-manager --master=mand=kube-scheduler --master=mand=kubelet --api_servers=mand =kube-proxy --master=mand=docker daemon autoresart=true stdout_logfile=/var/log/docker.stdout.log stderr_logfile=/var/log/docker stderr.log
Como puedes ver. , configure el comando de inicio de cada componente de Kubernetes en comando. El parámetro de inicio automático está establecido en verdadero, lo que significa que el supervisor será responsable de reiniciar los componentes que salgan inesperadamente.
Los parámetros stdout_logfile y stderr_logfile se pueden usar para configurar la salida estándar del comando, que luego se puede usar para configurar la salida estándar del comando y los archivos de salida de error estándar.
Luego, especifique supervisord en el Dockerfile como el comando predeterminado ejecutado por el contenedor Docker:
CMD ["supervisord", "-c", "/etc/supervisor/conf. d/kubernetes.conf"]
En este momento, supervisord se convertirá en el proceso número uno en el contenedor Docker y deberá permanecer ejecutándose en todo momento. Si supervisor se ejecuta en segundo plano, el contenedor Docker también saldrá inmediatamente después de ejecutar el comando supervisord.
[supervisord] nodaemon=true
Resumen
La ventaja de utilizar scripts de shell para ejecutar contenedores Docker multiproceso es que la gente está más familiarizada con él. Esto es más propenso a errores debido a la necesidad de mantener el proceso número uno de un contenedor Docker ejecutándose en todo momento. Usar un script de shell es más engorroso si desea reiniciar automáticamente un proceso después de que finaliza inesperadamente.
Es muy conveniente utilizar un supervisor para ejecutar contenedores Docker multiproceso. Además, es fácil mantener el proceso n.º 1 en ejecución y reiniciarlo automáticamente después de que se cierre inesperadamente.
Utilice varios contenedores Docker para ejecutar Kubernetes
Dirección de GitHub
kiwenlau/single-kubernetes-docker
Utilice un único contenedor Docker para ejecute Kubernetes
Dirección de GitHub:
kiwenlau/kubernetes-shell kiwenlau/kubernetes-supervisor
En este proyecto, incluyo todos los componentes de kubernetes: etcd, control manager, apiserver, planificador, kubelet, kubelet, kubernetes-docker, kubernetes-supervisor, kubelet, kubelet, kubelet y kubernetes-supervisor. El programador, kubelet, agente y demonio acoplable se ejecutan en el mismo contenedor Docker.
Cuando se inicia el contenedor, cada componente se inicia mediante un script de shell o un supervisor.