Невозможно подключиться к демону Docker без -v /var/run/docker.sock:/var/run/docker.sock - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь запустить 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

Я построил образ docker (newdockerimage), используя приведенный выше Dockerfile, и создаю контейнер, используя docker run -d --privileged -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/docker:/var/lib/docker newdockerimage.

Я могу установить докер внутри контейнера, но все образы докеров, которые находятся в хост-системе, также совместно используют внутри контейнера из-за тома (/var/run/docker.sock) .

Если я не использую том -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 entrypoint

Пожалуйста, помогите мне! Как запустить докер внутри контейнера без совместного использования тома (без копирования образов докера хост-системы)

Ответы [ 2 ]

1 голос
/ 30 октября 2019

Когда вы переопределяете значение по умолчанию CMD Docker-dind на node app.js, оно не запускает службу 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

enter image description here

0 голосов
/ 30 октября 2019

Запуск Docker внутри контейнера Docker технически возможен, но, как правило, не рекомендуется. В описании Docker Hub для docker image имеется много документации, и ее важно прочитать. Я также обычно не считаю лучшим способом получить доступ к сокету Docker из контейнера, если только это абсолютно необходимо, и, как правило, вы не должны пытаться запускать две программы в одном образе. ,Я бы настоятельно рекомендовал воспользоваться другим подходом к вашей проблеме более высокого уровня: это не стандартная и не простая установка.

Есть два способа получить доступ к сокету DinD. Он публикует его через TCP-over-TLS на порту 2376 или, если вы запускаете контейнер во вложенном Docker, «системой хоста» для целей bind mounts является контейнер DinD.

(Но wait: isnсетевой HTTP-доступ к сокету Docker - это катастрофа безопасности? Здесь есть два смягчения: поскольку он находится внутри хоста Docker, существует слой NAT / firewall, и вы не можете получить доступ к этому вложенному сокету Docker, пока не опубликуете его;Вы можете использовать его для получения неограниченного корневого доступа, он только над вложенным контейнером DinD и его содержимым.)

Первое, что вы должны сделать, это переписать ваш Dockerfile в стандартный образ Node. Он не должен расширять образ docker, поскольку это не образ Docker, а образ Node-приложения.

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
...