无法连接到 unix:///var/run/docker.sock 上的 Docker 守护进程。docker 守护进程是否正在运行?在 Dockerfile 中

aba*_*aja 7 docker dockerfile hyperledger hyperledger-fabric hyperledger-composer

我有以下 Dockerfile:

FROM ubuntu

ENV NPM_CONFIG_LOGLEVEL warn
ENV admin_user="PeerAdmin" network_name=$1 version=$2 hversion=hlfv1     fabrik_path=/fabric-tools project_dir=$(pwd) 
ENV card_store_dir=$project_dir/.card-store stage_dir=$project_dir/.stage     env_dir=$project_dir/env is_ok=1 FABRIC_VERSION=hlfv1 

WORKDIR /app
COPY . /app

USER root
# RUN chown -R ubuntu:ubuntu .
WORKDIR /app
RUN apt-get update && \
    mkdir "$fabrik_path" && \
    cd "$fabrik_path" && \
    export FABRIC_VERSION=hlfv1 && \
    apt-get -y install apt-transport-https ca-certificates curl software-properties-common && \
    apt-get -y install curl && \
    apt-get -y install unzip && \
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - && \
    apt-get -y install docker.io && \
    curl -O https://raw.githubusercontent.com/hyperledger/composer-tools/master/packages/fabric-dev-servers/fabric-dev-servers.zip && \
    unzip fabric-dev-servers.zip && \
    service docker start && \
    ./downloadFabric.sh && \
    ./startFabric.sh
Run Code Online (Sandbox Code Playgroud)

尝试执行它,我收到一个错误:

**Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?**

service docker start或 systemctl 之类的命令不起作用。

Sha*_*iri 16

1. 检查docker.service

\n
sudo systemctl status docker\n
Run Code Online (Sandbox Code Playgroud)\n

输出是这样的:

\n
\xe2\x97\x8f docker.service - Docker Application Container Engine\n   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)\n  Drop-In: /lib/systemd/system/docker.service.d\n           \xe2\x94\x94\xe2\x94\x80http-proxy.conf\n   Active: active (running) since Sat 2021-12-04 19:11:03 +0330; 2min 59s ago\n     Docs: https://docs.docker.com\n Main PID: 28223 (dockerd)\n    Tasks: 29\n   CGroup: /system.slice/docker.service\n           \xe2\x94\x94\xe2\x94\x8028223 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock\n\nDec 04 19:11:03 elitedesk dockerd[28223]: time="2021-12-04T19:11:03.813464635+03:30" level=info msg="New memberlist node - Node:elitedesk will use memberlist nodeID:57d6b077dc1b with config:&{NodeID:57d6b077dc1b Hostname:elitedesk BindAddr:0.0.0.0 AdvertiseAddr:192.168.1.45 BindPort:0 Keys:[[214 188 67 83 106 206 215 54 212 222 237 172 208 101 235 219] [232 26 246 100 135 196 113 220 147 95 50 132 140 206 7 126] [236 55 254 140 107 62 111 184 64 103 33 77 246 154 26 50]] PacketBufferSize:1400 reapEntryInterval:1800000000000 reapNetworkInterval:1825000000000 StatsPrintPeriod:5m0s HealthPrintPeriod:1m0s}"\nDec 04 19:11:03 elitedesk dockerd[28223]: time="2021-12-04T19:11:03.813277123+03:30" level=info msg="Daemon has completed initialization"\nDec 04 19:11:03 elitedesk dockerd[28223]: time="2021-12-04T19:11:03.813269814+03:30" level=info msg="initialized VXLAN UDP port to 4789 "\nDec 04 19:11:03 elitedesk dockerd[28223]: time="2021-12-04T19:11:03.814239176+03:30" level=info msg="Node 57d6b077dc1b/192.168.1.45, joined gossip cluster"\nDec 04 19:11:03 elitedesk dockerd[28223]: time="2021-12-04T19:11:03.814424565+03:30" level=info msg="Node 57d6b077dc1b/192.168.1.45, added to nodes list"\nDec 04 19:11:03 elitedesk systemd[1]: Started Docker Application Container Engine.\nDec 04 19:11:03 elitedesk dockerd[28223]: time="2021-12-04T19:11:03.891119330+03:30" level=info msg="API listen on /var/run/docker.sock"\nDec 04 19:11:03 elitedesk dockerd[28223]: time="2021-12-04T19:11:03.964000220+03:30" level=error msg="error reading the kernel parameter net.ipv4.vs.conn_reuse_mode" error="open /proc/sys/net/ipv4/vs/conn_reuse_mode: no such file or directory"\nDec 04 19:11:03 elitedesk dockerd[28223]: time="2021-12-04T19:11:03.964029536+03:30" level=error msg="error reading the kernel parameter net.ipv4.vs.expire_nodest_conn" error="open /proc/sys/net/ipv4/vs/expire_nodest_conn: no such file or directory"\nDec 04 19:11:03 elitedesk dockerd[28223]: time="2021-12-04T19:11:03.964042003+03:30" level=error msg="error reading the kernel parameter net.ipv4.vs.expire_quiescent_template" error="open /proc/sys/net/ipv4/vs/expire_quiescent_template: no such file or directory"\n
Run Code Online (Sandbox Code Playgroud)\n

如果似乎有错误,请重新启动它:

\n
sudo systemctl restart docker\n
Run Code Online (Sandbox Code Playgroud)\n

并再次检查status。如果没有解决,下一步

\n

2. 向守护进程的socket请求,看看是否up:

\n
curl --unix-socket /var/run/docker.sock  http://localhost/_ping; echo\n
Run Code Online (Sandbox Code Playgroud)\n

输出只是OK消息

\n
OK\n
Run Code Online (Sandbox Code Playgroud)\n

如果没有得到OK并得到这样的东西:

\n
curl: (7) Couldn't connect to server\n
Run Code Online (Sandbox Code Playgroud)\n

3.检查socket服务

\n
sudo systemctl status docker.socket\n
Run Code Online (Sandbox Code Playgroud)\n

一个好的输出将是:

\n
\xe2\x97\x8f docker.socket - Docker Socket for the API\n   Loaded: loaded (/lib/systemd/system/docker.socket; enabled; vendor preset: enabled)\n   Active: active (running) since Sat 2021-12-04 19:10:57 +0330; 6min ago\n   Listen: /var/run/docker.sock (Stream)\n    Tasks: 0 (limit: 4915)\n   CGroup: /system.slice/docker.socket\n\nDec 04 19:10:57 elitedesk systemd[1]: Starting Docker Socket for the API.\nDec 04 19:10:57 elitedesk systemd[1]: Listening on Docker Socket for the API.\n
Run Code Online (Sandbox Code Playgroud)\n

重新启动它,即使它看起来不错。因为停止守护进程并再次启动它后,它不起作用,我们应该(据我所知)重新启动docker.socket

\n
sudo systemctl restart docker.socket\n
Run Code Online (Sandbox Code Playgroud)\n

但你却无法修复它?下一个:

\n

debug4.直接在mode下运行守护进程

\n
sudo dockerd -D -l debug\n
Run Code Online (Sandbox Code Playgroud)\n


小智 8

试试这个命令:

sudo service docker restart
Run Code Online (Sandbox Code Playgroud)


小智 8

启动终端并执行以下命令:

$ sudo service --status-all

$ sudo service docker start

https://appuals.com/cannot-connect-to-the-docker-daemon-at-unix-var-run-docker-sock/ 解决方案 4:使用 Service 命令启动 Docker


Dav*_*aze 7

您不能 (*) 在 Docker 容器或图像中运行 Docker。您不能 (*) 在 Dockerfile 中启动后台服务。正如您所说,命令 likesystemctlservicedon't (*) 在 Docker 中的任何地方都有效。在任何情况下,您都不能从 Dockerfile 的任何位置使用任何主机系统资源,包括主机的 Docker 套接字。

您需要重新设计这个 Dockerfile,以便它只安装软件而不尝试启动它。理想情况下,一个容器只启动一个服务器,并在前台作为它的 CMD 运行它;否则,如果必须的话,您可能会依赖诸如supervisord 之类的东西来拥有多个服务器。如果您的应用程序严重依赖于能够在 Docker 中启动,您可能会发现在虚拟机中安装要容易得多。

(*) 从技术上讲,有办法完成所有这些事情,但它们都是棘手和复杂的,并且具有影响(可能会为您的容器提供对主机的不受限制的 root 访问权限,并且您的容器启动会主动重新配置一些低级主机细节)。