¿Cómo puedo ejecutar un sistema operativo completo en un contenedor Docker, sin especificar un comando?

25

Estoy siguiendo la documentación de CoreOS Docker y menciona los contenedores iniciales con comandos como:

docker run someImageName /bin/somebinary

¿Dónde someImageNameestá una imagen? Cuando / bin / somebinary sale, la imagen ya no se ejecutará.

Simplemente me gustaría ejecutar una imagen, sin especificar ningún binario para ejecutar. En cambio, simplemente quiero ejecutar los servicios (por ejemplo, systemd / sysvinit) que normalmente se ejecutan dentro del sistema operativo de imágenes .

Esto parece ser lo más común que alguien querría hacer con Docker, pero al intentar ejecutar una imagen sin un comando se devuelve:

2014/02/05 14:49:19 Error: create: No command specified

¿Cómo puedo iniciar un contenedor Docker y ejecutar un sistema operativo completo, en lugar de especificar un comando ?

mikemaccana
fuente
Este es un duplicado de esta pregunta stackoverflow.com/questions/19332662/…
Fred the Magic Wonder Dog
@FredtheMagicWonderDog No del todo, aunque la respuesta es la misma.
mikemaccana

Respuestas:

24

Como se documenta aquí, simplemente se ejecuta /sbin/initcomo el comando al igual que cualquier otro arranque de Unix desde un solo usuario al modo multiusuario.

/programming/19332662/start-full-container-in-docker

Los contenedores pueden ser sistemas operativos completos, simplemente no tienen que serlo (tampoco lo hacen las máquinas virtuales, es más complicado de configurar y administrar).

Yo diría que el objetivo de Docker es facilitar los contenedores de aplicaciones, de modo que solo tenga que configurar una aplicación, no todo el sistema operativo.

Fred the Magic Wonder Dog
fuente
Gracias. Después de comenzar la imagen con / sbin / init, ejecuté docker ps -notrunc, para obtener la ID del contenedor, y luego sudo /usr/sbin/lxc-attach -n containerIDentrar en la imagen en ejecución. Como el otro cartel menciona, yo realmente no necesita un segundo init, así que echa un vistazo a los envases de un solo comando siguiente ...
mikemaccana
Decir que no necesita ejecutar un sistema operativo completo en una máquina virtual es como decir que no necesita ejecutar un sistema operativo completo en una máquina física, sí, eso es cierto que el núcleo es básicamente un x86 / C normal programa que se ejecuta sin stdlib y también lo hace init, pero es
Lie Ryan
11

Docker es un sistema para la gestión e implementación de contenedores de aplicaciones , no contenedores de sistemas operativos . Parece como si estuviera combinando la ejecución de un contenedor acoplable con el arranque de un sistema operativo.

Sus contenedores Docker deben ser aplicaciones de un solo propósito y de alcance muy limitado que se pueden iniciar con un solo comando. Si está buscando algo más complejo que eso, entonces Docker no es la solución que está buscando. En ese caso, consulte KVM, ESXi, OpenVZ, LXD , etc.

Si solo está buscando cómo puede especificar un valor predeterminado CMDy ENTRYPOINTpara sus contenedores, puede hacerlo en tiempo de compilación utilizando un Dockerfile.

EEAA
fuente
55
Soy consciente de lo que es Docker. Señalaré que los contenedores de aplicaciones se basan en sistemas operativos, por ejemplo, Fedora o Ubuntu. Las aplicaciones persistentes en Unix, incluso solo en el espacio de usuario Unixes como los contenedores Docker, se inician desde initscripts o archivos de unidad del sistema. Por ejemplo, si mi aplicación falla, me gustaría que se reiniciara automáticamente, con un umbral, como proporciona systemd.
mikemaccana
55
Estás intentando meter demasiado en tus contenedores, no son un sistema operativo. La supervisión del proceso debe manejarse fuera de cada contenedor.
EEAA
1
Entonces, si un proceso muere ... ¿solo reinicia todo el contenedor? Supongo que no es tan caro, así que podría estar bien. Es un poco raro se siente - mi contenedor tiene un / sbin / init, pero que nunca se usa ...
mikemaccana
1
Sí, esa es la idea. Su contenedor tiene un /sbin/init, pero no tiene que tenerlo. Es probable que haya usado un contenedor ubuntu predeterminado o algo así. Hay muchos bits en estos contenedores que se pueden quitar si lo desea.
EEAA
1
@ValkoSipuli Sin duda eres libre de mantener esa opinión. Sigo manteniendo que ejecutar más de un proceso dentro de un contenedor niega gran parte de la razón para usar contenedores en primer lugar. ¿Hay un lugar para ejecutar un sistema operativo dentro de un contenedor? Probablemente. Sin embargo, esa es una excepción, y no debe hacerse sin mucha deliberación sobre los pros / contras.
EEAA
5

Para ejecutar un sistema operativo completo en un contenedor, cree el siguiente Dockerfile:

FROM fedora:25

CMD /sbin/init

Luego construya e inicie el contenedor e ingrese un shell dentro de él para explorar los servicios que se ejecutan dentro de él:

docker build -t os .
docker run -d --privileged --name os os
docker exec -it os bash

Servicios completos de systemd dentro del contenedor. Hermosa.

Markus Hallmann
fuente
0
docker pull ubuntu

Simplemente ejecute desde la misma imagen tantas veces como sea necesario. Se crearán nuevos contenedores y luego se pueden iniciar y detener cada uno guardando su propia configuración. Para su conveniencia, sería mejor darle a cada uno de sus contenedores un nombre con "--name".

Fi:

docker run --name MyContainer1 <ubuntu image>
docker run --name MyContainer2 <ubuntu image>
docker run --name MyContainer3 <ubuntu image>

Eso es.

$ docker ps
CONTAINER ID        IMAGE            CREATED          STATUS               NAMES
a7e789711e62        67759a80360c   12 hours ago     Up 2 minutes         MyContainer1
87ae9c5c3f84        67759a80360c   12 hours ago     Up About a minute    MyContainer2
c1524520d864        67759a80360c   12 hours ago     Up About a minute    MyContainer3

Después de eso, tiene sus contenedores creados para siempre y puede iniciarlos y detenerlos como máquinas virtuales.

docker start MyContainer1

Para entrar en el contenedor y hacer lo que quieres hacer:

docker exec -it MyContainer1 bash
DimiDak
fuente