如何将 Docker 容器正确处理为 systemd 服务?

ber*_*rty 4 debian systemd docker debian-stretch

我通过 systemd 单元处理由 docker 容器实现的许多服务(数据库、Web 服务器...)。它可以工作,但是系统需要很长时间才能关闭,显然是在等待 docker 服务关闭。

这是我在 Debian Stretch 下使用 Docker CE 在虚拟机中制作的 systemd 单元的示例:

/lib/systemd/system/mariadb.service

[Unit]
Description=MariaDB
After=docker.service
Requires=docker.service

[Service]
TimeoutStartSec=0
Restart=always
ExecStart=/usr/bin/docker run --rm \
    --name=mariadb \
    -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=root \
    -e MYSQL_DATABASE=test \
    -e MYSQL_USER=user \
    -e MYSQL_PASSWORD=user \
    -v /var/lib/mysql:/var/lib/mysql \
    mariadb:latest
ExecStop=-/usr/bin/docker stop mariadb # See UPDATEs 1 & 2

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

当我使用 systemctl 命令时,服务会在几秒钟内正确启动和停止。但是当我关闭系统时,它显示:

虚拟机截图 1 虚拟机截图 2 虚拟机截图 3

持续时间超过3分钟。如果有许多容器通过 systemd 运行,则可能会更长。

该问题并非特定于 MariaDB。

有没有更好的方法来通过 systemd 处理 docker 容器,避免额外的关机时间?

  • 更新 1:正如 Bennett Hardwick 在评论中建议的那样,我尝试从服务的定义中删除 ExecStop 指令。似乎更好,因为服务在 1 分 30 分而不是 3 分钟后停止。

  • 更新 2:我尝试在 ExecStop 指令(https://docs.docker.com/engine/reference/commandline/stop/)中将选项 -t 添加到 docker stop 命令。它没有效果。

har*_*ymc 5

不再维护的解决方案是 systemd-docker,描述为:

这是 docker run 的包装器,以便您可以在 systemd 下理智地运行 Docker 容器。这个包装器所做的关键是将容器进程从 Docker 设置的 cgroup 移动到服务单元的 cgroup。这处理了许多其他怪癖,因此请通读文档以了解在 systemd 下运行 Docker 的所有含义。

使用这个包装器,你可以通过 systemctl 或 docker CLI 管理容器,一切都应该保持同步。此外,您可以利用 systemd 和 systemd-notify 的所有 cgroup 功能。

让 systemd-docker 与最新的 Linux 版本一起工作的问题在帖子中讨论过 不适用于最近的 systemd 和/或 docker 版本,其中名为 james-cxx 的用户报告成功:

我能够通过以下方式让 systemd-docker 与 Ubuntu 18.04 一起工作:

我的猜测是 docker 默认不为 cgroups 使用 systemd,因为“委托问题仍然存在,systemd 当前不支持 docker 运行的容器所需的 cgroup 功能集”(根据 docker.service 单元文件),我希望 systemd -docker 期望 cgroup 使用 systemd,因此出现open /sys/fs/cgroup/system.slice/docker.service/cgroup.procs: no such file or directory错误。设置--cgroups name=systemd显然会覆盖 docker 默认值,但是,鉴于 docker.service 单元文件中的不祥注释,我不能说这可能有什么副作用。

systemd- docker的替代方案可能是使用 rkt,描述为:

rkt 是为现代生产云原生环境开发的应用程序容器引擎。它具有 Pod 原生方法、可插拔的执行环境和明确定义的表面积,使其成为与其他系统集成的理想选择。

  • https://github.com/DonTseTse/systemd-docker 提供了更最新的 systemd-docker 克隆,https://github.com/DonTseTse/systemd-docker_build-container 提供了构建容器。 (2认同)