Bagaimana saya bisa menjalankan OS penuh dalam wadah Docker, tanpa menentukan perintah?

25

Saya mengikuti Dokumentasi CoreOS Docker dan menyebutkan mulai wadah dengan perintah seperti:

docker run someImageName /bin/somebinary

Di mana someImageNamesebuah gambar. Ketika / bin / somebinary keluar, gambar tidak akan lagi berjalan.

Saya hanya ingin menjalankan gambar, tanpa menentukan biner untuk dijalankan. Sebagai gantinya, saya hanya ingin menjalankan layanan (misalnya, systemd / sysvinit) yang biasanya dijalankan di dalam gambar OS .

Ini sepertinya hal paling umum yang ingin dilakukan oleh Docker, tetapi mencoba menjalankan gambar tanpa perintah kembali:

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

Bagaimana saya bisa memulai wadah Docker dan menjalankan OS penuh, daripada menentukan perintah ?

mikemaccana
sumber
Ini adalah duplikat dari pertanyaan ini stackoverflow.com/questions/19332662/…
Fred the Magic Wonder Dog
@ FredtheMagicWonderDog Tidak cukup, meskipun jawabannya sama.
mikemaccana

Jawaban:

24

Seperti yang didokumentasikan di sini, Anda hanya menjalankan /sbin/initsebagai perintah sama seperti boot unix lainnya dari satu pengguna ke mode multi-pengguna.

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

Kontainer dapat menjadi sistem operasi penuh, mereka hanya tidak harus (VM juga tidak dalam hal ini, itu hanya lebih rumit untuk mengkonfigurasi dan mengelola).

Saya akan mengatakan inti dari Docker adalah untuk membuat wadah aplikasi mudah, sehingga Anda hanya perlu mengkonfigurasi aplikasi, bukan seluruh OS.

Fred Anjing Ajaib Ajaib
sumber
Terima kasih. Setelah memulai gambar dengan / sbin / init, saya berlari docker ps -notrunc, untuk mendapatkan ID wadah, lalu sudo /usr/sbin/lxc-attach -n containerIDmasuk ke gambar yang sedang berjalan. Seperti yang disebutkan poster lain, saya tidak benar-benar membutuhkan init kedua, jadi saya akan memeriksa wadah perintah tunggal berikutnya ...
mikemaccana
Mengatakan bahwa Anda tidak perlu menjalankan OS yang penuh sesak nafas dalam VM adalah seperti mengatakan bahwa Anda tidak perlu menjalankan OS yang penuh sesak nafas dalam mesin fisik, ya itu benar bahwa kernel pada dasarnya hanya x86 / C biasa Program yang berjalan tanpa stdlib dan begitu juga init, tapi itu
Lie Ryan
11

Docker adalah sistem untuk manajemen dan penyebaran wadah aplikasi , bukan wadah sistem operasi . Sepertinya Anda sedang mengkonfigurasi menjalankan wadah buruh pelabuhan dengan mem-boot sistem operasi.

Kontainer Docker Anda harus aplikasi dengan tujuan tunggal dan sangat sempit yang dapat dimulai dengan satu perintah. Jika Anda mencari sesuatu yang lebih kompleks dari itu, maka Docker bukanlah solusi yang Anda cari. Dalam hal ini, lihat KVM, ESXi, OpenVZ, LXD dll.

Jika Anda hanya mencari bagaimana Anda dapat menentukan default CMDdan ENTRYPOINTuntuk wadah Anda, Anda dapat melakukannya saat membangun menggunakan Dockerfile.

EEAA
sumber
5
Saya tahu apa itu Docker. Saya akan menunjukkan bahwa wadah aplikasi didasarkan pada sistem operasi, misalnya, Fedora atau Ubuntu. Aplikasi gigih di Unix - bahkan hanya userspace Unix seperti Docker container - dimulai dari skrip init atau file unit systemd. Sebagai contoh, jika aplikasi saya mogok, saya ingin aplikasi itu restart secara otomatis, dengan systemd yang menyediakan ambang.
mikemaccana
5
Anda mencoba menjejalkan terlalu banyak ke wadah Anda - mereka bukan sistem operasi. Pengawasan proses harus ditangani di luar setiap wadah.
EEAA
1
Jadi, jika suatu proses mati ... hanya restart seluruh wadah? Saya kira itu tidak begitu mahal sehingga mungkin OK. Agak terasa aneh - wadah saya memiliki / sbin / init, tetapi tidak pernah digunakan ...
mikemaccana
1
Ya, itulah idenya. Wadah Anda memiliki /sbin/init, tetapi tidak harus memilikinya. Anda kemungkinan menggunakan wadah ubuntu default atau sesuatu seperti itu. Ada banyak bit dalam wadah ini yang bisa dilepas jika diinginkan.
EEAA
1
@ValkoSipuli Anda tentu bebas berpendapat seperti itu. Saya masih berpendapat bahwa menjalankan lebih dari satu proses di dalam wadah meniadakan banyak alasan untuk menggunakan wadah di tempat pertama. Apakah ada tempat untuk menjalankan OS di dalam wadah? Mungkin. Tapi itu pengecualian, dan tidak boleh dilakukan tanpa banyak pertimbangan pro / kontra.
EEAA
5

Untuk menjalankan sistem operasi penuh dalam sebuah wadah, buat Dockerfile berikut:

FROM fedora:25

CMD /sbin/init

Kemudian bangun dan mulai wadah dan masukkan shell di dalamnya untuk menjelajahi layanan yang berjalan di dalamnya:

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

Layanan systemd lengkap di dalam wadah. Indah.

Markus Hallmann
sumber
0
docker pull ubuntu

Jalankan saja dari gambar yang sama sebanyak yang diperlukan. Kontainer baru akan dibuat dan mereka kemudian dapat dimulai dan dihentikan masing-masing menyimpan konfigurasinya sendiri. Untuk kenyamanan Anda akan lebih baik untuk memberikan masing-masing wadah nama dengan "--name".

Fi:

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

Itu dia.

$ 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

Setelah itu, wadah Anda dibuat selamanya dan Anda bisa memulai dan menghentikannya seperti VM.

docker start MyContainer1

Untuk masuk ke dalam wadah dan melakukan apa yang ingin Anda lakukan:

docker exec -it MyContainer1 bash
DimiDak
sumber