Tam bir işletim sistemini bir komut belirtmeden Docker kapsayıcısında nasıl çalıştırabilirim?


25

CoreOS Docker Documentation'ı takip ediyorum ve aşağıdaki gibi komutlarla başlayan kapsayıcılardan bahsediyor:

docker run someImageName /bin/somebinary

someImageNameBir resim nerde ? / Bin / somebinary çıkıldığında, görüntü artık çalışmayacak.

Çalıştırılacak herhangi bir ikili dosya belirtmeden basitçe bir resim çalıştırmak istiyorum. Bunun yerine, normalde görüntü işletim sistemlerinde çalışan hizmetleri (örneğin, systemd / sysvinit) çalıştırmak istiyorum .

Bu, birinin Docker ile yapmak isteyeceği en yaygın şey gibi gözüküyor, ancak komut döndürmeden bir görüntü çalıştırmaya çalışmak:

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

Docker kapsayıcısını nasıl başlatıp komut belirtmek yerine tam işletim sistemi çalıştırabilirim ?



@FredtheMagicWonderDog Cevap aynı olmasına rağmen tam olarak değil.
mikemaccana

Yanıtlar:


24

Burada belgelendiği /sbin/initgibi, tek bir kullanıcıdan çok kullanıcılı moda geçiş yapan tüm diğer unix'ler gibi komut olarak çalıştırmanız yeterlidir .

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

Konteynırlar tam gelişmiş işletim sistemleri olabilir, sadece olmak zorunda değillerdir (bu konuda VM'leri de yapmazlar, yapılandırmak ve yönetmek sadece daha karmaşıktır).

Docker'ın tüm amacının uygulama kapsayıcılarını kolaylaştırmak olduğunu söyleyebilirim, böylece tüm uygulamayı değil, sadece bir uygulamayı yapılandırmanız gerekir.


Teşekkürler. / Sbin / init ile görüntüyü başlattıktan sonra docker ps -notrunc, konteyner kimliğini almak için koştum , sonra sudo /usr/sbin/lxc-attach -n containerIDçalışan görüntüye girdim. Diğer afişin
dediği gibi

Bir VM'de tam gelişmiş bir işletim sistemi çalıştırmanız gerekmediğini söylemek, fiziksel bir makinede tam gelişmiş bir işletim sistemi çalıştırmanıza gerek olmadığını söylemek gibidir, evet, çekirdeğin temelde sadece x86 / C olduğu doğru stdlib olmadan çalışan ve init yapan bir program, ama bu
Lie Ryan

11

Docker, işletim sistemi konteynerlerini değil , uygulama konteynerlerinin yönetimi ve dağıtımı için bir sistemdir . Bir işletim sistemini önyükleme ile bir liman işçisi konteynırını çalıştırıyormuşsunuz gibi görünüyor.

Docker konteynerleriniz, tek bir komutla başlatılabilecek tek amaçlı, çok dar kapsamlı uygulamalar olmalıdır. Bundan daha karmaşık bir şey arıyorsanız, Docker aradığınız çözüm değildir. Bu durumda, KVM, ESXi, OpenVZ, LXD vb.

Sadece bunlardan birini varsayılan belirtebilirsiniz nasıl arıyorsanız CMDve ENTRYPOINTsizin konteynerler için, en yapabilirsiniz birikmesi zaman bir Dockerfile kullanarak.


5
Docker'ın ne olduğunun farkındayım. Uygulama konteynırlarının işletim sistemlerine (örneğin Fedora veya Ubuntu) dayandığını belirteceğim. Unix'teki kalıcı uygulamalar - sadece kullanıcı alanı bile Docker gibi Unix'ler - initscripts veya systemd birim dosyalarından başlatılır. Örneğin, eğer uygulamam çökerse, otomatik olarak yeniden başlatılmasını istiyorum, eşik benzeri bir systemd sağlar.
mikemaccana

5
Konteynerlerinize çok fazla tıkmaya çalışıyorsunuz - bunlar işletim sistemi değil. İşlem denetimi her konteynerin dışında yapılmalıdır.
AÇAA

1
Öyleyse, bir işlem ölürse ... sadece tüm kabı yeniden başlatın? Sanırım bu çok pahalı değil, bu yüzden iyi olabilir.
Biraz

1
Evet, fikir bu. Kapsayıcınız bir vardır /sbin/init, ama gelmez zorunda o var. Muhtemelen bir varsayılan ubuntu kabı ya da onun gibi bir şey kullandınız. Bir var çok dilerseniz kaldırılabilir konteynerlerde bit.
AÇAA

1
@ValkoSipuli Bu görüşü almakta kesinlikle özgürsünüz. Bir konteynır içinde birden fazla işlem yapmanın, konteynırları ilk etapta kullanma nedeninin çoğunu olumsuz etkilediğini düşünüyorum. Bir kabın içinde bir işletim sistemi çalıştırmak için bir yer var mı? Muhtemelen. Bu bir istisna olsa da, artılar / eksiler üzerinde fazla tartışma olmadan yapılmamalıdır.
EEAA

5

Tam bir işletim sistemini bir kapta çalıştırmak için aşağıdaki Docker dosyasını oluşturun:

FROM fedora:25

CMD /sbin/init

Ardından kabı oluşturup başlatın ve içinde çalışan hizmetleri keşfetmek için içine bir kabuk girin:

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

Konteynır içinde tam sistem ve servisler. Güzel.


0
docker pull ubuntu

Sadece aynı görüntüden gerektiği kadar kaçın. Yeni konteynerler yaratılacak ve her biri kendi konfigürasyonunu koruyarak başlatılabilir ve durdurulabilir. Rahatlığınız için, her bir kabınıza "--name" ile bir isim vermeniz daha iyi olur.

Fi:

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

Bu kadar.

$ 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

Bundan sonra konteynerlerinizi sonsuza dek yarattınız ve onları VM'ler gibi başlatabilir ve durdurabilirsiniz.

docker start MyContainer1

Kabı alıp yapmak istediğini yapmak için:

docker exec -it MyContainer1 bash
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.