我正在使用通过以下方式创建同级Docker容器的第三方库:

docker run -d /var/run/docker.sock:/var/run/docker.sock ...


我试图从上述容器中创建Kubernetes部署,但目前得到: br />

无法通过unix:///var/run/docker.sock连接到Docker守护程序。 docker守护程序是否正在运行?


这是预料之中的,因为我没有在部署yaml中将/var/run/docker.sock声明为卷。

问题是我没有知道该怎么做。是否可以将/var/run/docker.sock作为卷安装在部署Yaml中?

如果没有,从Kubernetes部署/吊舱中运行docker兄弟容器的最佳方法是什么?

#1 楼

无法验证,因为在k8s监督之外启动容器对我来说听起来很脆弱,但是您应该能够使用hostPath卷挂载/var/run/docker.sock。 >
apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: gcr.io/google_containers/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /var/run/docker.sock
      name: docker-sock-volume
  volumes:
  - name: docker-sock-volume
    hostPath:
      # location on host
      path: /var/run/docker.sock
      # this field is optional
      type: File


我认为一个简单的装载应该足以允许从容器内的docker客户端到主机上的docker守护进程的通信,但是如果遇到写入许可错误,则意味着您需要以以下方式运行容器使用这样的securityContext对象的特权容器
(只是从上方提取以显示附加内容,以及从文档中获取的值):

spec:
  containers:
  - image: gcr.io/google_containers/test-webserver
    securityContext:
      privileged: true
    name: test-container


评论


这行得通,谢谢。是的,它是第三方工具,因此并不理想。但是我至少希望Kubernetes中的主要容器使其更可靠。容器使用浏览器增加临时容器以进行自动化UI测试,然后销毁浏览器容器。

–rys
17年11月7日在17:23

@rys是的,这是我想到的一种情况,如果节点负载过高,因为k8s可能会移动您的“启动器”容器,您可能仍然会遇到问题。但是我认为在这种情况下测试套件的失败是可以接受的

–滕西拜
17年11月8日在6:55

#2 楼

尽管这是一个可行的解决方案(我自己使用过),但通过安装/var/run/docker.sock在Kubernetes容器中运行Docker存在一些缺点。

大多数情况下,您正在使用Kubernetes无法控制的Docker容器。 br />
我发现的另一个建议的解决方案是在您的吊舱中使用侧面车厢。请参阅Kubernetes上的Docker-in-Docker案例。提议的解决方案在第2部分中分为两部分。

我希望这会有所帮助。