繁体   English   中英

没有 -v /var/run/docker.sock:/var/run/docker.sock 无法连接到 Docker 守护进程

[英]Cannot connect to the Docker daemon without -v /var/run/docker.sock:/var/run/docker.sock

我正在尝试在 docker 容器内运行 docker 并且容器具有 nodeJs 应用程序。

这是我的Dockerfile

FROM docker:dind   
WORKDIR /app  
RUN apk add --update nodejs nodejs-npm  
COPY . /app  
RUN npm install  
CMD node app.js  
EXPOSE 4000

我使用上面的 Dockerfile 构建了 docker 映像(newdockerimage)并使用docker run -d --privileged -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/docker:/var/lib/docker newdockerimage

我能够在容器内安装 docker 但主机系统上的所有 docker 图像也由于体积( /var/run/docker.sock )而在容器内共享

如果我在运行容器时不使用 volume -v /var/run/docker.sock:/var/run/docker.sock ,则会出现以下错误:- Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? 因为容器将是节点应用程序(因为那是入口点),所以覆盖 docker:dind 入口点

请帮我 ! 如何在不共享卷的情况下在容器内运行 docker(不复制主机系统的 docker 映像)

当您通过node app.js覆盖 Docker-dind 的默认CMD时,它将不会启动 Docker 服务。 所以结果你会得到

Cannot connect to the Docker daemon

因为 docker 没有在您的容器中运行。

所以解决方法是在后台启动 docker 并在前台启动您的节点应用程序。

FROM docker:dind   
WORKDIR /app  
RUN apk add --update nodejs nodejs-npm  
COPY app.js /app  
RUN npm install express
CMD nohup dockerd &> output & sleep 1 && node app.js  
EXPOSE 4000

构建图像并启动容器

docker run -it --privileged --name test --rm my-docker-dind

在此处输入图像描述

在 Docker 容器内运行 Docker 在技术上是可行的,但通常不推荐。 docker映像的 Docker 集线器描述有很多文档,通读它很重要。 除非绝对必要,否则我通常也不认为从容器内部访问 Docker 套接字是最佳实践,并且作为一般规则,您不应该尝试在单个图像中运行两个程序。 我强烈考虑对您的更高级别问题采取其他方法:这既不是标准也不是简单的设置。

有两种方法可以访问 DinD 套接字。 它通过 TCP-over-TLS 在端口 2376 上发布它,或者如果您在嵌套的 Docker 内运行容器,则用于绑定挂载的“主机系统”是 DinD 容器。

(But wait: isn't network HTTP access to the Docker socket a security disaster? There are two mitigations here: since it's inside the host Docker, there's a layer of NAT/firewall and you can't access that nested Docker socket unless you发布它;虽然您可以使用它来获得不受限制的 root 访问权限,但它仅适用于嵌套的 DinD 容器及其内容。)

您应该做的第一件事是将 Dockerfile 重写为标准节点映像。 它不应扩展docker映像,因为它不是 Docker 映像,而是节点应用程序映像。

FROM node:12
WORKDIR /app
COPY . .
RUN npm install
CMD node app.js
EXPOSE 4000

启动 DinD,作为一个单独的容器:

mkdir certs
docker network create myapp
docker run \
  --privileged \
  --net myapp \
  --name docker
  -e DOCKER_TLS_CERTDIR=/certs \
  -v $PWD/certs:/certs \
  -d \
  docker:dind

现在您可以在主机 Docker 上启动一个容器,并给它一个指向嵌套 Docker 的指针

docker build -t myapp .
docker run
  --net myapp \
  --name myapp \
  -e DOCKER_HOST=tcp://docker:2376 \
  -e DOCKER_TLS_VERIFY=1 \
  -e DOCKER_CERT_PATH=/certs \
  -v $PWD/certs/client:/certs \
  myapp

或者,您可以在 DinD 设置中运行此容器。

# Add to the `docker run ... docker:dind` startup
# -p 127.0.0.1:22376:2376
export DOCKER_HOST=tcp://localhost:22376
export DOCKER_TLS_VERIFY=1
export DOCKER_CERT_PATH=$PWD/certs/client

# These run inside the DinD Docker
docker build -t myapp .
docker network create myapp-dind
docker run
  --net myapp-dind \
  --name myapp \
  -v /var/run/docker.sock:/var/run/docker.sock \
  myapp

# Return to the host Docker
unset DOCKER_HOST DOCKER_TLS_VERIFY DOCKER_CERT_PATH

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM