Bagaimana cara memulai wadah buruh pelabuhan secara otomatis saat boot sistem?

113

Apa cara yang baik untuk memulai wadah buruh pelabuhan secara otomatis ketika sistem dinyalakan?

Apakah ada cara yang disukai untuk melakukan ini di Ubuntu 14.04?

Saya telah menggunakan supervisorddi masa lalu untuk memulai aplikasi web secara otomatis. Tapi itu tidak terasa seperti hal yang tepat untuk Docker.

Stefan Arentz
sumber

Jawaban:

136

Tampaknya, metode saat ini untuk memulai wadah Docker secara otomatis ( dari Docker 1.2 ) adalah dengan menggunakan kebijakan restart . Ini akan mengontrol bagaimana Docker harus menangani mulai dari wadah pada saat startup dan memulai kembali wadah ketika keluar. Saya telah menggunakan opsi 'selalu' sejauh ini, dan dapat mengonfirmasi bahwa itu membuat Docker memulai wadah secara otomatis saat boot sistem:

sudo docker run --restart=always -d myimage

Kutipan Dokumentasi

Kebijakan Mulai Ulang Menggunakan bendera --restart pada Docker run Anda dapat menentukan kebijakan mulai ulang untuk bagaimana wadah harus atau tidak harus dimulai kembali saat keluar.

tidak - Jangan memulai ulang wadah saat keluar.

on-failure - Mulai ulang wadah hanya jika keluar dengan status keluar bukan nol.

selalu - Selalu mulai ulang wadah terlepas dari status keluar.

Anda juga dapat menentukan jumlah maksimum yang akan dilakukan Docker untuk memulai ulang wadah saat menggunakan kebijakan kegagalan. Standarnya adalah Docker akan mencoba selamanya untuk memulai kembali wadah.

$ sudo docker run --restart=always redis

Ini akan menjalankan wadah redis dengan kebijakan restart selalu sehingga jika wadah keluar, Docker akan restart itu.

$ sudo docker run --restart=on-failure:10 redis

Ini akan menjalankan redis container dengan kebijakan restart on-failure dan jumlah restart maksimum 10. Jika container redis keluar dengan status keluar non-nol lebih dari 10 kali berturut-turut Docker akan batal mencoba untuk me-restart container. Memberikan batas restart maksimum hanya berlaku untuk kebijakan on-failure.

aknuds1
sumber
12
"selalu - Selalu mulai ulang wadah terlepas dari status keluar" agak membingungkan. Ini tidak akan memulai ulang wadah jika Anda secara manual keluar / menghentikan wadah, yang merupakan perilaku yang saya cari.
w00t
12
Catatan: kebijakan lain yang disebut unless-stoppedtelah ditambahkan. Kerjanya seperti alwaystetapi Jika wadah dihentikan dan sistem reboot atau daemon buruh pelabuhan restart, wadah tidak akan restart. Lihat di sini untuk penulisan yang bagus dari semua 4 pilihan blog.codeship.com/...
David Morales
4
Tentu saja, dockerdaemon harus mulai otomatis untuk mendukung ini.
sherrellbc
Saya pikir pertanyaannya adalah bertanya "pada sistem boot", artinya setelah server fisik atau virtual reboot, bagaimana wadah restart otomatis, dengan asumsi mesin docker sepenuhnya berjalan setelah server reboot?
Root Loop
8

Docker memiliki halaman ini yang menjelaskan bagaimana melakukannya dengan pemula dan systemd. Saya setuju bahwa sepertinya itu bukan hal yang tepat untuk Docker. Solusi mereka adalah menjalankan docker start, yang mengasumsikan bahwa Anda telah membuat wadah Anda. Saya akan berpikir bahwa Anda akan melakukannya docker run --rmdi skrip pemula (memperlakukannya seperti proses baru dan wadah dari gambar) atau biarkan saja buruh pelabuhan me-restart wadah itu sendiri saat boot (karena akan secara default jika Anda tidak melakukan hal lain ). Pemula memiliki keuntungan memungkinkan memulai / menghentikan proses dengan mudah, tetapi Anda juga mendapatkannya dengan start / stop buruh pelabuhan!

Saya pikir itu aneh untuk memaksa pengguna untuk secara manual membuat wadah (dengan semua port / volume binding yang benar) sebelum skrip pemula akan bekerja.

Lawrence Kesteloot
sumber
Tautan rusak ... Sepertinya ini adalah pengganti yang mungkin, tetapi jelas tidak menunjukkan "bagaimana"
Gert van den Berg
Terima kasih, saya telah memperbaiki tautan ke halaman yang serupa, tetapi saya tidak dapat memastikan bahwa itu mengatakan hal yang sama dengan yang asli.
Lawrence Kesteloot
6

Tapi itu tidak terasa seperti hal yang tepat untuk Docker.

Kenapa tidak?

Saya menggunakan pengawas untuk ini dengan sukses besar.

Gunakan apa yang Anda ketahui, gunakan apa yang berhasil, gunakan sesuatu yang dapat Anda pelihara dan pahami dengan mudah.

EEAA
sumber
Terima kasih @EEAA .. apakah itu berarti Anda menjalankannya dalam mode non-daemon? Bukankah itu juga berarti Anda harus menjalankannya --rm?
Stefan Arentz
Saya menjalankan wadah dalam mode latar depan dan membiarkan pengawas menangkap stdout / stderr. Saya tidak yakin mengapa --rmrelevan di sini.
EEAA
@ EEAA: tentang pertanyaan Anda: Bagi sebagian orang, dockeradalah pengganti lxcatau openvzyang memiliki lxc.start.auto = 1dan vzctl set --onboot yes. ESXi dan solusi virtualisasi lainnya juga menyertakan fitur tersebut. Seperti Lawrence, saya juga tidak berpikir fitur autostart seperti itu harus diimplementasikan dengan cara distribusi khusus karena pengguna buruh pelabuhan harus dapat memecahkan masalah yang sama dengan pengetahuan yang sama di setiap platform.
Daniel Alder
1
Benar, Docker adalah cara yang bagus untuk memisahkan host dari menjalankan kontainer sehingga menggunakan konfigurasi khusus host adalah sedikit langkah mundur.
nijave