簡體   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