【问题标题】:Docker — Cannot connect to the Docker daemon at unix:///var/run/docker.sockDocker — 无法连接到 unix:///var/run/docker.sock 上的 Docker 守护进程
【发布时间】:2018-02-24 03:51:24
【问题描述】:

我在 Ubuntu (Linux uplink 4.13.0-36-generic #40~16.04.1-Ubuntu SMP Fri Feb 16 23:25:58 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux) 中通过 Nix 安装了 Docker 17.12.0-ce,但每次我尝试执行任何 Docker 命令时,它都会一直告诉我:Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

这就是我所做的:

$ nix-env --install --prebuilt-only docker-17.12.0-ce

$ nix-env -q
docker-17.12.0-ce
go-1.9.4
hugo-0.32.2
kotlin-1.2.21
nix-1.11.16
nodejs-8.9.4
openjdk-8u172b02
openjdk-9.0.4-b11

$ docker version
Client:
 Version:   17.12.0-ce
 API version:   1.35
 Go version:    go1.9.4
 Git commit:    486a48d2701493bb65385788a291e36febb44ec1
 Built: Thu Feb 15 13:56:40 2018
 OS/Arch:   linux/amd64
 Experimental:  false
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

$ docker ps -a
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

我阅读了Post-installation steps for Linux(尽管这在某种程度上不应该适用于 Nix 软件包)并继续添加了一个 docker 用户和所有这些东西......但仍然没有。

我知道这个问题有很多答案——我已经尝试了几个“解决方案”......但还没有运气。

【问题讨论】:

  • 重新登录和/或重启
  • @AlexKarshin 确实,我已经做过好几次了。
  • 哦,好吧,我知道在纯 docker 安装和重新记录帮助后我总是有这个
  • 您在使用 NixOS 吗?如果是这样,您可能应该通过 NixOS 模块系统而不是您的用户配置文件 ($ nix-env ...) 安装 docker。
  • dockerd 守护进程是否正在运行?

标签: docker nix nixpkgs


【解决方案1】:

在非 NixOS 发行版上安装软件包时,不会设置服务(例如守护程序)。服务由 NixOS 模块创建,因此它们需要 NixOS。

例如,对于 Docker,守护进程是通过设置 systemd 服务来创建的。来自 NixOS module 的片段如下所示:

  ...
  options.virtualisation.docker = {
    enable =
      mkOption {
        type = types.bool;
        default = false;
        description =
          ''
            This option enables docker, a daemon that manages
            linux containers. Users in the "docker" group can interact with
            the daemon (e.g. to start or stop containers) using the
            <command>docker</command> command line tool.
          '';
};
...

systemd.services.docker = {
        wantedBy = optional cfg.enableOnBoot "multi-user.target";
        environment = proxy_env;
        serviceConfig = {
          ExecStart = [
            ""
            ''
              ${cfg.package}/bin/dockerd \
                --group=docker \
                --host=fd:// \
                --log-driver=${cfg.logDriver} \
                ${optionalString (cfg.storageDriver != null) "--storage-driver=${cfg.storageDriver}"} \
                ${optionalString cfg.liveRestore "--live-restore" } \
                ${cfg.extraOptions}
            ''];
          ExecReload=[
            ""
            "${pkgs.procps}/bin/kill -s HUP $MAINPID"
          ];
};
...

您也许可以在其他发行版上完成等效操作,但您必须手动创建服务和配置文件。

【讨论】:

  • 我正在研究#nixos (IRC),这就是我被告知的。但老实说,该软件包在非 NixOS 发行版上没有任何(或很少)用处。现在,dockerd 不能以 root 身份运行——它只是找不到它。例如,snap 版本的 Docker 配备了运行 Docker 所需的一切(当然,对于那些支持 snappy 的发行版)......这就是预期的方式,IMO。
  • 你是对的。尽管nix 被宣传为 Linux 的包管理器,但没有澄清的是,某些包是专为 NixOS 设计的。我们真的应该澄清这一点。对于它的价值,作为一般规则,应用程序/实用程序可以正常工作,但服务不能,因为它们需要与底层操作系统进行更深入的集成;一个区域nix没有进入。
猜你喜欢
  • 2021-12-06
  • 1970-01-01
  • 2022-07-07
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多