Запуск 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