Итак, я новичок в докере и хотел запустить контейнер докера 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
также.