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, запустите контейнер докера, скопируйте команду и запустите ее в тот момент, когда она запускается без проблем.
Есть идеи, почему это не удается?
ОБНОВИТЬ
Почему при запуске контейнера с systemd logspout по умолчанию принимает значение tcp? Установка gelf+udp://${DOCKER_HOST}:12202 выдает ту же ошибку выше, что упоминает tcp. UDP игнорируется при использовании systemd?
2 ответа
Это кажется странностью в logspout, где он пытается начать использовать TCP, даже если установлен gelf+udp. Запуск вне systemd с запуском docker и docker-compose работают как положено.
У меня нет времени, чтобы выяснить, почему в это время, поэтому я просто позволю docker запустить --restart= Если-остановлено, чтобы управлять контейнером и чтобы скрипт пользовательских данных на сервере EC2 запускал контейнер при загрузке.
Похоже, что служба Docker еще не запущена, запуск контейнера из CLI запустит службу и запустит ваш контейнер.
Прежде чем запускать контейнер вручную, проверьте состояние docker.service
с помощью systemctl status docker.service
, Если он не работает, вам нужно добавить службу systemd для docker.service
также.