Как запустить полную ОС в контейнере Docker без указания команды?


25

Я следую за документированием CoreOS Docker, и в нем упоминается запуск контейнеров с такими командами, как:

docker run someImageName /bin/somebinary

Где someImageNameизображение. При выходе из / bin / somebinary образ больше не будет работать.

Я просто хотел бы запустить образ без указания каких-либо исполняемых файлов. Вместо этого я просто хочу запустить службы (например, systemd / sysvinit), которые обычно запускаются внутри образов ОС .

Кажется, это самая распространенная вещь, которую кто-либо когда-либо хотел бы сделать с Docker, но попытка запустить образ без команды возвращает:

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

Как я могу запустить Docker-контейнер и запустить полную ОС, а не указывать команду ?


Это дубликат этого вопроса stackoverflow.com/questions/19332662/…
Fred the Magic Wonder Dog

@FredtheMagicWonderDog Не совсем, хотя ответ тот же.
mikemaccana

Ответы:


24

Как описано здесь, вы просто запускаете /sbin/initкоманду как обычную загрузку Unix из однопользовательского в многопользовательский режим.

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

Контейнеры могут быть полнофункциональными ОС, они просто не должны быть (как и виртуальные машины в этом отношении, просто сложнее в настройке и управлении).

Я бы сказал, что весь смысл Docker состоит в том, чтобы сделать контейнеры приложений простыми, так что вам нужно только настроить приложение, а не всю ОС.


Спасибо. Запустив образ с / sbin / init, я запустил docker ps -notrunc, чтобы получить идентификатор контейнера, а затем sudo /usr/sbin/lxc-attach -n containerIDперейти к рабочему образу. Как отмечает другой плакат, я на самом деле не нужен второй инициализации, так что я буду проверить одну команду контейнеров рядом ...
mikemaccana

Сказать, что вам не нужно запускать полнофункциональную ОС на виртуальной машине, это все равно, что сказать, что вам не нужно запускать полнофункциональную ОС на физической машине, да, это правда, что ядро ​​в основном просто обычная x86 / C программа, которая запускается без stdlib и так же, как и init, но это
Lie Ryan

11

Docker - это система управления и развертывания контейнеров приложений , а не контейнеров операционной системы . Кажется, что вы совмещаете запуск док-контейнера с загрузкой операционной системы.

Ваши контейнеры Docker должны быть специализированными приложениями с очень узкой областью действия, которые можно запускать с помощью одной команды. Если вы ищете что-то более сложное, чем Docker, то Docker не является решением, которое вы ищете. В этом случае проверьте KVM, ESXi, OpenVZ, LXD и т. Д.

Если вы просто ищете, как вы можете указать значения по умолчанию CMDи ENTRYPOINTдля ваших контейнеров, вы можете сделать это во время сборки, используя Dockerfile.


5
Я знаю, что такое Докер. Я укажу, что контейнеры приложений основаны на операционных системах, например, Fedora или Ubuntu. Постоянные приложения в Unix - даже только в пользовательском пространстве Unix, такие как контейнеры Docker, - запускаются из файлов initscripts или systemd. Например, если мое приложение дает сбой, я бы хотел, чтобы оно автоматически перезагружалось с пороговым значением, как в systemd.
mikemaccana

5
Вы пытаетесь втиснуть слишком много в свои контейнеры - они не являются операционной системой. Надзор за процессом должен осуществляться вне каждого контейнера.
EEAA

1
Так что, если процесс умирает ... просто перезапустите весь контейнер? Я думаю, что это не так дорого, так что это может быть хорошо. Это немного странно - в моем контейнере есть / sbin / init, но он никогда не используется ...
mikemaccana

1
Да, это идея. Ваш контейнер имеет /sbin/init, но он не должен иметь его. Скорее всего, вы использовали контейнер Ubuntu по умолчанию или что-то в этом роде. В этих контейнерах есть много битов, которые можно удалить по желанию.
EEAA

1
@ValkoSipuli Вы, безусловно, можете придерживаться этого мнения. Я по-прежнему утверждаю, что выполнение более одного процесса внутри контейнера сводит на нет большую часть причин использования контейнеров в первую очередь. Есть ли место для запуска ОС внутри контейнера? Вероятно. Это, однако, исключение, и его не следует делать без особых размышлений о плюсах и минусах.
EEAA

5

Для запуска полной операционной системы в контейнере создайте следующий Dockerfile:

FROM fedora:25

CMD /sbin/init

Затем создайте и запустите контейнер и введите оболочку внутри него, чтобы изучить службы, работающие внутри него:

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

Полный системный сервис внутри контейнера. Прекрасный.


0
docker pull ubuntu

Просто бегите от одного и того же изображения столько раз, сколько необходимо. Будут созданы новые контейнеры, после чего их можно будет запускать и останавливать, сохраняя свою конфигурацию. Для вашего удобства было бы лучше дать каждому вашему контейнеру имя с "--name".

Fi:

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

Вот и все.

$ 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

После этого ваши контейнеры создаются навсегда, и вы можете запускать и останавливать их как виртуальные машины.

docker start MyContainer1

Чтобы попасть в контейнер и делать то, что вы хотите сделать:

docker exec -it MyContainer1 bash
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.