Назад | Перейти на главную страницу

systemd и запуск docker-контейнеров

Итак, я новичок в докере и хотел запустить контейнер докера logspout при запуске сервера, поэтому я подумал, что просто добавлю файл запуска systemd:

[Unit]
Description=Logspout GELF Container
After=docker.service
Requires=docker.service

[Service]
TimeoutStartSec=0
Restart=always
ExecStartPre=-/usr/bin/docker stop logspout-gelf
ExecStartPre=-/usr/bin/docker rm logspout-gelf
ExecStart=/usr/bin/docker run --name=logspout-gelf \
  -h $(hostname -f) \
  -v /var/run/docker.sock:/var/run/docker.sock \
  123456789.dkr.ecr.${region}.amazonaws.com/logspout-gelf:latest \
  gelf://${DOCKER_HOST}:12202

[Install]
WantedBy=multi-user.target

В служебном файле также есть файл конфигурации, который изменяется сценарием пользовательских данных при загрузке:

# Ansible
[Service]
Environment=DOCKER_HOST=10.100.10.1

Я получаю сообщение об ошибке при перезапуске после того, как IP-адрес DOCKER_HOST заполняется пользовательскими данными:

systemd[1]: Starting Logspout GELF Container...
Cannot connect to the Docker daemon at tcp://10.100.10.1:2375. Is the docker daemon running?
Cannot connect to the Docker daemon at tcp://10.100.10.1:2375. Is the docker daemon running?

Это повторяется полдюжины раз, а затем терпит неудачу. Если я затем установлю DOCKER_HOST, rm контейнер докера, скопируйте команду и запустите ее на клиенте, который запускается без каких-либо проблем.

Есть идеи относительно того, почему это не удается?

ОБНОВИТЬ

Почему, когда контейнер запускается с помощью systemd, по умолчанию для logspout используется tcp? Установка gelf + udp: // $ {DOCKER_HOST}: 12202 вызывает ту же ошибку, что и упоминание tcp. Игнорируется ли UDP при использовании systemd?

Кажется, это какая-то странность в logspout, где он пытается начать использовать TCP, даже если установлен gelf + udp. Запуск за пределами systemd с docker run и docker-compose работает должным образом.

У меня нет времени выяснять, почему в данный момент, поэтому я просто позволю docker run --restart = if-stop управлять контейнером, а сценарий пользовательских данных на сервере EC2 запускает контейнер при загрузке.

Похоже, что служба докеров не запущена, запуск контейнера из интерфейса командной строки запустит службу и запустит ваш контейнер.

Перед запуском контейнера вручную проверьте статус docker.service с помощью systemctl status docker.service. Если он не работает, вам нужно добавить службу systemd для docker.service также.