如何使用 systemd 启动和停止 docker 容器

How to start and stop docker container with systemd

我将留下问题和答案,以帮助任何在配置 docker 和 systemd 时遇到类似问题的人。

我们如何使用 systemd 启动和停止 docker 容器?

  1. 首先我们将创建docker图像

    FROM debian:stretch
    
    RUN apt-get update \
        && apt-get install -y systemd \
        && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
    
    RUN rm -f /lib/systemd/system/multi-user.target.wants/* \
        /etc/systemd/system/*.wants/* \
        /lib/systemd/system/local-fs.target.wants/* \
        /lib/systemd/system/sockets.target.wants/*udev* \
        /lib/systemd/system/sockets.target.wants/*initctl* \
        /lib/systemd/system/sysinit.target.wants/systemd-tmpfiles-setup* \
        /lib/systemd/system/systemd-update-utmp*
    
    # systemd should be started with PID 1
    CMD [ "/lib/systemd/systemd" ]
    
  2. 让我们构建我们的 docker 图像

docker build -t test_image path_to_docker_file

  1. 现在我们可以创建并启动新的容器

docker run --name test_container -it -d --privileged --stop-signal RTMIN+3 test_image

  1. 或者您可以启动现有容器

docker start test_image

  1. 现在您可以附加到 运行 容器来执行一些 bash 命令,例如

docker exec -it test_container bash

  1. 停止容器

docker stop test_container

重要!!!

启动容器时不要指定 ENTRYPOINT 它应该始终是 SYSTEMD,如果你想执行某些操作通过附加到容器来执行

docker exec -it test_container bash (or other any commands)

您无法在 Docker 映像构建期间启动 systemd。

解决方案已针对 Docker 版本 2.0.0.3 在 macOS

上进行了测试