3

由于 K8S v1.11 运行时已从 dockerd 更改为 containerd。我在 kubernetes 上使用 Jenkins 来使用 Docker 之外的 Docker 构建 docker 映像(dood)。

当我尝试使用常规 docker 客户端切换到使用来自 conatinerd 的套接字文件(containerd/containerd.sock 映射广告 /var/run/docker.sock)时,出现以下错误Get http://%2Fvar%2Frun%2Fdocker.sock/v1.39/containers/json: net/http: HTTP/1.x transport connection broken: malformed HTTP response "\x00\x00\x00\x04\x00\x00\x00\x00\x00".

docker客户端可以和containerd一起使用吗?

4

2 回答 2

3

免责声明:在撰写本文时,containerd 并未取代 Docker,您可以将 containerd与 Docker 分开安装,并且您可以将Kubernetes CRI指向直接与 containerd 套接字对话。

因此,当您安装 Docker 时,它会与 containerd 一起安装,并且Docker 守护进程会与之对话。你会看到这样的过程:

docker-containerd --config /var/run/docker/containerd/containerd.toml

但是,Docker 客户端仍然与 Docker 守护进程通信,这就是为什么当您在容器中运行 Docker 客户端时,您仍然需要直接与 Docker 守护进程 ( /var/run/docker.sock) 通信,因此您可以切换回/var/run/docker.sock并且我相信它应该可以工作。

于 2018-11-22T17:39:47.797 回答
0

至少对于 Ubuntu 20.04 上的MicroK8s 1.18,我发现解决这个问题的方法是在 Kubernetes 旁边显式安装 Docker。

类似的步骤应该适用于不包含 Docker 的其他 Kubernetes 发行版。

安装后microk8s,您可以执行以下操作来安装 Docker:

# Shut down microk8s
sudo snap disable microk8s

# Assuming no Docker installed yet - this fixes the case  
# where Kubernetes results in this path being a directory 
rm -rf /var/run/docker.sock

sudo apt-get install docker.io

ls -l /var/run/docker.sock
# Output should show socket not directory:
#    srw-rw---- 1 root docker 0 Aug  6 11:50 /var/run/docker.sock

# (See https://docs.docker.com/engine/install/linux-postinstall/ for usermod + newgrp commands at this point) 

# Restart microk8s 
sudo snap enable microk8s

其他 Kubernetes 发行版可能有不同的方式来更有选择性地关闭进程。

journalctl -xe 在此处查看来自 Docker 或 Kubernetes 的任何错误很有用。

在 Kubernetes 清单中,请务必/var/run/docker.sock在挂载 docker.sock 时用作主机路径。

相关问题:

Linux 上 Docker 的安装后步骤

于 2020-08-06T12:12:28.110 回答