无法连接到位于unix:///var/run/docker.sock的Docker守护程序。Docker守护程序是否正在运行?Dockerfile内部。

16

我有以下的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

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

无法连接到unix:///var/run/docker.sock处的Docker守护程序。 Docker守护程序正在运行吗?

service docker startsystemctl这样的命令无效。


打开 cmd 并运行 docker version。客户端和服务器都显示了吗?还是出现了错误? - dfundako
是的,相同:18.06.0-ce - abadraja
你是怎么解决这个问题的?我也有在容器内运行 Docker 的需求。请告诉我你采用了什么设计来解决这个问题。 - megh
8个回答

15

试试这个命令:

sudo service docker restart

13

1. 检查 docker.service

sudo systemctl status docker

输出结果大致如下:

● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
  Drop-In: /lib/systemd/system/docker.service.d
           └─http-proxy.conf
   Active: active (running) since Sat 2021-12-04 19:11:03 +0330; 2min 59s ago
     Docs: https://docs.docker.com
 Main PID: 28223 (dockerd)
    Tasks: 29
   CGroup: /system.slice/docker.service
           └─28223 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Dec 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}"
Dec 04 19:11:03 elitedesk dockerd[28223]: time="2021-12-04T19:11:03.813277123+03:30" level=info msg="Daemon has completed initialization"
Dec 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 "
Dec 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"
Dec 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"
Dec 04 19:11:03 elitedesk systemd[1]: Started Docker Application Container Engine.
Dec 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"
Dec 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"
Dec 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"
Dec 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"

如果出现错误,请重新启动它:
sudo systemctl restart docker

然后再次检查status。如果没有解决问题,接下来执行以下步骤:

2. 请求与守护程序套接字的连接,查看其是否已启动:

curl --unix-socket /var/run/docker.sock  http://localhost/_ping; echo

输出只是一个OK消息。

OK

如果收到的不是 OK,而是类似于以下内容:

curl: (7) Couldn't connect to server

3. 检查套接字服务

sudo systemctl status docker.socket

一个良好的输出将是:

● docker.socket - Docker Socket for the API
   Loaded: loaded (/lib/systemd/system/docker.socket; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2021-12-04 19:10:57 +0330; 6min ago
   Listen: /var/run/docker.sock (Stream)
    Tasks: 0 (limit: 4915)
   CGroup: /system.slice/docker.socket

Dec 04 19:10:57 elitedesk systemd[1]: Starting Docker Socket for the API.
Dec 04 19:10:57 elitedesk systemd[1]: Listening on Docker Socket for the API.

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

sudo systemctl restart docker.socket

你之前没有能够修复它吗?接下来:

4. 直接以调试模式运行后台进程

sudo dockerd -D -l debug

1
sudo systemctl restart docker.socket 在我的 Ubuntu 22 上救了我一命。谢谢!!! - alljinx
sudo systemctl restart docker.socket 也解决了我的问题,但是这个问题一直会出现,我的解决方案总是重新启动服务器并再次启动所有容器,有什么想法为什么会这样发生? - Arbaaz Ali

12
你不能在Docker容器或镜像中运行Docker。你不能在Dockerfile中启动后台服务。就像你所说的,systemctlservice等命令无法在Docker中使用。而且,在任何情况下,您都不能使用任何主机系统资源,包括主机的Docker套接字,在Dockerfile的任何地方。
您需要重新设计此Dockerfile,使其仅安装软件并不尝试启动它。理想情况下,一个容器应该只启动单个服务器,并将其作为CMD在前台运行;否则,您可能会依赖supervisord之类的东西来拥有多个服务器。如果您的应用程序严重依赖于能够在Docker中启动事物,您可能会发现在虚拟机中安装更容易。
(*) 从技术上讲,有各种方法可以做到这些事情,但它们都很棘手和复杂,并且具有一些影响(最多可能使您的容器对主机具有无限制的root访问权限,并且您的容器启动时主动重新配置一些低级主机细节)。

8

3

我曾经遇到过同样的问题,你可以在终端中运行以下命令来解决这个问题。

 sudo apt-get install docker-ce docker-ce-cli containerd.io

2

可能您登录docker引擎的用户没有正确的权限。您可以使用以下命令将该用户添加到docker组:

sudo usermod -a -G docker $USER

$USER 是当前登录用户的用户名。


谢谢,请不要忘记注销并重新登录以刷新组成员身份。请注意安全影响:https://wiki.archlinux.org/title/Docker#Installation - mateuszb

2

错误可能来自于"service docker start"。如果您想按照上游供应商的安装说明安装Docker容器,则需要为此准备环境。我可以使用dockers-systemctl-replacement脚本轻松运行这些命令。


0
如果您使用deb文件安装Docker,则可能没有安装Docker CLI。因此,在安装Docker后,请安装Docker CLI,参考@Jayanth的回答。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接