systemd 和启动 docker 容器

systemd 和启动 docker 容器

我是 docker 新手,想在服务器启动时启动一个 logspout docker 容器,所以我想我只需要放入一个 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

在 DOCKER_HOST ip 由用户数据填充后,重新启动时出现错误:

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 docker 容器,复制命令并在 cli 上运行它,它就会启动,不会出现任何问题。

关于它失败的原因有什么想法吗?

更新

为什么当容器使用 systemd 启动时,logspout 默认为 tcp?设置 gelf+udp://${DOCKER_HOST}:12202 会引发上述提到 tcp 的相同错误。使用 systemd 时 UDP 会被忽略吗?

答案1

看起来 Docker 服务尚未启动,从 CLI 运行容器将启动服务并运行您的容器。

在手动运行容器之前,请docker.service使用检查其状态systemctl status docker.service。如果未运行,您还需要为其添加 systemd 服务docker.service

答案2

这似乎是 logspout 中的一些奇怪之处,即使设置了 gelf+udp,它也会尝试开始使用 TCP。在 systemd 之外使用 docker run 和 docker-compose 启动都可以按预期工作。

我现在没有时间去弄清楚为什么,所以我只会让 docker run --restart=unless-stopped 管理容器并让 EC2 服务器上的用户数据脚本在启动时运行容器。

相关内容