Daemon Docker tidak mulai saat boot pada CoreOS

23

Saya memiliki vanilla install CoreOS (835.9.0) dan tidak memulai daemon docker saat startup. Itu hanya dimulai ketika saya SSH dan lakukan misalnya docker ps.

Bagaimana saya bisa membuat daemon buruh pelabuhan mulai secara otomatis pada boot sistem?

Ketika saya mengatakan daemon buruh pelabuhan, maksud saya ps -ef | grep dockertidak menunjukkan proses sampai setelah saya lakukandocker ps

Chris
sumber

Jawaban:

40

sudo systemctl enable docker melakukan trik.

Chris
sumber
2
Terima kasih, dan saya telah membaca dokumen Docker dan tidak dapat menemukan apa pun untuk membantu - saya memang menemukan banyak tentang kebijakan restart, tetapi tentu saja mereka hanya berlaku setelah daemon buruh pelabuhan dimulai.
Chris
6
Latar Belakang: Akar dari ini adalah karena buruh pelabuhan soket diaktifkan pada CoreOS, yaitu tidak memblokir rantai boot. Versi awal buruh pelabuhan lambat untuk memulai ketika Anda memiliki banyak wadah pada disk yang memblokir semua yang bergantung pada buruh pelabuhan untuk memulai dengan cepat, yang menyebabkan beberapa kegagalan yang menarik.
Rob
4
Kebaikan. Ini membuatku gila. Tidak ada yang saya baca di salah satu dokumen yang menyebutkan ini. Saya hampir bersumpah CoreOS mendukung AWS AMI karena itu. (AWS AMI secara otomatis memulai daemon Docker secara default).
Nostalg.io
2
sangat tidak biasa bagi CoreOS untuk berperilaku seperti ini, mengingat bahwa CoreOS adalah OS Docker khusus dan tidak memulai buruh pelabuhan saat boot ???
typelogic
3
Ini adalah informasi yang sangat penting. Dokumen CoreOS tidak menyebutkan apa-apa tentang keharusan mengaktifkan Docker (atau runtime kontainer lain dalam hal ini). Karena dimungkinkan untuk memulai container docker pada CoreOS telanjang (dan karena CoreOS dibuat untuk menjalankan container), saya mendapat kesan bahwa itu adalah default. Saya baru menyadari kesalahan saya ketika reboot yang dipicu oleh pembaruan pertama kali tidak memulai kontainer saya.
Florian von Stosch
6

Ini agak lama sekarang, tapi saya sudah mulai menggunakan cloud-init untuk melakukan ini di semua server baru. Saya memiliki skrip cloud-init tersimpan yang saya gunakan untuk semua server saya. Bagian itu mengandung:

#cloud-config
coreos:
  units:
    - name: "docker.service"
      command: "start"
      enable: true

Ini akan mengaktifkan layanan buruh pelabuhan dan memulainya pada boot pertama dan setiap boot.

captncraig
sumber
2

Seperti yang sudah dijelaskan dalam komentar oleh Rob , buruh pelabuhan ini soket diaktifkan. Itu berarti bahwa deamon tidak dimulai kecuali disebut. Jawaban yang ada di sini berfungsi, tetapi CoreOS merekomendasikan pendekatan yang berbeda.

Cara yang disarankan untuk melakukan ini, menurut dokumentasi CoreOS adalah membuat layanan untuk aplikasi Anda sendiri yang pada gilirannya membutuhkan layanan Docker:

/etc/systemd/system/myapp.service:

[Unit]
Description=MyApp
After=docker.service
Requires=docker.service

[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill busybox1
ExecStartPre=-/usr/bin/docker rm busybox1
ExecStartPre=/usr/bin/docker pull busybox
ExecStart=/usr/bin/docker run --name busybox1 busybox /bin/sh -c "trap 'exit 0' INT TERM; while true; do echo Hello World; sleep 1; done"

[Install]
WantedBy=multi-user.target

Dan mintalah layanan itu mulai secara otomatis:

$ sudo systemctl enable /etc/systemd/system/myapp.service
$ sudo systemctl start hello.service

Contoh use case adalah untuk memperbarui wadah ke versi terbaru setelah layanan dimulai dan contoh lanjutan juga mendaftarkan layanan di etcd. Baca dokumentasi CoreOS untuk informasi latar belakang lebih lanjut.

Neograph734
sumber
Itu "terbaru" dari CoreOS? Docker telah memulai kembali kebijakan selama bertahun-tahun dan pendekatan ini tidak diperlukan atau diinginkan lagi. Itu tidak pernah benar-benar diinginkan, tetapi itu adalah solusi untuk (versi yang sangat lama) dari kurangnya dukungan Docker untuk memulai kembali wadah itu sendiri. Waktu yang lama untuk berhenti menggunakan CoreOS, saya kira ...
Michael Hampton
@MichaelHampton Kebijakan mulai ulang juga berlaku saat wadah macet karena alasan lain, jadi seseorang bukan pengganti yang lain. Selain itu, mulai ulang kebijakan tidak memungkinkan Anda memperbarui wadah saat boot, dll. Saya tidak tahu mana yang lebih baik, tetapi saya kira metode ini memberi Anda sedikit lebih banyak kontrol.
Neograph734
1
Ketika Anda mulai membutuhkan kontrol sebanyak itu, umumnya Anda juga membutuhkan banyak bit lain yang disediakan oleh layanan orkestrasi: pada akhir pembuatan docker sederhana, sampai ke Kubernetes.
Michael Hampton
1

Saya menggunakan Docker Swarm, jadi saya tidak memiliki aplikasi khusus untuk systemd yang bertanggung jawab untuk ... Saya hanya perlu buruh pelabuhan untuk memulai saat boot. Ini solusi yang saya usahakan.

Letakkan ini /etc/systemd/system/poke-docker.service:

[Unit]
After=default.target

[Service]
Type=oneshot
ExecStart=/usr/bin/docker version
RemainAfterExit=yes

[Install]
WantedBy=default.target

Dan kemudian hanya systemctl enable poke-dockermengaturnya untuk memicu pada setiap boot, dekat akhir urutan startup. The docker versionperintah berbicara dengan daemon buruh pelabuhan, memicu soket dan memulai layanan buruh pelabuhan itu sendiri.

Saya mencoba systemctl enable dockertrik dalam jawaban yang lain, dan sementara itu berhasil pada awalnya, tampaknya telah menyebabkan semacam situasi kawanan petir di mana buruh pelabuhan tampaknya berusaha untuk melakukan banyak hal dan gagal total. Saya menduga ini adalah perilaku "memblokir rantai boot" yang disebutkan dalam komentar di sana.

Colin Dunklau
sumber
Memiliki use case yang sama menjalankan gitlab-runner di segerombolan. Ini pasti membangunkan daemon. Anda dapat menambahkan drop-in systemd di file pengapian Anda coreos.com/os/docs/latest/using-systemd-drop-in-units.html
drgn