Docker — 无法连接到位于 unix:///var/run/docker.sock 的 Docker 守护程序
Docker — Cannot connect to the Docker daemon at unix:///var/run/docker.sock
我在 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
用户和所有其他东西......但是还是什么都没有。
我知道这个问题有很多答案 — 我已经尝试了几个 "solutions"...但还没有成功。
当您在 non-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"
];
};
...
您也许可以在其他发行版上完成相同的操作,但您必须手动创建服务和配置文件。
我在 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
用户和所有其他东西......但是还是什么都没有。
我知道这个问题有很多答案 — 我已经尝试了几个 "solutions"...但还没有成功。
当您在 non-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"
];
};
...
您也许可以在其他发行版上完成相同的操作,但您必须手动创建服务和配置文件。