¿Cómo puedo hacer que un contenedor Docker se inicie automáticamente al arrancar el sistema?

102

Supongo que tengo un contenedor Docker que quiero ejecutar, luego puedo llamar

$ docker run ...

y todo esta bien. ¿Existe una forma incorporada de ejecutar un contenedor de manera que se reinicie automáticamente si el sistema se bloquea y se reinicia?

Si es así, ¿también está disponible en Docker Compose?

Golo Roden
fuente

Respuestas:

126

Sí, Docker tiene políticas de reinicio como las docker run --restart=alwaysque se encargarán de esto. Esto también está disponible en el archivo de configuración compose.yml como restart: always.

Peter Lyons
fuente
24
Esta es la primera respuesta aceptada, sin embargo, probablemente la mayoría de las personas que buscan esa característica realmente quieren ejecutar su contenedor como un servicio. La respuesta de @kon usando Systemdcomo administrador de servicios es una de las mejores soluciones para ese propósito y necesita más votos a favor.
Rémi Becheras
1
Esto no funcionó para mí. Tengo un contenedor llamado "crmpicco-mysql" y me encontré docker run --restart=always crmpicco-mysqly me dio el error: Unable to find image 'crmpicco-mysql:latest' locally.
crmpicco
2
Tu error no está relacionado. Es posible que desee publicar una pregunta por separado, pero parece que está confundiendo los nombres de las imágenes de la ventana acoplable y los nombres de los contenedores de la ventana acoplable. El docker runcomando espera el nombre de una imagen que puede enumerar a través de docker images.
Peter Lyons
11
El único problema con esto es que "siempre" también reiniciará infinitamente el contenedor cuando se detuvo debido a un error (ver documentos). Debería haber una política que solo comience en daemon-start
lostiniceland
4
Pensé que uno de los principales puntos de venta de contenedores / acopladores era que no necesito instalar y administrar cada uno de mis servicios en systemd (lo que puede ser una molestia).
Marc
133

Si desea que el contenedor se inicie incluso si ningún usuario ha realizado un inicio de sesión (como la VM VirtualBox que solo inicio y no quiero iniciar sesión cada vez). Estos son los pasos que realicé para Ubuntu 16.04 LTS. Como ejemplo, instalé un contenedor de base de datos de Oracle:

$ docker pull alexeiled/docker-oracle-xe-11g
$ docker run -d --name=MYPROJECT_oracle_db --shm-size=2g -p 1521:1521 -p 8080:8080 alexeiled/docker-oracle-xe-11g
$ vim /etc/systemd/system/docker-MYPROJECT-oracle_db.service

y agregue el siguiente contenido:

[Unit]
Description=Redis container
Requires=docker.service
After=docker.service

[Service]
Restart=always
ExecStart=/usr/bin/docker start -a MYPROJECT_oracle_db
ExecStop=/usr/bin/docker stop -t 2 MYPROJECT_oracle_db

[Install]
WantedBy=default.target

y habilitar el servicio al inicio

sudo systemctl enable docker-MYPROJECT-oracle_db.service

Para más información https://docs.docker.com/engine/admin/host_integration/

kon
fuente
8
Para aquellos que buscan hacer esto con docker-compose, pueden reemplazar el dockercomando anterior con el docker-composecomando, usando la -fbandera para especificar la ubicación del archivo docker-compose:/usr/bin/docker-compose -f /path/to/docker-compose.yml up
charlesreid1
1
Para agregar a lo que dijo @ charlesreid1, si su docker-compose.ymlespecifica un .envarchivo, use --project-directory /path/to además de especificar explícitamente su archivo de composición de docker.
whlteXbread
1
Docker tiene su sistema de registro y administrador de procesos. Es lamentable que no tenga la política de reinicio correcta.
Franklin Yu
¿Alguna idea de cómo hacer esto en Windows Server 2012? No puedo ejecutar Docker a menos que inicie sesión ...
Alex Lord Mordor
También puede ser interesante para algunos que haya una [Unit]directiva útil llamada Before=. Especialmente al iniciar cosas como sistemas de administración de bases de datos, podría ser útil asegurarse de que se inicie antes que otros servicios específicos.
Micha
88

La política de reinicio predeterminada es no.

Para los contenedores creados, utilice docker updatepara actualizar la política de reinicio.

docker update --restart=always 0576df221c0b

0576df221c0b es el ID del contenedor.

Edward joven
fuente
¿No alwayssignifica que el contenedor se reiniciará incluso si lo detengo? Seguramente hay una manera de reiniciar un contenedor al reiniciar sin este tipo de inicio persistente ...
Marc
4
@Marc: no. Ver la documentación :If you manually stop a container, its restart policy is ignored until the Docker daemon restarts or the container is manually restarted. This is another attempt to prevent a restart loop.
SaeX
12

Puede utilizar docker update --restart=on-failure <container ID or name>.

Además de lo que sugiere el nombre, on-failureno solo reiniciará el contenedor en caso de falla, sino también al iniciar el sistema.

Según la documentación , hay varias opciones de reinicio:

Flag            Description
no              Do not automatically restart the container. (the default)
on-failure      Restart the container if it exits due to an error, which manifests as a non-zero exit code.
always          Always restart the container if it stops. If it is manually stopped, it is restarted only when Docker daemon restarts or the container itself is manually restarted. (See the second bullet listed in restart policy details)
unless-stopped  Similar to always, except that when the container is stopped (manually or otherwise), it is not restarted even after Docker daemon restarts.
SaeX
fuente
2
Vaya, buen trabajo al descubrir esto, considerando que no se menciona en la documentación. Solución perfecta para mi.
Cameron Hudson
Una cosa a tener en cuenta sobre el uso en caso de falla, si tiene un contenedor que depende de otro que ya se está ejecutando, no parece haber una "orden de inicio", por lo que uno puede comenzar y fallar inmediatamente y nunca iniciarse al arrancar el sistema operativo
ferr
8

Modo más "suave" de la documentación:

docker run -dit --restart unless-stopped <image_name>
Rib47
fuente
2
Desafortunadamente, cuando el demonio de la ventana acoplable es detenido por un reinicio, el demonio "detiene" los contenedores, marcándolos como detenidos. Luego, cuando el sistema se inicia, en realidad no inicia estos. Es tonto. Aquí está el error: github.com/docker/for-linux/issues/652
mlissner
7

1) En primer lugar, debe habilitar el servicio Docker en el arranque

$ sudo systemctl enable docker

2) Luego, si tiene docker-compose .yml file add restart: alwayso si tiene un contenedor docker, agregue restart = siempre así:

docker run --restart=always y ejecuta el contenedor docker

Asegurarse

Si detiene manualmente un contenedor, su política de reinicio se ignora hasta que el daemon de Docker se reinicia o el contenedor se reinicia manualmente.

consulte esta política de reinicio en la página oficial de Docker

3) Si desea iniciar docker-compose, todos los servicios se ejecutan cuando reinicia su sistema, por lo que ejecuta el siguiente comando solo una vez

$ docker-compose up -d
Abdul Basit
fuente
2

Para esto es crontab:

@reboot sleep 10 ; docker start <container name> 2>&1 | /usr/bin/logger -t 'docker start'

Acceda a su crontab de usuario crontab -eo muéstrelo con crontab -lo edite el crontab de su sistema en/etc/crontab

Travis Runyard
fuente
¿Qué es el inicio del servicio cron antes del servicio docker? Esto fallaría en este caso ...
Akhil Jalagam
1
@AkhilJalagam No estoy seguro de entender su problema. El "sueño 10" le da a crond suficiente tiempo para comenzar, luego inicia el contenedor después de arrancar / reiniciar el sistema. Este método no necesita que nadie inicie sesión antes de comenzar y evita unidades de servicio systemd complicadas y desordenadas. El método de la unidad de servicio systemd se siente aún más hackeo que mi ejemplo.
Travis Runyard
2

Puede ejecutar un contenedor que se reinicia siempre mediante:

$ docker run -dit --restart unless-stopped <image name OR image hash>

Si desea cambiar la configuración de un contenedor en ejecución, debe actualizarlo de la siguiente manera:

$ docker update --restart=<options> <container ID OR name>

Y si desea ver la política actual del contenedor, ejecute el siguiente comando antes de arriba en el primer lugar:

docker inspect gateway | grep RestartPolicy -A 3

Después de todo, no olvide hacer que el demonio docker instalado se habilite en el arranque del sistema mediante:

$ systemctl enable docker

Para ver una lista completa de las políticas de reinicio, consulte: Políticas de reinicio

Mohsen Abasi
fuente
1

Quería lograr el inicio del contenedor en el arranque en Windows.

Por lo tanto, acabo de crear una tarea programada que se inicia al arrancar el sistema. Esa tarea simplemente inicia "Docker para Windows.exe" (o cualquiera que sea el nombre de su ejecutable de Docker).

Luego, se iniciarán todos los contenedores con una política de reinicio de "siempre".

TostMaster
fuente