![](/img/trans.png)
[英]Unable to run docker within the container. Cannot connect to the Docker daemon at unix:///var/run/docker.sock
[英]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.