Демон Docker не запускается при загрузке на CoreOS


23

У меня установлена ​​ванильная версия CoreOS (835.9.0), и она не запускает демон docker при запуске. Это начинается только тогда, когда я SSH и сделать, например docker ps.

Как сделать так, чтобы демон docker автоматически запускался при загрузке системы?

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

Ответы:


40

sudo systemctl enable docker сделал трюк.


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

6
Предыстория: корень этого в том, что докер активируется через сокет в CoreOS, то есть он не блокирует загрузочную цепочку. Ранние версии Docker запускались медленно, когда на диске было много контейнеров, которые блокировали быстрый запуск всего, что зависело от Docker, что вызывало некоторые интересные сбои.
Роб

4
Совершенство. Это сводило меня с ума. Ничто из того, что я читал ни в одном из документов, не упоминало об этом. Из-за этого я почти отказался от CoreOS в пользу AWS AMI. (AWS AMI автоматически запускает демон Docker по умолчанию).
Nostalg.io

2
очень необычно для CoreOS вести себя таким образом, учитывая, что CoreOS является выделенной ОС Docker и не запускает докер во время загрузки ???
typelogic

3
Это серьезно важная информация. В документации по CoreOS ничего не говорится о необходимости включения Docker (или о любом другом времени выполнения контейнера). Так как можно запускать Docker-контейнеры на чистом CoreOS (и поскольку CoreOS создан для запуска контейнеров), у меня сложилось впечатление, что это значение по умолчанию. Я осознал свою ошибку, только когда первая перезагрузка, вызванная обновлением, не запустила мои контейнеры.
Флориан фон Стош

6

Сейчас это немного устарело, но я начал использовать cloud-init для этого на всех новых серверах. У меня есть сохраненный скрипт cloud-init, который я использую для всех своих серверов. Часть этого содержит:

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

Это активирует службу Docker и запускает ее при первой и каждой загрузке.


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? Docker годами перезапускал политики, и такой подход больше не нужен или не желателен. Это никогда не было желательным, но это был обходной путь для (очень старых версий) отсутствия поддержки Docker для перезапуска самих контейнеров. Думаю, давно прошло время, чтобы перестать использовать CoreOS
Майкл Хэмптон

@MichaelHampton Политики перезапуска также применяются в случае сбоя контейнера по другой причине, поэтому один не заменяет другой. Кроме того, политики перезапуска не позволяют обновлять контейнеры при загрузке и т. Д. Я понятия не имею, что лучше, но я полагаю, что этот метод дает вам немного больше контроля.
Neograph734

1
Когда вы начинаете нуждаться в таком большом контроле, вам, как правило, также нужно много других битов, предоставляемых сервисами оркестровки: на простом конце docker-compose, вплоть до Kubernetes.
Майкл Хэмптон

1

Я использую Docker Swarm, поэтому у меня нет специального приложения, за которое Systemd будет отвечать ... Мне просто нужен Docker для запуска при загрузке. Это решение, которое я разработал.

Поместите это /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, запускает сокет и запускает саму службу docker.

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


Был такой же сценарий использования gitlab-runner на рое. Это определенно разбудит демона. Вы можете добавить системную
вставку в
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.