如何将 docker-compose 作为 systemd 服务运行?

如何将 docker-compose 作为 systemd 服务运行?

我发现这个问题,但那个使用 cron - 我想改用 systemd 服务。我docker-compose.yml的是/home/me,我用 运行它sudo docker compose up(并用 让它在后台运行tmux),并用 停止它sudo docker compose down

尽管功能齐全,但我宁愿使用 systemd 服务来启动/停止我的docker-compose.yml文件。

我如何才能将我的docker-compose.yml文件转变为(可以工作的) systemd 服务?

答案1

我假设docker-compose文件位于/home/cocomac/docker-compose.yml,但是你应该在我的示例中将其替换为docker compose文件的路径。

首先,让我们创建我们的服务文件。我喜欢文本编辑器,就我个人而言,但您可以随意使用其他名称。我将调用我的服务docker-compose.service,它将存储在中/etc/systemd/system。如果您愿意,可以随意使用其他名称,但如果您这样做,请记住在遵循此答案的其余部分时使用该名称。

首先,让我们用文本编辑器创建并打开该文件:

$ micro /etc/systemd/system/docker-compose.service

将以下内容放入文件中:

[Unit]
Description=Some personal Docker containers
After=docker.service
Requires=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/bash -c "docker compose -f /home/cocomac/docker-compose.yml up --detach"
ExecStop=/bin/bash -c "docker compose -f /home/cocomac/docker-compose.yml stop"

[Install]
WantedBy=multi-user.target

这为我们的服务提供了描述、启动 + 停止命令,以及启动前需要运行的内容。参见这个 Arch Wiki 页面了解不同的服务类型及其作用RemainAfterExit

保存文件并退出文本编辑器。现在您应该能够sudo systemctl start docker-compose启动新的 systemd 服务。创建容器可能需要一点时间,但启动完成后,您可以sudo systemctl status docker-compose检查服务状态。您还可以sudo systemctl stop docker-compose停止它(或sudo systemctl enable docker-compose在启动时自动启动它)

答案2

对服务节使用以下内容同样有效并且具有以下好处:您可以使用以下方式查看日志journalctl -u docker-compose

[Service]
Type=simple
ExecStart=/bin/bash -c "docker-compose -f /home/cocomac/docker-compose.yml up"
ExecStop=/bin/bash -c "docker-compose -f /home/cocomac/docker-compose.yml stop"

请注意,该docker-compose命令不包含--detach标志,您不需要该RemainAfterExit选项。另请注意,在我测试的 Ubuntu 版本 (20.04) 上,docker-compose这是一个单独的命令。

答案3

您还可以启动systemd用户文件夹中列出的单元文件,并定期运行它们。例如,我有一个每天运行的 certbot 容器,以使我的 ftp 服务器的证书保持最新。

根据答案这里

将您的用户配置文件设置为“linger”,并使用launchctl enable-linger ${USER}

在.eg中创建.service.timer单元文件~/.config/systemd/user

~/.config/systemd/user/certbot-ftp.service

[Unit]
Description=Certbot LetsEncrypt renewal for vsftpd Server
                                                                                                                                                                                                                      
[Service]
Type=oneshot
ExecStart=docker compose -f ~/docker-projects/ftp/compose.yaml restart certbot

[Install]
WantedBy=default.target

~/.config/systemd/user/certbot-ftp.timer

[Unit]
Description=Run Certbot on a daily basis

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

然后,启用该服务和相关计时器,无论您是否登录都会发生这种情况(因为已启用登录延迟):

systemctl --user enable certbot-ftp --now

答案4

如果你使用restart: always在您的 docker compose 文件中(这是相当典型的),那么 docker 守护进程将在守护进程本身启动时自动重新启动容器 - 这意味着您不需要使用 systemd 来让它一直自动运行。

如果您对 Compose 文件进行更改或提取更新,您仍需要重新运行docker-compose;这不会自动发生。但这不需要 systemd 文件。

相关内容