没有 -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 图像(新的docker图像)并使用 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
)。
如果我在 运行ning 容器时不使用卷 -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?
因为容器将是节点应用程序(因为它是入口点),所以覆盖 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 Hub description for the docker
image 有很多文档,通读它很重要。我通常也不认为从容器内部访问 Docker 套接字是最佳做法,除非它 绝对 必要,并且作为一般规则,你不应该尝试运行 单个图像中的两个程序。我会强烈考虑采用其他方法来解决您的更高级别的问题:这既不是标准设置也不是直接设置。
有两种方法可以访问DinD socket。它通过端口 2376 上的 TCP-over-TLS 发布它,或者如果您 运行 嵌套 Docker 内的容器,"the host system" 用于绑定安装的容器是 DinD 容器。
(等等:对 Docker 套接字的网络 HTTP 访问不是安全灾难吗?这里有两个缓解措施:因为它在主机 Docker 内部,所以有一层 NAT/firewall 并且您无法访问嵌套的 Docker 套接字,除非您发布它;虽然您可以使用它来获得不受限制的 root 访问权限,但它只能访问嵌套的 DinD 容器及其内容。)
您应该做的第一件事是将您的 Docker 文件重写为标准节点映像。它不应扩展 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
我正在尝试 运行 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 图像(新的docker图像)并使用 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
)。
如果我在 运行ning 容器时不使用卷 -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?
因为容器将是节点应用程序(因为它是入口点),所以覆盖 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 Hub description for the docker
image 有很多文档,通读它很重要。我通常也不认为从容器内部访问 Docker 套接字是最佳做法,除非它 绝对 必要,并且作为一般规则,你不应该尝试运行 单个图像中的两个程序。我会强烈考虑采用其他方法来解决您的更高级别的问题:这既不是标准设置也不是直接设置。
有两种方法可以访问DinD socket。它通过端口 2376 上的 TCP-over-TLS 发布它,或者如果您 运行 嵌套 Docker 内的容器,"the host system" 用于绑定安装的容器是 DinD 容器。
(等等:对 Docker 套接字的网络 HTTP 访问不是安全灾难吗?这里有两个缓解措施:因为它在主机 Docker 内部,所以有一层 NAT/firewall 并且您无法访问嵌套的 Docker 套接字,除非您发布它;虽然您可以使用它来获得不受限制的 root 访问权限,但它只能访问嵌套的 DinD 容器及其内容。)
您应该做的第一件事是将您的 Docker 文件重写为标准节点映像。它不应扩展 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