【问题标题】:How to start Docker for Mac daemon on boot?如何在启动时启动 Docker for Mac 守护程序?
【发布时间】:2019-12-04 08:50:59
【问题描述】:

我想让 Docker for Mac 在启动时启动,而不是在登录时启动。我该怎么做呢?我想创建一个 LaunchDaemon,只是不知道该启动什么程序。

我看到的所有示例似乎都使用 docker-machine 来定义 VM,但文档现在说,如果您想使用安装 Docker 时创建的默认 VM,那么 docker-machine 现在不是可行的方法,因为Docker for Mac 不使用 docker-machine 来创建 VM。

原因是我想启动 Docker 以在启动时运行 Jenkins 和 Nexus 容器,因为服务器将用作 CI 服务器。 Docker GUI 具有在登录时启动的首选项,这与启动时不同。

我正在运行 OSX Sierra。

【问题讨论】:

  • 嗨,我面临着完全相同的需求(无需登录即可在启动时运行 Jenkins)和同样的问题,你有没有想出在不创建 docker 机器的情况下做到这一点的任何方法?谢谢!

标签: macos docker macos-sierra


【解决方案1】:

TL;DR不支持将 Docker for Mac 作为独立服务运行

改为在 VirtualBox VM 中运行 Docker,方法是创建普通 VM 或使用 docker-machineThen set the Virtualbox VM up to run at boot

尝试使用 Docker for Mac 进行设置

Docker for Mac 应用程序创建一个启动服务:

○→ launchctl list | grep -i docker
-   0   com.docker.helper
78105   0   com.docker.docker.52512

该服务有以下详细信息:

○→ launchctl list com.docker.docker.52512
{
    "LimitLoadToSessionType" = "Aqua";
    "Label" = "com.docker.docker.52512";
    "TimeOut" = 30;
    "OnDemand" = true;
    "LastExitStatus" = 0;
    "PID" = 78105;
    "Program" = "/Applications/Docker.app/Contents/MacOS/Docker";
    "ProgramArguments" = (
        "/Applications/Docker.app/Contents/MacOS/Docker";
    );
    "PerJobMachServices" = {
        "com.apple.tsm.portname" = mach-port-object;
        "com.apple.CFPasteboardClient" = mach-port-object;
        "com.apple.coredrag" = mach-port-object;
        "com.apple.axserver" = mach-port-object;
    };
};

并且有如下进程树:

○→ pstree -p 78105
-+= 00001 root /sbin/launchd
 \-+= 78105 matt /Applications/Docker.app/Contents/MacOS/Docker
   \-+= 78118 matt /Applications/Docker.app/Contents/MacOS/com.docker.osx.hyperkit.linux -watchdog fd:0 -max-restarts 5 -restart-seconds 30
     |--- 78119 matt /Applications/Docker.app/Contents/MacOS/com.docker.osx.hyperkit.linux -watchdog fd:0 -max-restarts 5 -restart-seconds 30
     |--= 78120 matt com.docker.db --url fd://3 --git /Users/matt/Library/Containers/com.docker.docker/Data/database
     |--= 78121 matt com.docker.osxfs --address fd:3 --connect /Users/matt/Library/Containers/com.docker.docker/Data/@connect --control fd:4 --volume-control
     |--= 78122 matt com.docker.slirp --db /Users/matt/Library/Containers/com.docker.docker/Data/s40 --ethernet fd:3 --port fd:4 --introspection fd:5 --diagn
     |-+= 78123 matt com.docker.osx.hyperkit.linux
     | \--- 78125 matt /Applications/Docker.app/Contents/MacOS/com.docker.osx.hyperkit.linux
     \-+= 78124 matt com.docker.driver.amd64-linux -db /Users/matt/Library/Containers/com.docker.docker/Data/s40 -osxfs-volume /Users/matt/Library/Containers
       |--- 78126 matt /Applications/Docker.app/Contents/MacOS/com.docker.driver.amd64-linux -db /Users/matt/Library/Containers/com.docker.docker/Data/s40 -o
       \--- 78130 matt /Applications/Docker.app/Contents/MacOS/com.docker.hyperkit -A -m 2048M -c 3 -u -s 0:0,hostbridge -s 31,lpc -s 2:0,virtio-vpnkit,uuid=

第一个问题是/Applications/Docker.app/Contents/MacOS/Docker 是位于托盘而不是 VM 中的 GUI 应用程序,因此在启动时将很难运行。第一个后代/Applications/Docker.app/Contents/MacOS/com.docker.osx.hyperkit.linux 看起来更像是管理虚拟机的东西,所以我们将从那里开始。

获取hyperkit进程的完整命令

○→ ps -fp 78105
  UID   PID  PPID   C STIME   TTY           TIME CMD
  501 78105 82644   0  2:08am ??         0:00.03 /Applications/Docker.app/Contents/MacOS/com.docker.osx.hyperkit.linux -watchdog fd:0 -max-restarts 5 -restart-seconds 30

获取进程的工作目录

○→ sudo lsof -p 78105 | grep cwd
com.docke 78105 matt  cwd      DIR                1,4       748 63186601 /Users/matt/Library/Containers/com.docker.docker/Data

创建一个包含详细信息的launchd plist 文件/Library/LaunchDaemons/com.you.docker.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
    <string>com.you.docker</string>
  <key>ProgramArguments</key>
    <array>
      <string>/Applications/Docker.app/Contents/MacOS/com.docker.osx.hyperkit.linux</string>
      <string>-watchdog</string>
      <string>fd:0</string>
      <string>-max-restarts</string>
      <string>5</string>
      <string>-restart-seconds</string>
      <string>30</string>
    </array>
  <key>UserName</key>
    <string>youruser</string>
  <key>WorkingDirectory</key>
    <string>/Users/youruser/Library/Containers/com.docker.docker/Data</string>
  <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

你可以加载哪些

sudo launchctl load -w /Library/LaunchDaemons/com.you.docker.plist

然后……什么都没有。检查日志

○→ tail /var/log/system.log
Mar  7 02:23:26 mac Docker[87728]: Acquired task manager lock
Mar  7 02:23:26 mac Docker[87728]: Maximum number of file descriptors is 10240
Mar  7 02:23:26 mac Docker[87728]: Failed to read watchdog handshake
Mar  7 02:23:26 mac com.apple.xpc.launchd[1] (com.you.docker[87728]): Service exited with abnormal code: 1

您会注意到我们正在运行的命令指定了一个选项 -watchdog fd:0,它将是 hyperkit 进程的 stdin,因此可能缺少一些东西。

如果我再次正常运行 Docker 并查看运行时 hyperkit 进程的 FD 0 是什么

○→ sudo lsof -p 88360
COMMAND     PID USER   FD     TYPE             DEVICE  SIZE/OFF     NODE NAME
com.docke 88360 matt    0     PIPE 0xff80ce577ca2ed91     16384          ->0xff80ce5776aa8d51

然后查看整个系统中的PIPE 0xff80ce577ca2ed91,您会看到主 Docker 进程为许多进程打开了管道。

○→ sudo lsof | grep 0xff80ce577ca2ed91
COMMAND     PID             USER   FD      TYPE             DEVICE    SIZE/OFF     NODE NAME
Docker    88349             matt   13      PIPE 0xff80ce5776aa8d51       16384          ->0xff80ce577ca2ed91
com.docke 88360             matt    0      PIPE 0xff80ce577ca2ed91       16384          ->0xff80ce5776aa8d51
com.docke 88362             matt    0      PIPE 0xff80ce577ca2ed91       16384          ->0xff80ce5776aa8d51
com.docke 88363             matt    0      PIPE 0xff80ce577ca2ed91       16384          ->0xff80ce5776aa8d51
com.docke 88364             matt    0      PIPE 0xff80ce577ca2ed91       16384          ->0xff80ce5776aa8d51
com.docke 88365             matt    0      PIPE 0xff80ce577ca2ed91       16384          ->0xff80ce5776aa8d51
com.docke 88366             matt    0      PIPE 0xff80ce577ca2ed91       16384          ->0xff80ce5776aa8d51

尝试在没有 -watchdog fd:0 选项的情况下再次加载服务会导致相同的错误。

所以看起来主 Docker 应用程序执行了一些运行 VM 所需的设置。我无法找到与watchdog 选项相关的任何源代码,因此不确定它的预期。

可能会在https://github.com/docker/for-mac 上提出问题或功能请求,以获取从应用程序独立运行 VM 的详细信息。

【讨论】:

  • 哇,这就是我喜欢 SO 的原因。感谢您的出色回答,您绝对正确,docker-machine 是要走的路。
  • @John 你能把它取消标记为答案吗?我昨天尝试了这个,到教程结束时发现它没有结论。或者,马特您能否更新答案以更清楚地表明这是不可能的?
  • 守护程序模块在单独的项目中进行管理。我在这里创建了一个问题:github.com/moby/moby/issues/40239 请投票。
  • @Isaac 我在第一段添加了一些粗体
猜你喜欢
  • 1970-01-01
  • 2015-03-08
  • 2016-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-26
  • 1970-01-01
  • 2018-12-17
相关资源
最近更新 更多