Як я можу запустити повну ОС в контейнері Docker, не вказуючи команду?


25

Я стежу за документацією на докер CoreOS і згадує про запуск контейнерів з такими командами:

docker run someImageName /bin/somebinary

Де someImageName зображення. Коли / bin / somebinary виходить, зображення перестане працювати.

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

Це здається найпоширенішим, що хто-небудь хотів би зробити з Docker, але намагаючись запустити зображення без команди, повертається:

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

Як я можу запустити контейнер Docker і запустити повну ОС, а не вказувати команду ?



@FredtheMagicWonderDog Не зовсім, хоча відповідь однакова.
mikemaccana

Відповіді:


24

Як задокументовано тут, ви просто біжите /sbin/init як команду так само, як і будь-яке інше завантаження unix з одного користувача в багатокористувацький режим.

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

Контейнери можуть бути повнофункціональними ОС, їх просто не повинно бути (як і не VM з цього питання, просто складніше налаштувати та керувати).

Я б сказав, що вся суть Docker полягає в тому, щоб зробити контейнери програм простими, так що вам потрібно буде налаштувати лише додаток, а не всю ОС.


Спасибі. Після запуску зображення з / sbin / init, я побіг docker ps -notrunc, щоб отримати ідентифікатор контейнера, а потім sudo /usr/sbin/lxc-attach -n containerIDпотрапити в запущене зображення. Як згадується в іншому плакаті, мені не дуже потрібен другий ініт, тому я перевіряю контейнери з
однокомандними

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

11

Docker - це система управління та розгортання контейнерів додатків , а не операційна система контейнерів . Схоже, ви поєднуєте запуск контейнера докера з завантаженням операційної системи.

Ваші контейнери Docker повинні бути одноцільовими, дуже вузькоскладеними програмами, які можна запустити однією командою. Якщо ви шукаєте щось складніше, ніж це, то Докер - це не рішення, яке ви шукаєте. У цьому випадку перевірте KVM, ESXi, OpenVZ, LXD тощо.

Якщо ви просто шукаєте, як можна вказати за замовчуванням CMDі ENTRYPOINTдля своїх контейнерів, це можна зробити під час збирання за допомогою Dockerfile.


5
Я знаю, що таке Докер. Я зазначу, що контейнери додатків базуються на операційних системах, наприклад, Fedora або Ubuntu. Стійкі програми в Unix - навіть Unixes, навіть лише Unixes, як Docker-контейнери - запускаються з інциптристів або файлів системного блоку. Наприклад, якщо мій додаток виходить з ладу, я хотів би, щоб він перезавантажився автоматично, із пороговою системою, що передбачає.
mikemaccana

5
Ви намагаєтеся забивати занадто багато своїх контейнерів - вони не є операційною системою. Нагляд за процесом повинен здійснюватися поза кожним контейнером.
ЄЕАА

1
Отже, якщо процес відмирає ... просто перезавантажте весь контейнер? Я думаю, це не так дорого, щоб це могло бути нормально. Це якось дивно - мій контейнер має / sbin / init, але він ніколи не звикає ...
mikemaccana

1
Так, це ідея. Ваш контейнер має /sbin/init, але його не обов’язково мати . Ви, ймовірно, використовували контейнер ubuntu за замовчуванням або щось подібне. У цих контейнерах є багато бітів, які при бажанні можна вийняти.
ЄЕАА

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

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

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

Після цього у вас є контейнери створені назавжди, і ви можете запускати та зупиняти їх, як VM.

docker start MyContainer1

Щоб потрапити в контейнер і зробити те, що ви хочете зробити:

docker exec -it MyContainer1 bash
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.