Демон Docker не запускається під час завантаження на CoreOS


23

У мене встановлення ванілі CoreOS (835.9.0), і він не запускає демон докера при запуску. Він починається лише тоді, коли я входжу в SSH і роблю, наприклад docker ps.

Як я можу зробити так, щоб демон докера автоматично запускався під час завантаження системи?

Коли я кажу, що демон ps -ef | grep dockerдемонструє докер, я маю на увазі не показує жодних процесів до могоdocker ps

Відповіді:


40

sudo systemctl enable docker зробив трюк.


2
Дякую, і я прочитав документи Docker і не зміг знайти нічого, щоб допомогти - я знайшов багато про політику перезавантаження, але, звичайно, вони застосовуються лише після запуску демона докера.
Кріс

6
Фон: корінь цього полягає в тому, що докер активовано сокет на CoreOS, тобто він не блокує ланцюг завантаження. Ранні версії docker запускалися повільно, коли у вас було багато контейнерів на диску, які блокували все, що залежало від докера, швидко запускатися, що спричинило цікаві збої.
Роб

4
Добро. Це зводило мене з розуму. Нічого, що я читав у жодному з документів, про це не згадувалося. Я майже поклявся від CoreOS на користь AWS AMI через це. (AWS AMI автоматично запускає демон Docker за замовчуванням).
Nostalg.io

2
дуже незвично для CoreOS поводитись так, враховуючи, що CoreOS - це спеціальна Docker OS, і він не запускає докер під час завантаження ???
шрифт

3
Це дуже важлива інформація. Документи CoreOS нічого не згадують про необхідність включення Docker (або будь-якого іншого режиму роботи контейнера з цього питання). Оскільки можна запустити контейнери докера на голому CoreOS (а оскільки CoreOS створений для запуску контейнерів), я опинився під враженням, що це за замовчуванням. Я зрозумів свою помилку лише тоді, коли перше перезавантаження, яке було спровоковано оновленням, не запустило мої контейнери.
Флоріан фон Стош

6

Зараз це трохи старе, але я почав використовувати хмарно-ініт, щоб зробити це на всіх нових серверах. У мене збережений хмарний сценарій-init, який я використовую для всіх своїх серверів. Частина його містить:

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

Це дозволить докер-службі та запустити її під час першого та кожного завантаження.


2

Як вже говорилося в цьому коментарі по Робу , докер в гніздо активується. Це означає, що Деймон не починається, якщо його не викликають. Тут існують відповіді, але CoreOS рекомендує інший підхід.

Відповідно до документації на CoreOS рекомендований спосіб зробити це - створити службу для власного додатка, яка, в свою чергу, вимагає послуги 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

І щоб ця послуга замість цього почалася автоматично:

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

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


Це "остання" від CoreOS? Докер протягом багатьох років проводив політику перезавантаження, і такий підхід вже не є необхідним або бажаним. Це ніколи не було бажано, але це було вирішенням проблеми (дуже старих версій) відсутності підтримки Докера для перезавантаження самих контейнерів. Давно минулий час припинити використання CoreOS, я думаю ...
Майкл Хемптон

Політика @MichaelHampton Restart також застосовується, коли контейнер виходить з ладу з іншої причини, тому один не є заміною іншому. Крім того, політики перезавантаження не дозволяють оновлювати контейнери під час завантаження і т. Д. Я поняття не маю, що краще, але я вважаю, що цей метод дає вам трохи більше контролю.
Neograph734

1
Коли ви починаєте потребувати такого великого контролю, вам, як правило, потрібна маса інших біт, які надаються службами оркестрації: на простому кінці докер-композиції, аж до Кубернетів.
Майкл Хемптон

1

Я використовую Docker Swarm, тому у мене немає конкретного додатку, щоб система відповідала за ... Мені просто потрібен докер, щоб почати завантажуватися. Це рішення, яке я опрацював.

Покладіть так /etc/systemd/system/poke-docker.service:

[Unit]
After=default.target

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

[Install]
WantedBy=default.target

А потім просто systemctl enable poke-dockerвстановити його для запуску на кожному завантажувальному пристрої, майже в кінці послідовності запуску. docker versionКоманда спілкується з Docker демон, викликавши сокет і почати саму послугу Докер.

Я спробував systemctl enable dockerхитрість в іншій відповіді, і, хоча це спочатку спрацювало, схоже, це спричинило грізну ситуацію в стаді, де докер, мабуть, намагався зробити чимало і зазнав невдач. Я підозрюю, що це поведінка "блокування ланцюга завантаження", згадана в коментарях.


Був би той самий випадок використання, що працює на руїні gitlab-runner. Це безумовно розбудить демон. Ви можете додати системний спад у свій файл запалювання coreos.com/os/docs/latest/using-systemd-drop-in-units.html
drgn
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.